Kubernetes監控etcd集群
一、監控etcd集群
Kubernetes用operator部署prometheus,可以使用prometheus來監控自帶metrics接口的應用。etcd是Kubernetes的數據庫,自帶接口,我們可以用etcd作為實例來看看怎么操作。
二、安裝方法1
安裝教程地址:https://blog.csdn.net/zuozewei/article/details/108365098
2.1前言
除了 Kubernetes 集群中的一些資源對象、節點以及組件需要監控,有的時候我們可能還需要根據實際的業務需求去添加自定義的監控項,添加一個自定義監控的步驟也是非常簡單的,主要有以下三個步驟:
l 第一步建立一個 ServiceMonitor 對象,用於 Prometheus 添加監控項;
l 第二步為 ServiceMonitor 對象關聯 metrics 數據接口的一個 Service 對象;
l 第三步確保 Service 對象可以正確獲取到 Metrics 數據;
上面已經配置了 Kubernetes 集群監控 kube-prometheus 部署,但是並沒有監控 ETCD 的信息,接下來我們就來為大家演示如何添加 ETCD 集群的監控。無論是 Kubernetes 集群外的還是使用 Kubeadm 安裝在集群內部的 ETCD 集群,我們這里都將其視作集群外的獨立集群,因為對於二者的使用方法沒什么特殊之處。
注意:ETCD 是 K8S 集群的核心組件,即數據庫。
2.2、查看 Etcd 信息
1、獲取 Etcd Pod 名稱:
$ kubectl get pods -n kube-system | grep etcd etcd-k8s-master.novalocal 1/1 Running 0 17h
2、查看 Etcd 描述信息:
$ kubectl describe pod etcd-k8s-master.novalocal -n kube-system ...... Containers: etcd: Container ID: docker://4ac9ea30de1ea4e0f6f0be10069f7333dff492e17654484dcf11e9c7c73db28e Image: registry.aliyuncs.com/k8sxio/etcd:3.4.3-0 Image ID: docker-pullable://registry.aliyuncs.com/k8sxio/etcd@sha256:4afb99b4690b418ffc2ceb67e1a17376457e441c1f09ab55447f0aaf992fa646 Port: <none> Host Port: <none> Command: etcd --advertise-client-urls=https://172.16.106.200:2379 --cert-file=/etc/kubernetes/pki/etcd/server.crt --client-cert-auth=true --data-dir=/var/lib/etcd --initial-advertise-peer-urls=https://172.16.106.200:2380 --initial-cluster=k8s-master.novalocal=https://172.16.106.200:2380 --key-file=/etc/kubernetes/pki/etcd/server.key --listen-client-urls=https://127.0.0.1:2379,https://172.16.106.200:2379 --listen-metrics-urls=http://0.0.0.0:2381 --listen-peer-urls=https://172.16.106.200:2380 --name=k8s-master.novalocal --peer-cert-file=/etc/kubernetes/pki/etcd/peer.crt --peer-client-cert-auth=true --peer-key-file=/etc/kubernetes/pki/etcd/peer.key --peer-trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt --snapshot-count=10000 --trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt ......
我們可以看到啟動參數里面有一個 --listen-metrics-urls=http://127.0.0.1:2381 的配置,該參數就是來指定 Metrics 接口運行在 2381 端口下面的,而且是 http 的協議,所以也不需要什么證書配置,這就比以前的版本要簡單許多了,以前的版本需要用 https 協議訪問,所以要配置對應的證書。
2.3、創建 ServiceMonitor
創建 Prometheus 監控資源,配置用於監控 ETCD 參數:
$ 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
2.4、創建 Service & Endpoints
但實際上現在並不能監控到 ETCD 集群,因為並沒有一個滿足 ServiceMonitor 條件的 Service 對象與之關聯:
$ kubectl get svc -n kube-system -l k8s-app=etcd
No resources found.
因為 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: 10.151.30.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:
$ kubectl apply -f prometheus-etcdService.yaml
$ 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 1m
2.5、查看 Prometheus 規則
上述配置完成后,隔一會兒去 Prometheus 的 Dashboard 中查看 targets,便會有 ETCD 的監控項了:
可以看到有一個明顯的錯誤,2381 端口鏈接被拒絕,這是因為我們這里的 ETCD 的 Metrics 接口是監聽在 127.0.0.1 這個 IP 上面的,所以訪問會拒絕:
--listen-metrics-urls=http://127.0.0.1:2381
我們只需要在 /etc/kubernetes/manifests/ 目錄下面(靜態 Pod 默認的目錄)的 etcd.yaml 文件中將上面的 listen-metrics-urls 更改成節點 IP 即可:
--listen-metrics-urls=http://0.0.0.0:2381
修改完 ETCD 自動重啟生效后,查看 ETCD 這個監控任務就正常了:
2.6、Grafana 引入 ETCD 儀表盤
完成 Prometheus 配置后,直接打開 Grafana 頁面,引入 Dashboard ,輸入編號 “3070” 的儀表盤:
可以看到監控 ETCD 的各個看板:
三、安裝方法2
1.1、查看接口信息
二進制和kubeadm安裝方式不同,他們etcd的存放證書位置也不同
二進制
[root@k8s-master01 ~]# curl --cert /opt/etcd/ssl/server.pem --key /opt/etcd/ssl/server-key.pem https://10.0.0.34:2379/metrics -k # 這樣也行 curl -L http:// 10.0.0.34:2379/metrics kubeadm [root@k8s-master01 ~]# find / -name "etcd" /home/kubernetes/TLS/etcd curl --cert / /home/kubernetes/TLS/etcd/server.pem --key /home/kubernetes/TLS/etcd/server-key.pem https:// 10.0.0.34:2379/metrics -k
1.2、創建service和Endpoints
創建ep和svc代理外部的etcd服務,其他自帶metrics接口的服務也是如此!
apiVersion: v1 kind: Endpoints metadata: labels: app: etcd-k8s name: etcd-k8s namespace: kube-system subsets: - addresses: - ip: 10.0.0.34 nodeName: k8s-master01 ports: - name: etcd-port port: 2379 protocol: TCP - addresses: - ip: 10.30.16.154 nodeName: k8s-node01 ports: - name: etcd-port port: 2379 protocol: TCP - addresses: - ip: 10.30.16.224 nodeName: k8s-node02 ports: - name: etcd-port port: 2379 protocol: TCP --- apiVersion: v1 kind: Service metadata: labels: app: etcd-k8s name: etcd-k8s namespace: kube-system spec: ports: - name: etcd-port port: 2379 protocol: TCP targetPort: 2379 type: ClusterIP
1.3、測試是否代理成功
#再次curl,把IP換成svc的IP測試,輸出相同內容即創建成功
[root@k8s-master01 ~]# kubectl get svc -n kube-system etcd-k8s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE etcd-ep ClusterIP 10.0.0.118 <none> 2379/TCP 8m54s
# 再次請求接口
[root@k8s-master01 ~]#curl --cert /home/kubernetes/TLS/etcd/server.pem --key /home/kubernetes/TLS/etcd/server-key.pem https://10.0.0.118:2379/metrics -k
有上面測試數值,代表接口已經暴露出來,現在包證書掛載上去。
1.4、創建secret
# 1、這里我們k8s-master01節點進行創建,ca為k8sca證書,剩下2個為etcd證書,這是我證書所在位置
cert-file: '/opt/etcd/ssl/server.pem'
key-file: '/opt/etcd/ssl/server-key.pem'
trusted-ca-file: '/opt/etcd/ssl/ca.pem'
# 2、接下來我們需要創建一個secret,讓prometheus pod節點掛載
kubectl create secret generic etcd-ssl --from-file=/opt/etcd/ssl/ca.pem --from-file=/opt/etcd/ssl/server.pem --from-file=/opt/etcd/ssl/server-key.pem -n monitoring
# 3、創建完成后可以檢查一下
[root@k8s-master01 prometheus-down]# kubectl describe secrets -n monitoring etcd-ssl Name: etcd-ssl Namespace: monitoring Labels: <none> Annotations: <none> Type: Opaque Data ==== ca.pem: 1367 bytes server-key.pem: 1679 bytes server.pem: 1509 bytes
1.5、編輯prometheus,把證書掛載進去
# 1、通過edit直接編輯prometheus 或者修改yaml文件
[root@k8s-master01 ~]# kubectl edit prometheus k8s -n monitoring # 在replicas底下加上secret名稱 replicas:2 secrets: - etcd-ssl #添加secret名稱 # 進入容器查看,就可以看到證書掛載進去了 [root@k8s-master01 prometheus-down]# kubectl exec -it -n monitoring prometheus-k8s-0 /bin/sh # 查看文件是否存在 /prometheus $ ls /etc/prometheus/secrets/etcd-ssl/ ca.pem server-key.pem server.pem
1.6、創建ServiceMonitor
[root@k8s-master01 ~]# cat eprometheus-serviceMonitorEtcd.yaml apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: etcd-k8s namespace: monitoring labels: app: etcd-k8s spec: jobLabel: app endpoints: - interval: 30s port: etcd-port # 這個port對應 Service.spec.ports.name scheme: https tlsConfig: caFile: /etc/prometheus/secrets/etcd-ssl/ca.pem #證書路徑 (在prometheus pod里路徑) certFile: /etc/prometheus/secrets/etcd-ssl/server.pem keyFile: /etc/prometheus/secrets/etcd-ssl/server-key.pem insecureSkipVerify: true # 關閉證書校驗 selector: matchLabels: app: etcd-k8s # 跟scv的lables保持一致 namespaceSelector: matchNames: - kube-system # 跟svc所在namespace保持一致
# 匹配Kube-system這個命名空間下面具有app=etcd-k8s這個label標簽的Serve,job label用於檢索job任務名稱的標簽。由於證書serverName和etcd中簽發的證書可能不匹配,所以添加了insecureSkipVerify=true將不再對服務端的證書進行校驗
1.7、頁面查看etcd節點都獲取到數據
此處數據獲取有點慢,需要等待一下
http://10.0.0.34:32104/targets
1.8、grafana模板導入
數據采集完成后,接下來可以在grafana中導入dashboard
# 打開官網來的如下圖所示,點擊下載JSO文件
grafana官網:https://grafana.com/grafana/dashboards/3070
中文版ETCD集群插件:https://grafana.com/grafana/dashboards/9733
Grafana頁面地址:http://10.0.0.34:32102/d/mTemEyyizz/etcd-for-k8s-cnzhong-wen?orgId=1
用戶名admin密碼K8s@#Prometh@#Def@u1t
已經成功