K8S集群部署kube-Prometheus监控etcd

K8S集群部署kube-Prometheus监控etcd

一、背景

转载自:https://cloud.tencent.com/developer/article/1760581
稍微做了一些调整。
除了 Kubernetes 集群中的一些资源对象、节点以及组件需要监控,有的时候我们可能还需要根据实际的业务需求去添加自定义的监控项,添加一个自定义监控的步骤也是非常简单的,主要有以下三个步骤:

第一步建立一个 ServiceMonitor 对象,用于 Prometheus 添加监控项;
第二步为 ServiceMonitor 对象关联 metrics 数据接口的一个 Service 对象;
第三步确保 Service 对象可以正确获取到 Metrics 数据;

上面已经配置了 Kubernetes 集群监控 kube-prometheus 部署,但是并没有监控 ETCD 的信息,接下来我们就来为大家演示如何添加 ETCD 集群的监控。无论是 Kubernetes 集群外的还是使用 Kubeadm 安装在集群内部的 ETCD 集群,我们这里都将其视作集群外的独立集群,因为对于二者的使用方法没什么特殊之处。

注意:

ETCD 是 K8S 集群的核心组件,即数据库。

我们的etcd 是二进制部署,即没有采用docker或者其他方式部署。

二、配置etcd服务

①、查看etcd启动配置
[root@k8s01 manifests]# cat /etc/systemd/system/etcd.service 
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
Documentation=https://github.com/coreos

[Service]
Type=notify
WorkingDirectory=/data/k8s/etcd_new
ExecStart=/opt/k8s/bin/etcd \
  --data-dir=/data/k8s/etcd_new/etcd.restore \
  --wal-dir=/data/k8s/etcd_new/wal \
  --name=k8s01 \
  --cert-file=/etc/etcd/cert/etcd.pem \
  --key-file=/etc/etcd/cert/etcd-key.pem \
  --trusted-ca-file=/etc/kubernetes/cert/ca.pem \
  --peer-cert-file=/etc/etcd/cert/etcd.pem \
  --peer-key-file=/etc/etcd/cert/etcd-key.pem \
  --peer-trusted-ca-file=/etc/kubernetes/cert/ca.pem \
  --peer-client-cert-auth \
  --client-cert-auth \
  --listen-peer-urls=https://172.16.1.11:2380 \
  --initial-advertise-peer-urls=https://172.16.1.11:2380 \
  --listen-client-urls=https://172.16.1.11:2379,http://127.0.0.1:2379 \
  --advertise-client-urls=https://172.16.1.11:2379 \
  --listen-metrics-urls=http://172.16.1.11:2381
  --initial-cluster-token=etcd-cluster-0 \
  --initial-cluster=k8s01=https://172.16.1.11:2380,k8s02=https://172.16.1.12:2380,k8s03=https://172.16.1.13:2380 \
  --initial-cluster-state=new \
  --auto-compaction-mode=periodic \
  --auto-compaction-retention=1 \
  --max-request-bytes=33554432 \
  --quota-backend-bytes=6442450944 \
  --heartbeat-interval=250 \
  --election-timeout=2000
Restart=on-failure
RestartSec=5
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

我们可以看到启动参数里面有一个 --listen-metrics-urls=http://172.16.1.11:2381 的配置,该参数就是来指定 Metrics 接口运行在 2381 端口下面的,而且是 http 的协议,所以也不需要什么证书配置,这就比以前的版本要简单许多了,以前的版本需要用 https 协议访问,所以要配置对应的证书。

如果以前没有,直接添加这一行 --listen-metrics-urls=http://ip:2381到启动文件重启etcd服务即可。

三、k8s部署ServiceMonitor、Service & Endpoints

①、部署ServiceMonitor
$ vi 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: 15s
  selector:
    matchLabels:
      k8s-app: etcd
  namespaceSelector:
    matchNames:
    - kube-system

上面我们在 monitoring 命名空间下面创建了名为 etcd-k8s 的 ServiceMonitor 对象,基本属性和前面介绍的一致,匹配 kube-system 这个命名空间下面的具有 k8s-app=etcd 这个 label 标签的 Service,jobLabel 表示用于检索 job 任务名称的标签,由于 etcd 的 metrics 接口在 2381 端口下面,不需要 https 安全认证,所以用默认的配置即可。然后我们直接创建这个 ServiceMonitor 对象即可:

kubectl apply -f prometheus-serviceMonitorEtcd.yaml
②、创建 Service & Endpoints

因为 ETCD 是独立于集群之外的,所以我们需要创建一个 Endpoints 将其代理到 Kubernetes 集群,然后创建一个 Service 绑定 Endpoints,然后 Kubernetes 集群的应用就可以访问 ETCD 集群了。

