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
%

%
创建一个 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
%

%
挂载 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
%

%
更新资源文件并验证挂载:
# 更新资源文件
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/
%

%
创建 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 检查:
%

%
此时 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 的监控数据了:
%

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

%
%

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


















暂无评论内容