基于Kubernetes部署Prometheus监控平台
#作者: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-data
  namespace: monitoring
  annotations:
    volume.beta.kubernetes.io/storage-class: "nfs-client"
spec:
  accessModes:
    - ReadWriteMany
  resources:
    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-system
  name: kube-controller-manager
  labels:
    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-system
  name: kube-scheduler
  labels:
    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即可恢复
 
