Prometheus监控Etcd集群
系统环境
- 操作系统: CentOS 7.6
- Docker 版本: 19.03.9
- Prometheus 版本: 2.36.0
- Kubernetes 版本: 1.20.2
ETCD简介
ETCD是一个高可用的键值对数据库,在 Kubernetes 中,所有资源的信息都会存储到 ETCD 集群中进行存储,如果 ETCD 不可用将会导致 Kubernetes 集群瘫痪,所以监控 ETCD 集群尤为重要
如何采集ETCD指标数据
在 Kubernetes 集群的 ETCD 默认是开启暴露 metrics 数据的,不过一般来说 ETCD 部署在集群外,并且其暴露的接口是基于 HTTPS 协议。为了统一管理,我们需要将 ETCD 服务代理到 Kubernetes 集群中,然后使用 Prometheus 的 Kubernetes 动态服务发现机制,自动查找到带有指定 label 标签的 ETCD Service 服务
ETCD服务代理到集群
首先需要创建 ETCD的Service 和 Endpoints 资源,将ETCD代理到Kubernetes集群内部,然后给 ETCD Service 添加指定 labels 标签 app.kubernetes.io/name: etcd,这样后续 Prometheus 会通过 Kubernetes 服务发现机制,查找到带有此标签的 Service 关联的应用列表。
将 ETCD 代理到 Kubernetes 的 Endpoints 和 Service 资源配置文件 etcd-service.yaml 内容如下
[root@k8s01 ~]# cat etcd-service.yaml
apiVersion: v1
kind: Service
metadata:
name: etcd-k8s
namespace: kube-system
labels:
k8s-app: etcd #Kubernetes 会根据该标签和Endpoints资源关联
app.kubernetes.io/name: etcd #Prometheus 会根据该标签服务发现到该服务
spec:
type: ClusterIP
clusterIP: None #设置为None,不分配Service IP
ports:
- name: port
port: 2379
protocol: TCP
---
apiVersion: v1
kind: Endpoints
metadata:
name: etcd-k8s
namespace: kube-system
labels:
k8s-app: etcd
subsets:
- addresses: #代理的应用IP地址列表,多个一行一个
- ip: 10.48.x.x
ports:
- port: 2379 #代理的应用端口号
Prometheus挂入ETCD证书文件
由于 ETCD 是基于 HTTPS 协议,Prometheus 采集指标数据时需要使用 TLS 证书,所以我们需要将 ETCD 的证书文件挂载到 Kubernetes 集群的 ConfigMap 资源中。创建完后需要修改 Prometheus 部署资源的挂载配置,将证书 ConfigMap 挂载到 Prometheus 容器中
ETCD证书文件存入CongfigMap
进入ETCD所在的服务器,将ETCD证书文件挂载到Kubernetes的ConfigMap资源中,执行的命令如下
[root@k8s01 ~]# kubectl create secret generic etcd-certs \
> --from-file=/etc/kubernetes/pki/etcd/healthcheck-client.crt \
> --from-file=/etc/kubernetes/pki/etcd/healthcheck-client.key \
> --from-file=/etc/kubernetes/pki/etcd/ca.crt \
> -n monitoring
secret/etcd-certs created
由于本文集群使用kubeadm部署,默认ETCD证书会放到 /etc/kubernetes/pki/etcd/ 目录下,二进制安装集群根据实际目录修改执行
修改Prometheus部署参数
之前已经k8s部署了Prometheus ,修改Prometheus部署资源配置,添加挂载 ETCD 证书参数,将证书文件挂入 Prometheus 应用中,内容如下:
[root@k8s01 monitoring]# vim prometheus-statefulset.yaml
...
- name: prometheus-data
mountPath: /data
subPath: ""
- name: certs #将ETCD证书的certs挂进Prometheus容器
readOnly: true
mountPath: /certs
terminationGracePeriodSeconds: 300
volumes:
- name: config-volume
configMap:
name: prometheus-config
- name: certs #将ETCD证书的certs挂进Prometheus容器
secret:
secretName: etcd-certs
Prometheus添加采集ETCD
创建Prometheus采集ETCD配置
接下来我们创建 Prometheus 采集 ETCD 的配置,在配置中需要指定使用的 TLS 证书参数和 Kubernetes 服务发现机制,配置内容如下:
- job_name: "kubernetes-etcd"
scheme: https
tls_config:
## 配置 ETCD 证书所在路径(Prometheus 容器内的文件路径)
ca_file: /certs/ca.crt
cert_file: /certs/healthcheck-client.crt
key_file: /certs/healthcheck-client.key
insecure_skip_verify: false
kubernetes_sd_configs:
## 配置服务发现机制,指定 ETCD Service 所在的Namespace名称
- role: endpoints
namespaces:
names: ["kube-system"]
relabel_configs:
## 指定从 app.kubernetes.io/name 标签等于 etcd 的 service 服务获取指标信息
- action: keep
source_labels: [__meta_kubernetes_service_label_app_kubernetes_io_name]
regex: etcd
修改Prometheus的ConfigMap
之前已经k8s部署了Prometheus,且将部署过程中将 Prometheus 配置参数写到了 ConfigMap 资源中,通过挂载 ConfigMap 到 Prometheus Pod 内,这样修改 ConfigMap 就可以修改 Prometheus 配置
[root@k8s01 monitoring]# vim prometheus-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: prometheus-config
namespace: monitoring
data:
prometheus.yml: |
global:
scrape_interval: 15s
evaluation_interval: 15s
external_labels:
cluster: "kubernetes"
...
- job_name: "kubernetes-etcd"
scheme: https
tls_config:
ca_file: /certs/ca.crt
cert_file: /certs/healthcheck-client.crt
key_file: /certs/healthcheck-client.key
insecure_skip_verify: false
kubernetes_sd_configs:
- role: endpoints
namespaces:
names: ["kube-system"]
relabel_configs:
- action: keep
source_labels: [__meta_kubernetes_service_label_app_kubernetes_io_name]
regex: etcd
[root@k8s01 monitoring]# kubectl apply -f prometheus-config.yaml
configmap/prometheus-config configured
Prometheus重新加载配置
[root@k8s01 monitoring]# curl -XPOST http://10.48.x.x:30089/-/reload
查看Prometheus UI界面
如果看到 ETCD 采集规则显示正常,则说明采集配置没有问题,否则检测上面步骤是否正确,由于集群是单节点,只会显示一个,如果是集群的话,就会显示多个,当然在引入集群创建endpoint时候也许写多个IP
Grafana引入ETCD监控看板
打开 Grafana Dashboard,然后点击Manage后选择 Import 按钮,输入看板ID值 9733,引入 ETCD 的 Dashboard 看板,选择 Prometheus 数据库,然后点击 Import 加载看板,可以看到 ETCD 看板成功显示其监控的相关数据信息,显示的信息如下图