author : 郁楠
前言:
对于 Kubernetes 来说,有没有更简单方式来监控报警?,有! 那就是 Prometheus Operator(https://prometheus-operator.dev/)
Prometheus Operator 为监控 Kubernetes 资源和 Prometheus 实例的管理提供了简单的定义,简化在 Kubernetes 上部署、管理和运行 Prometheus 和 Alertmanager 集群.
能监控什么?
- 动态的服务
- 动态 pods
- Ingress 和静态目标
-
创建需要的命名空间和 CRDs
kubectl apply -f manifests/setup
-
等待它们可用后再创建其余资源, 查看命令
$ kubectl get pods -n monitoring NAME READY STATUS RESTARTS AGE prometheus-operator-7649c7454f-wqtx7 2/2 Running 0 2m42s
-
需要修改一处deployment YAML, 因为官方k8s的image源访问不了, 先拉一个docker image
docker pull ricardbejarano/kube-state-metrics:2.1.0
-
然后进入kube-prometheus, 修改文件
cd manifests/ vi kube-state-metrics-deployment.yaml 将内容改为spec.template.spec.containers.image: ricardbejarano/kube-state-metrics:2.1.0
-
然后整体开始部署CRD等资源
kubectl apply -f manifests/
-
部署完后, 查看状态
kubectl get pods -n monitoring NAME READY STATUS RESTARTS AGE alertmanager-main-0 2/2 Running 0 76m alertmanager-main-1 2/2 Running 0 76m alertmanager-main-2 2/2 Running 0 76m blackbox-exporter-7d7979f957-b5kjb 3/3 Running 0 76m grafana-5c87fcf499-p6b7r 1/1 Running 0 76m kube-state-metrics-55c478d69-wd24t 3/3 Running 0 44m node-exporter-pmpkj 0/2 Running 0 76m node-exporter-r4tlg 0/2 Running 0 76m prometheus-adapter-7bd88d67fd-dq6m9 1/1 Running 0 76m prometheus-adapter-7bd88d67fd-wkpv7 1/1 Running 0 76m prometheus-k8s-0 2/2 Running 0 76m prometheus-k8s-1 2/2 Running 0 76m prometheus-operator-7cb79c454c-c5jkl 2/2 Running 0 78m kubectl get svc -n monitoring NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE alertmanager-main NodePort 10.101.41.255 <none> 9093:31341/TCP 77m alertmanager-operated ClusterIP None <none> 9093/TCP,9094/TCP,9094/UDP 77m blackbox-exporter ClusterIP 10.98.242.59 <none> 9115/TCP,19115/TCP 77m grafana NodePort 10.111.214.154 <none> 3000:31355/TCP 77m kube-state-metrics ClusterIP None <none> 8443/TCP,9443/TCP 77m node-exporter ClusterIP None <none> 9100/TCP 77m prometheus-adapter ClusterIP 10.101.118.192 <none> 443/TCP 77m prometheus-k8s NodePort 10.110.105.5 <none> 9090:30231/TCP 77m prometheus-operated ClusterIP None <none> 9090/TCP 77m prometheus-operator ClusterIP None <none> 8443/TCP 80m
-
其中grafana、alertmanager 和 prometheus 都创建了一个类型为 ClusterIP 的 Service,这里为了简单,直接使用 NodePort 类型的服务即可,编辑
grafana
、alertmanager-main
和prometheus-k8s
这3个 Service,将服务类型更改为 NodePort# 将 type: ClusterIP 更改为 type: NodePort $ kubectl edit svc grafana -n monitoring $ kubectl edit svc alertmanager-main -n monitoring $ kubectl edit svc prometheus-k8s -n monitoring
-
这里有个注意的点, 我们可以看到 Prometheus 是两个副本,我们这里通过 Service 去访问,按正常来说请求是会去轮询访问后端的两个 Prometheus 实例的,但实际上我们这里访问的时候始终是路由到后端的一个实例上去,因为这里的 Service 在创建的时候添加了
sessionAffinity: ClientIP
这样的属性,会根据ClientIP
来做 session 亲和性,所以我们不用担心请求会到不同的副本上去. -
为什么会担心请求会到不同的副本上去呢?正常多副本应该是看成高可用的常用方案,理论上来说不同副本本地的数据是一致的,但是需要注意的是 Prometheus 的主动 Pull 拉取监控指标的方式,由于抓取时间不能完全一致,即使一致也不一定就能保证网络没什么问题,所以最终不同副本下存储的数据很大可能是不一样的,所以这里我们配置了 session 亲和性,可以保证我们在访问数据的时候始终是一致的。
-
去Grafana看, 默认有一些模板, 也可导入13105,14623,9965,13402,14518,8919模板
如果要清理 Prometheus-Operator,可以直接删除对应的资源清单即可
$ kubectl delete -f manifests/
$ kubectl delete -f manifests/setup/
kubectl create cm grafana-config --from-file=grafana.ini -n monitoring
vi manifests/grafana-deployment.yaml
kubectl create namespace missing-container-metrics
helm install missing-container-metrics missing-container-metrics -n missing-container-metrics
helm -n missing-container-metrics list