k8s監控etcd集群


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

 

已經成功

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM