系统环境

  • 操作系统: 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-1

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界面

k8s-etcd-2
如果看到 ETCD 采集规则显示正常,则说明采集配置没有问题,否则检测上面步骤是否正确,由于集群是单节点,只会显示一个,如果是集群的话,就会显示多个,当然在引入集群创建endpoint时候也许写多个IP

Grafana引入ETCD监控看板

打开 Grafana Dashboard,然后点击Manage后选择 Import 按钮,输入看板ID值 9733,引入 ETCD 的 Dashboard 看板,选择 Prometheus 数据库,然后点击 Import 加载看板,可以看到 ETCD 看板成功显示其监控的相关数据信息,显示的信息如下图
k8s-etcd-3

文章作者: 鲜花的主人
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 爱吃可爱多
监控服务 Prometheus Kubernetes Kubernetes 监控服务 Prometheus
喜欢就支持一下吧
打赏
微信 微信
支付宝 支付宝