Loading
Loading...

Prometheus 监控 Kubernetes ETCD 集群

系统环境:

  • 操作系统: CentOS 7.9
  • Docker 版本: 20.10.8
  • Prometheus 版本: 2.29.1
  • Kubernetes 版本: 1.20.2

系列文章目录


一、什么是 ETCD

ETCD 是一个高可用的键值对数据库,在 Kubernetes 中,所有资源的信息都会存储到 ETCD 集群中进行存储,如果 ETCD 不可用将会导致 Kubernetes 集群瘫痪,所以监控 ETCD 集群尤为重要。

二、如何采集 ETCD 指标数据

在 Kubernetes 集群的 ETCD 默认是开启暴露 metrics 数据的,不过一般来说 ETCD 部署在集群外,并且其暴露的接口是基于 HTTPS 协议。为了统一管理,我们需要将 ETCD 服务代理到 Kubernetes 集群中,然后使用 Prometheus 的 Kubernetes 动态服务发现机制,自动查找到带有指定 label 标签的 ETCD Service 服务。

Prometheus 通过服务发现机制采集 ETCD 数据的流程

三、将 ETCD 服务代理到 Kubernetes 集群

实现 Prometheus 第一步,我们首先需要创建 ETCD 的 ServiceEndpoints 资源,将 ETCD 代理到 Kubernetes 集群内部,然后给 ETCD Service 添加指定 labels 标签 app.kubernetes.io/name: etcd,这样后续 Prometheus 会通过 Kubernetes 服务发现机制,查找到带有此标签的 Service 关联的应用列表。

将 ETCD 代理到 Kubernetes 的 EndpointsService 资源配置文件 etcd-proxy.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: 192.168.2.31
ports:
- port: 2379 ## 代理的应用端口号

四、Prometheus 挂入 ETCD 证书文件

由于 ETCD 是基于 HTTPS 协议,Prometheus 采集指标数据时需要使用 TLS 证书,所以我们需要将 ETCD 的证书文件挂载到 Kubernetes 集群的 ConfigMap 资源中。创建完后需要修改 Prometheus 部署资源的挂载配置,将证书 ConfigMap 挂载到 Prometheus 容器中。

将 ETCD 证书文件存入 CongfigMap

​进入 ETCD 所在的服务器,将 ETCD 证书文件挂载到 Kubernetes 的 ConfigMap 资源中,执行的命令如下:

  • -n: 命令空间。
  • —from-file: 读取指定文件,生成 ConfigMap 资源。
Terminal window
$ 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 kube-system

注: 本人是使用 kubeadm 安装的 Kubernetes 集群,默认 ETCD 证书会放到 /etc/kubernetes/pki/etcd/ 目录下。

修改 Prometheus 部署参数

接下来我们修改 Prometheus 部署资源配置,添加挂载 ETCD 证书参数,将证书文件挂入 Prometheus 应用中,内容如下:

apiVersion: v1
kind: Service
metadata:
name: prometheus
labels:
k8s-app: prometheus
spec:
type: NodePort
ports:
- name: http
port: 9090
targetPort: 9090
nodePort: 30900
selector:
k8s-app: prometheus
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: prometheus
labels:
k8s-app: prometheus
spec:
replicas: 1
selector:
matchLabels:
k8s-app: prometheus
template:
metadata:
labels:
k8s-app: prometheus
spec:
serviceAccountName: prometheus
containers:
- name: prometheus
image: prom/prometheus:v2.26.0
ports:
- name: http
containerPort: 9090
securityContext:
runAsUser: 65534
privileged: true
command:
- "/bin/prometheus"
args:
- "--config.file=/etc/prometheus/prometheus.yml"
- "--web.enable-lifecycle"
- "--storage.tsdb.path=/prometheus"
- "--storage.tsdb.retention.time=10d"
- "--web.console.libraries=/etc/prometheus/console_libraries"
- "--web.console.templates=/etc/prometheus/consoles"
resources:
limits:
cpu: 2000m
memory: 1024Mi
requests:
cpu: 1000m
memory: 512Mi
readinessProbe:
httpGet:
path: /-/ready
port: 9090
initialDelaySeconds: 5
timeoutSeconds: 10
livenessProbe:
httpGet:
path: /-/healthy
port: 9090
initialDelaySeconds: 30
timeoutSeconds: 30
volumeMounts:
- name: data
mountPath: /prometheus
subPath: prometheus
- name: config
mountPath: /etc/prometheus
- name: certs #### 将ETCD证书的ConfigMap挂进Prometheus容器
readOnly: true
mountPath: /certs
- name: configmap-reload
image: jimmidyson/configmap-reload:v0.5.0
args:
- "--volume-dir=/etc/config"
- "--webhook-url=http://localhost:9090/-/reload"
resources:
limits:
cpu: 100m
memory: 100Mi
requests:
cpu: 10m
memory: 10Mi
volumeMounts:
- name: config
mountPath: /etc/config
readOnly: true
volumes:
- name: data
persistentVolumeClaim:
claimName: prometheus
- name: config
configMap:
name: prometheus-config
- name: certs #### 将ETCD证书的ConfigMap挂进Prometheus容器
secret:
secretName: etcd-certs

