#作者:stackofumbrella
文章目錄
- prometheus和k8s集群版本對照表
- 架構
- Prometheus Operator簡介
- kube-prometheus下載地址
- 安裝
- 修改鏡像地址
- 修改Prometheus的service
- 修改Grafana的service
- 修改Alertmanager的service
- 數據持久化
- 執行安裝
- Prometheus驗證
- Grafana驗證
- 解決ControllerManager、Scheduler監控問題
prometheus和k8s集群版本對照表
kube-prometheus stack | Kubernetes 1.23 | Kubernetes 1.24 | Kubernetes 1.25 | Kubernetes 1.26 | Kubernetes 1.27 | Kubernetes 1.28 | Kubernetes 1.29 | Kubernetes 1.30 | Kubernetes 1.31 |
---|---|---|---|---|---|---|---|---|---|
release-0.11 | ? | ? | ? | x | x | x | x | x | x |
release-0.12 | ? | ? | ? | x | x | x | x | x | x |
release-0.13 | ? | ? | x | ? | ? | ? | x | x | x |
release-0.14 | ? | ? | x | ? | ? | ? | ? | ? | ? |
main | ? | ? | x | x | ? | ? | ? | ? | ? |
架構
kube-prometheus是一個完整的監控解決方案,可以輕松地將其部署到kubernetes集群中,它包括以下內容
-
Prometheus用于度量收集
-
Alertmanager用于指標警報和通知
-
Grafana用于圖形用戶界面
-
一組特定于K8s的exporters用作指標收集代理
-
使用Prometheus Operator來簡化和自動化該堆棧的設置
Prometheus Operator簡介
由于Prometheus本身沒有提供管理配置的API接口(尤其是管理監控目標和管理警報規則),也沒有提供好用的多實例管理手段,因此這一塊往往要自己寫一些代碼或腳本。為了簡化這類應用程序的管理復雜度,CoreOS率先引入了Operator的概念,并且首先推出了針對在Kubernetes下運行和管理Etcd的Etcd Operator。并隨后推出了Prometheus Operator
prometheus-operator和kube-prometheus前者只包含了Prometheus Operator,后者既包含了Operator,又包含了Prometheus相關組件的部署及常用的Prometheus自定義監控,具體包含下面的組件
The Prometheus Operator:創建CRD自定義的資源對象
Highly available Prometheus:創建高可用的Prometheus
Highly available Alertmanager:創建高可用的告警組件
Prometheus node-exporter:創建主機的監控組件
Prometheus Adapter for Kubernetes Metrics APIs:創建自定義監控的指標工具(例如可以通過nginx的request來進行應用的自動伸縮)
kube-state-metrics:監控k8s相關資源對象的狀態指標
Grafana:進行圖像展示
kube-prometheus下載地址
https://github.com/prometheus-operator/kube-prometheus/archive/refs/tags/v0.13.0.tar.gz
安裝
$ tar -C ./ -xf v0.13.0.tar.gz
$ cd kube-prometheus-0.13.0/manifests/
$ ls -lh *-networkPolicy.yaml
網絡策略文件建議刪除prometheus-networkPolicy.yaml、grafana-networkPolicy.yaml、alertmanager-networkPolicy.yaml
修改鏡像地址
由于網絡原因kube-state-metrics和prometheus-adapter鏡像在國內無法下載,因此需要修改以下地址
$ vim kubeStateMetrics-deployment.yaml
$ vim prometheus-prometheus.yaml
$ vim prometheusAdapter-deployment.yaml
$ vim alertmanager-alertmanager.yaml
$ vim grafana-deployment.yaml
$ vim prometheusOperator-deployment.yaml
$ vim blackboxExporter-deployment.yaml
$ vim nodeExporter-daemonset.yaml
修改Prometheus的service
$ vim prometheus-service.yaml
修改Grafana的service
$ vim grafana-service.yaml
修改Alertmanager的service
$ vim alertmanager-service.yaml
數據持久化
$ prometheus-prometheus.yaml
$ vim grafana-deployment.yaml
為grafana新增pvc
$ vim grafana-pvc.yaml
apiVersion: v1
kind: Namespace
metadata:name: monitoring
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: grafana-datanamespace: monitoringannotations:volume.beta.kubernetes.io/storage-class: "nfs-client"
spec:accessModes:- ReadWriteManyresources:requests:storage: 8Gi
創建grafana的pvc
$ kubectl apply -f grafana.yaml
由于grafana默認時區是UTC,比中國時間慢了8小時,很不便于日常監控查看,需要進行修改
$ sed -i ‘s/utc/utc+8/g’ grafana-dashboardDefinitions.yaml
$ sed -i ‘s/UTC/UTC+8/g’ grafana-dashboardDefinitions.yaml
$ grep -i timezone grafana-dashboardDefinitions.yaml
執行安裝
$ cd kube-prometheus-0.13.0
$ kubectl apply --server-side -f manifests/setup
$ kubectl apply -f manifests/
$ kubectl get pods -n monitoring
Prometheus驗證
選擇一臺node節點IP+31000訪問
Grafana驗證
選擇一臺node節點IP+31002訪問,默認用戶名密碼:admin/admin
解決ControllerManager、Scheduler監控問題
默認安裝后訪問prometheus會發現有三個報警:Watchdog、KubeControllerManagerDown、KubeSchedulerDown
Watchdog是一個正常的報警,這個告警的作用是如果alermanger或prometheus本身掛掉了就發不出告警了,因此一般會采用另一個監控來監控prometheus,或自定義一個持續不斷的告警通知,哪一天這個告警通知不發了,說明監控出現問題了。
prometheus operator已經考慮了這一點,本身攜帶一個watchdog,作為對自身的監控。如果需要關閉,刪除或注釋掉Watchdog部分
$ vim prometheus-rules.yaml
修改/etc/kubernetes/manifests/kube-controller-manager.yaml文件,將–bind-address=127.0.0.1改為–bind-address=0.0.0.0
新增prometheus-kubeControllerManagerService.yaml
apiVersion: v1
kind: Service
metadata:namespace: kube-systemname: kube-controller-managerlabels:app.kubernetes.io/name: kube-controller-manager #要與kubernetesControlPlane-serviceMonitorKubeControllerManager.yaml文件的spec.selector.matchLabels相同
spec:selector:component: kube-controller-manager#此處注意為kube-controller-manager pod的標簽ports:- name: https-metrics#名字要與kubernetesControlPlane-serviceMonitorKubeControllerManager.yaml文件的spec.endpoints.port值相同port: 10257#注意端口號要正確targetPort: 10257#注意端口號要正確protocol: TCP
$ kubectl apply -f prometheus-kubeControllerManagerService.yaml
修改/etc/kubernetes/manifests/kube-scheduler.yaml文件,將–bind-address=127.0.0.1改為–bind-address=0.0.0.0
新增prometheus-kubeSchedulerService.yaml文件
apiVersion: v1
kind: Service
metadata:namespace: kube-systemname: kube-schedulerlabels:app.kubernetes.io/name: kube-scheduler #要與kubernetesControlPlane-serviceMonitorKubeScheduler.yaml文件的spec.selector.matchLabels相同
spec:selector:component: kube-scheduler #此處注意為kube-scheduler pod的標簽ports:- name: https-metrics #名字要與kubernetesControlPlane-serviceMonitorKubeScheduler.yaml文件的spec.endpoints.port值相同port: 10259#注意端口號要正確targetPort: 10259#注意端口號要正確protocol: TCP
$ kubectl apply -f prometheus-kubeControllerManagerService.yaml
刷新prometheus即可恢復