$ vi prometheus-etcdService.yaml
apiVersion: v1
kind: Service
metadata:
  name: etcd-k8s
  namespace: kube-system
  labels:
    k8s-app: etcd
spec:
  type: ClusterIP
  clusterIP: None  #设置为None,不分配Service IP
  ports:
  - name: port
    port: 2381
---
apiVersion: v1
kind: Endpoints
metadata:
  name: etcd-k8s
  namespace: kube-system
  labels:
    k8s-app: etcd
subsets:
- addresses:
  - ip: 172.16.1.11   # 指定etcd节点地址,如果是集群则继续向下添加
    nodeName: etc-master
  ports:
  - name: port
    port: 2381         # Etcd 端口号

我们这里创建的 Service 没有采用前面通过 label 标签的形式去匹配 Pod 的做法,因为前面我们说过很多时候我们创建的 ETCD 集群是独立于集群之外的,这种情况下面我们就需要自定义一个 Endpoints,要注意 metadata 区域的内容要和 Service 保持一致,Service 的 clusterIP 设置为 None,新版本的 etcd 将 metrics 接口数据放置到了 2381 端口。

创建 Service & Endpoints:

[root@k8s01 prometheus-etcd]# kubectl apply -f prometheus-etcdService.yaml 
service/etcd-k8s created
endpoints/etcd-k8s created
[root@k8s01 prometheus-etcd]# kubectl apply -f prometheus-serviceMonitorEtcd.yaml 
servicemonitor.monitoring.coreos.com/etcd-k8s created
[root@k8s01 prometheus-etcd]# kubectl get svc -n kube-system -l k8s-app=etcd
NAME       TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
etcd-k8s   ClusterIP   None         <none>        2381/TCP   22s
四、查看prometheus targets

上述配置完成后,隔一会儿去 Prometheus 的 Dashboard 中查看 targets,便会有 ETCD 的监控项了:
耐心等一会监控信息就出来了。
在这里插入图片描述

五、Grafana 引入 ETCD 仪表盘

完成 Prometheus 配置后,直接打开 Grafana 页面,引入 Dashboard ,输入编号 “3070” 的仪表盘:
在这里插入图片描述

效果图:
在这里插入图片描述

### 部署 Prometheus 进行 Kubernetes 监控 #### 准备工作 为了确保Prometheus能够正常运行并收集集群内的数据,在部署前需确认已创建必要的证书和Secret资源。对于etcd监控遇到的证书问题,可以通过如下命令来创建所需的secret: ```bash kubectl -n kubesphere-monitoring-system create secret generic kube-etcd-client-certs \ --from-file=etcd-client-ca.crt=/etc/kubernetes/pki/etcd/ca.crt \ --from-file=etcd-client.crt=/etc/kubernetes/pki/apiserver-etcd-client.crt \ --from-file=etcd-client.key=/etc/kubernetes/pki/apiserver-etcd-client.key[^2] ``` 此操作会将指定路径下的CA文件、客户端证书以及私钥打包成名为`kube-etcd-client-certs`的秘密对象存储于命名空间`kubesphere-monitoring-system`下。 #### 安装 Prometheus Operator 和 CRDs 推荐采用Helm Chart方式安装Prometheus及其相关组件。首先添加Prometheus社区官方仓库,并更新本地缓存: ```bash helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm repo update ``` 接着可以利用以下命令完成Prometheus Operator及相关自定义资源定义(CRDs)的安装: ```bash helm install prometheus-operator prometheus-community/kube-prometheus-stack -n monitoring --create-namespace ``` 这一步骤将在`monitoring`这个新的命名空间内设置好Prometheus所需的基础架构和服务发现机制。 #### 创建 ServiceMonitor 资源以便抓取目标指标 为了让Prometheus能自动发现并采集来自不同服务的数据点,需要为想要被监测的服务配置对应的ServiceMonitor资源描述符。这里假设要让Prometheus获取到整个Kubernetes Dashboard的相关度量信息,则可编写类似下面yaml格式的内容并通过`kubectl apply -f <filename>.yaml`提交给API Server处理: ```yaml apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: kubernetes-dashboard-servicemonitor namespace: kubernetes-dashboard spec: selector: matchLabels: k8s-app: kubernetes-dashboard endpoints: - port: http-metrics interval: 30s namespaceSelector: any: true ``` 上述YAML片段中的端口名称(`http-metrics`)应该匹配实际暴露出来的metrics接口所使用的端口号;同时调整时间间隔参数以适应具体需求场景。 通过以上步骤即可实现在Kubernetes 1.28.1环境中成功部署Prometheus来进行有效的集群状态跟踪与性能分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值