五、Prometheus 添加采集 ETCD 的配置

创建 Prometheus 采集 ETCD 的配置

接下来我们创建 Prometheus 采集 ETCD 的配置,在配置中需要指定使用的 TLS 证书参数和 Kubernetes 服务发现机制,配置内容如下:

###################### kubernetes-etcd ######################
- 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

将 ETCD 采集配置写入 Prometheus 的 ConfigMap

在之前介绍过 在 Kubernetes 中如何部署 Prometheus,且将部署过程中将 Prometheus 配置参数写到了 ConfigMap 资源中,通过挂载 ConfigMapPrometheus Pod 内,这样修改 ConfigMap 就可以修改 Prometheus 配置。

这里将上面 Prometheus 中的配置参数写到 Kubernetes 中的 ConfigMap 资源 prometheus-config.yaml 中,内容如下:

kind: ConfigMap
apiVersion: v1
metadata:
name: prometheus-config
namespace: kube-system
data:
prometheus.yml: |
global:
scrape_interval: 15s
evaluation_interval: 15s
external_labels:
cluster: "kubernetes"
scrape_configs:
###################### kubernetes-etcd ######################
- 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

Prometheus 重新加载配置

为了使 Prometheus 重新加载配置,我们执行下面命令,使其重新读取 ConfigMap 资源中的配置参数:

  • -f: 指定要部署的资源文件。
  • -n: 指定 Namespace 名称。
Terminal window
$ kubectl apply -f prometheus-config.yaml -n kube-system

配置修改后需要使 Prometheus 重新加载 ConfigMap 中的参数配置,执行命令如下:

Terminal window
$ curl -XPOST http://192.168.2.32:30900/-/reload

注: 这里本人的 Prometheus 地址是 http://192.168.2.32:30900

观察 Prometheus UI 中 ETCD 采集项的状态

重新加载 Prometheus 的配置后,我们打开它的 UI 界面,查看 Targets 一栏中是否存在 ETCD 采集目标记录,并且检测状态是否正常,界面内容如下图所示。

Prometheus UI 中的 Targets 页面

如果看到 ETCD 采集规则显示正常,则说明采集配置没有问题,否则检测上面步骤是否正确。

注: 因为本人测试环境只有一个 ETCD 节点,所以上面显示数量为 1,如果 ETCD 有三台组成高可用,那么采集的节点数量将是 3。

六、Grafana 中引入 ETCD 监控看板

在之前的 “Kubernetes 部署图表组件 Grafana” 文章中,已经介绍过如何在 Kubernetes 中部署 Grafana,并且在之前的项目中也介绍了 Grafana 如何引入 Prometheus 数据库,所以这里就不介绍该组件的安装和数据库配置过程,只是简单介绍下如何引入 ETCD 监控看板界面,操作过程如下:

(1) 打开 Grafana Dashboard,然后点击 Manage 后选择 Import 按钮,引入新的监控看板。

引入新的监控看板界面

(2) 在 Import via grafana.com ID 一栏输入看板 ID9733,引入 ETCDDashboard 看板。

引入对应 ID 的监控看板配置界面

(3) 选择 Prometheus 数据库,然后点击 Import 加载看板。

选择看板关联的数据库配置界面

可以看到 ETCD 看板成功显示其监控的相关数据信息,显示的信息如下图。

ETCD 监控看板信息界面

---END---

如果本文对你有帮助,可以关注我的公众号”小豆丁技术栈”了解最新动态,顺便也请帮忙 github 点颗星哦感谢

本文作者:超级小豆丁 @ 小豆丁技术栈

本文链接:http://www.mydlq.club/article/117/

本文标题:Prometheus 监控 Kubernetes ETCD 集群

本文版权:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!