安裝prometheus
作者聲明:本博客內容是作者在學習以及搭建過程中積累的內容,內容采自網絡中各位老師的優秀博客以及視頻,並根據作者本人的理解加以修改(由於工作以及學習中東拼西湊,如何造成無法提供原鏈接,在此抱歉!!!)
作者再次聲明:作者只是一個很摳腳的IT工作者,希望可以跟那些提供原創的老師們學習
prometheus采用nfs掛載方式來存儲數據,同時使用configMap管理配置文件。並且我們將所有的prometheus存儲在kube-system
1.prometheus的configmap配置文件
#建議將所有的prometheus yaml文件存在一塊
mkdir /opt/prometheus -p && cd /opt/prometheus
cat >> prometheus.configmap.yaml <<EOF
apiVersion: v1
kind: ConfigMap
metadata:
name: prometheus-config
namespace: kube-system
data:
prometheus.yml: |
global:
scrape_interval: 15s
scrape_timeout: 15s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
EOF
# 配置文件解釋(這里的configmap實際上就是prometheus的配置)
上面包含了3個模塊global、rule_files和scrape_configs
其中global模塊控制Prometheus Server的全局配置
scrape_interval:表示prometheus抓取指標數據的頻率,默認是15s,我們可以覆蓋這個值
evaluation_interval:用來控制評估規則的頻率,prometheus使用規則產生新的時間序列數據或者產生警報
rule_files模塊制定了規則所在的位置,prometheus可以根據這個配置加載規則,用於生產新的時間序列數據或者報警信息,當前我們沒有配置任何規則,后期會添加
scrape_configs用於控制prometheus監控哪些資源。由於prometheus通過http的方式來暴露它本身的監控數據,prometheus也能夠監控本身的健康情況。在默認的配置有一個單獨的job,叫做prometheus,它采集prometheus服務本身的時間序列數據。這個job包含了一個單獨的、靜態配置的目標;監聽localhost上的9090端口。
prometheus默認會通過目標的/metrics路徑采集metrics。所以,默認的job通過URL:http://localhost:9090/metrics采集metrics。收集到時間序列包含prometheus服務本身的狀態和性能。如果我們還有其他的資源需要監控,可以直接配置在該模塊下即可
2.prometheus的pod資源
配置文件創建完成,如果以后我們有新的資源需要被監控,我們只需要將ConfigMap對象更新即可,現在我們開始創建prometheus的Pod資源
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: prometheus
namespace: kube-system
labels:
app: prometheus
spec:
template:
metadata:
labels:
app: prometheus
spec:
serviceAccountName: prometheus
containers:
- image: prom/prometheus:v2.4.3
name: prometheus
command:
- "/bin/prometheus"
args:
- "--config.file=/etc/prometheus/prometheus.yml"
- "--storage.tsdb.path=/prometheus"
- "--storage.tsdb.retention=30d"
- "--web.enable-admin-api" # 控制對admin HTTP API的訪問,其中包括刪除時間序列等功能
- "--web.enable-lifecycle" # 支持熱更新,直接執行localhost:9090/-/reload立即生效
ports:
- containerPort: 9090
protocol: TCP
name: http
volumeMounts:
- mountPath: "/prometheus"
subPath: prometheus
name: data
- mountPath: "/etc/prometheus"
name: config-volume
resources:
requests:
cpu: 100m
memory: 512Mi
limits:
cpu: 100m
memory: 512Mi
securityContext:
runAsUser: 0
volumes:
- name: data
persistentVolumeClaim:
claimName: prometheus
- configMap:
name: prometheus-config
name: config-volume
這里稍微講解一下配置參數
我們在啟動程序的時候,除了指定prometheus.yaml(configmap)以外,還通過storage.tsdb.path指定了TSDB數據的存儲路徑、通過storage.tsdb.rentention設置了保留多長時間的數據,還有下面的web.enable-admin-api參數可以用來開啟對admin api的訪問權限,參數web.enable-lifecyle用來開啟支持熱更新,有了這個參數之后,prometheus.yaml(configmap)文件只要更新了,通過執行localhost:9090/-/reload就會立即生效
我們添加了一行securityContext,,其中runAsUser設置為0,這是因為prometheus運行過程中使用的用戶是nobody,如果不配置可能會出現權限問題
3.NFS搭建步驟,步驟簡單不多說!!!
4.創建pv,pvc
prometheus.yaml文件對應的ConfigMap對象通過volume的形式掛載進Pod,這樣ConfigMap更新后,對應的pod也會熱更新,然后我們在執行上面的reload請求,prometheus配置就生效了。除此之外,對了將時間數據進行持久化,我們將數據目錄和一個pvc對象進行了綁定,所以我們需要提前創建pvc對象
cat >>prometheus-volume.yaml <<EOF
apiVersion: v1
kind: PersistentVolume
metadata:
name: prometheus
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
nfs:
server: 10.4.82.138
path: /data/k8s
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: prometheus
namespace: kube-system
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
EOF
#nfs
server nfs服務器ip
path 掛載點,提前掛在好,確保可以寫入
kubectl create -f prometheus-volume.yaml
kubectl get pvc --all-namespaces
這里稍微提示一下,我們創建的pv和pvc大小都是10g,只是測試存儲為10g。線上可以修改為200或者更多,一般prometheus數據保留15-30天就可以,如果數據量過大建議使用TSBD分布式存儲
5.rbac認證
我們這里還需要創建rbac認證,因為prometheus需要訪問k8s集群內部的資源
cat >>prometheus-rbac.yaml <<EOF
apiVersion: v1
kind: ServiceAccount
metadata:
name: prometheus
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: prometheus
rules:
- apiGroups:
- ""
resources:
- nodes
- services
- endpoints
- pods
- nodes/proxy
verbs:
- get
- list
- watch
- apiGroups:
- ""
resources:
- configmaps
- nodes/metrics
verbs:
- get
- nonResourceURLs:
- /metrics
verbs:
- get
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: prometheus
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: prometheus
subjects:
- kind: ServiceAccount
name: prometheus
namespace: kube-system
EOF
由於我們要獲取的資源,在每一個namespace下面都有可能存在,所以我們這里使用的是ClusterRole的資源對象,nonResourceURLs是用來對非資源型metrics進行操作的權限聲明
kubectl create -f prometheus-rbac.yaml
6.運行prometheus服務
我們將ConfigMap volume rbac 創建完畢后,就可以創建prometheus.deploy.yaml了,運行prometheus服務
kubectl create -f prometheus.deploy.yaml
kubectl get pod --all-namespaces |grep prometheus
7.service服務
現在我們prometheus服務狀態是已經正常了,但是我們在瀏覽器是無法訪問prometheus的 webui服務。那么我們還需要創建一個service
cat >>prometeheus-svc.yaml <<EOF
apiVersion: v1
kind: Service
metadata:
name: prometheus
namespace: kube-system
labels:
app: prometheus
spec:
selector:
app: prometheus
type: NodePort
ports:
- name: web
port: 9090
targetPort: http
EOF
kubectl create -f prometeheus-svc.yaml
kubectl get svc -n kube-system |grep prometheus
prometeheus界面
1.監控規則
Status-->Targets
2.查看數據
比如我們這里就選擇scrape_duration_seconds這個指標,然后點擊Execute,如果這個時候沒有查詢到任何數據,我們可以切換到Graph這個 tab 下面重新選擇下時間,選擇到當前的時間點,重新執行,就可以看到類似於下面的圖表數據了:
少年不識愁滋味,愛上層樓。愛上層樓。為賦新詞強說愁。 而今識盡愁滋味,欲說還休。欲說還休。卻道天涼好個秋。