Prometheus 监控 ETCD 集群:证书挂载、ServiceMonitor 与面板

ETCD 集群一般是用 https 证书认证方式搭建的(K8S 官方也强烈建议),所以用 Kube-Prometheus 监控 ETCD 的难点不在采集本身,而在让 Prometheus 拿到访问 ETCD 的证书。整体流程三步:建 ServiceMonitor 添加监控项;为 ServiceMonitor 关联暴露 metrics 接口的 Service;确保 Service 能正确取到 metrics 数据。

获取 ETCD 证书并创建 Secret

先确认证书路径,通过 systemctl status etcd 查看:

[root@k8s-prod-master01 ~]# systemctl status etcd.service -l

%

prometheus-etcd01

%

创建一个 secret,供 Kube-Prometheus 的 pod 节点挂载。注意改成自己证书的存储路径:

[root@k8s-master01 ~]# kubectl create secret generic etcd-ssl --from-file=/etc/kubernetes/cert/ca.pem --from-file=/etc/etcd/cert/etcd.pem --from-file=/etc/etcd/cert/etcd-key.pem -n monitoring
secret/etcd-ssl created

创建后检查:

[root@k8s-master01 ~]# kubectl describe secrets -n monitoring etcd-ssl

%

prometheus-etcd02

%

挂载 ETCD 证书

证书创建成功后,把 etcd-ssl 配置进 Kube-Prometheus 的资源对象,直接修改 prometheus-prometheus.yaml:

[root@k8s-master01 ~]# cd /opt/k8s/work/kube-prometheus/manifests/
[root@k8s-master01 manifests]# vim prometheus-prometheus.yaml
#这里我们直接修改 prometheus-prometheus.yaml  资源文件,并添加内容如下
  secrets:
  - etcd-ssl

%

prometheus-etcd03

%

更新资源文件并验证挂载:

# 更新资源文件
kubectl apply -f prometheus-prometheus.yaml

# 查看pod状态
kubectl get pod -n monitoring

# 进入prometheus-k8s-0 Pod中
kubectl exec -it -n monitoring prometheus-k8s-0 -- /bin/sh

# 查看证书
ls /etc/prometheus/secrets/etcd-ssl/

%

prometheus-etcd04

%

创建 ServiceMonitor

[root@k8s-master1 manifests]# vim prometheus-serviceMonitorEtcd.yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: etcd-k8s
  namespace: monitoring
  labels:
    k8s-app: etcd-k8s
spec:
  jobLabel: k8s-app
  endpoints:
  - port: port
    interval: 30s
    scheme: https
    tlsConfig:
      caFile: /etc/prometheus/secrets/etcd-ssl/ca.pem #证书路径 (Pod里的路径)
      certFile: /etc/prometheus/secrets/etcd-ssl/etcd.pem
      keyFile: /etc/prometheus/secrets/etcd-ssl/etcd-key.pem
      insecureSkipVerify: true
  selector:
    matchLabels:
      k8s-app: etcd
  namespaceSelector:
    matchNames:
- kube-system

这里匹配 kube-system 命名空间下带 k8s-app=etcd 标签的 Service。由于证书 serverName 和 ETCD 签发的证书可能不匹配,加了 insecureSkipVerify=true,不再校验服务端证书。

# 创建资源文件
kubectl apply -f prometheus-serviceMonitorEtcd.yaml

# 查看servicemonitors资源
kubectl get servicemonitors -n monitoring |grep etcd

稍等后打开 Prometheus 的 Web 界面,点击 Targets 检查:

%

prometheus-etcd05

%

此时 ETCD 监控项已经出现,但数量为 0——因为还没关联对应的 Service 对象,下一步补上。

创建 Service 与 Endpoints

[root@k8s-master01 manifests]# vim prometheus-EtcdService.yaml
apiVersion: v1
kind: Service
metadata:
  name: etcd-k8s
  namespace: kube-system
  labels:
    k8s-app: etcd
spec:
  type: ClusterIP
  clusterIP: None
  ports:
  - name: port
    port: 2379
protocol: TCP

[root@k8s-master01 manifests]# vim prometheus-EtcdServiceEnpoints.yaml
apiVersion: v1
kind: Endpoints
metadata:
  name: etcd-k8s
  namespace: kube-system
  labels:
    k8s-app: etcd
subsets:
- addresses:
  - ip: 192.168.66.62       #etcd节点地址
  - ip: 192.168.66.63
  - ip: 192.168.66.64
  ports:
  - name: port
    port: 2379
protocol: TCP

#创建etcd service资源对象
kubectl apply -f  prometheus-EtcdService.yaml
kubectl apply -f  prometheus-EtcdServiceEnpoints.yaml

# 查看ETCD状态
kubectl describe svc -n kube-system etcd-k8s

创建完成后稍等,回到 Prometheus 的 targets 页面,就能看到 ETCD 的监控数据了:

%

prometheus-etcd06

%

Grafana 面板

数据采集完成后,在 Grafana 导入现成的 dashboard,两个常用面板:https://grafana.com/grafana/dashboards/3070 和 https://grafana.com/grafana/dashboards/9733 。

%

prometheus-etcd07

%
%

prometheus-etcd08

%

注意事项

排查顺序建议按数据流走:先确认 secret 挂载进 pod(exec 进容器 ls 证书目录),再看 ServiceMonitor 是否被识别(Targets 里有 etcd 项),最后确认 Endpoints 里的 IP 和 2379 端口是否通。Targets 显示 0 或者 UP 失败,多数是 Endpoints 地址写错或证书路径和 Pod 内路径不一致。

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容