kubernetesv1.16監控系列——kube-prometheus監控ETCD

介紹

上節課和大家講解了kube-prometheus 的安裝和基本使用方法,這節課給大家介紹如何在kube-prometheus中添加一個自定義的監控項。

除了 Kubernetes 集群中的一些資源對象、節點以及組件需要監控,有的時候我們可能還需要根據實際的業務需求去添加自定義的監控項,添加一個自定義監控的步驟也是非常簡單的。

第一步建立一個 ServiceMonitor 對象,用於 Prometheus 添加監控項第二步為 ServiceMonitor 對象關聯 metrics 數據接口的一個 Service 對象第三步確保 Service 對象可以正確獲取到 metrics 數據

接下來我們就來為大家演示如何添加 etcd 集群的監控。

無論是 Kubernetes 集群外的還是使用 Kubeadm 安裝在集群內部的 etcd 集群,我們這裡都將其視作集群外的獨立集群,因為對於二者的使用方法沒什麼特殊之處。

etcd 證書

對於 etcd 集群一般情況下,為了安全都會開啟 https 證書認證的方式,所以要想讓 Prometheus 訪問到 etcd 集群的監控數據,就需要提供相應的證書校驗。

由於我們這裡演示環境使用的是 二進制搭建的集群,直接查看 api-server啟動的時候使用的證書路徑:



首先我們將需要使用到的證書通過 secret 對象保存到集群中去:(在 etcd 運行的節點)

<code>kubectl -n monitoring create secret generic etcd-certs --

from

-file=

/etc/

kubernetes/ssl/ca.pem --

from

-file=

/etc/

kubernetes/ssl/kubernetes.pem --

from

-file=

/etc/

kubernetes/ssl/kubernetes-key.pem secret

"etcd-certs"

created/<code>

注:如果是kubeadm部署的使用kubectl get pod etcd-master -n kube-system -o yaml查看證書

然後將上面創建的 etcd-certs 對象配置到 prometheus 資源對象中,直接更新 prometheus 資源對象即可:

cat prometheus-prometheus.yaml

<code>

apiVersion:

monitoring.coreos.com/v1

kind:

Prometheus

metadata:

labels:

prometheus:

k8s

name:

k8s

namespace:

monitoring

spec:

alerting:

alertmanagers:

-

name:

alertmanager-main

namespace:

monitoring

port:

web

image:

quay.io/prometheus/prometheus:v2.16.0

nodeSelector:

kubernetes.io/os:

linux

podMonitorNamespaceSelector:

{}

podMonitorSelector:

{}

replicas:

2

secrets:

-

etcd-certs

resources:

requests:

memory:

2048Mi

ruleSelector:

matchLabels:

prometheus:

k8s

role:

alert-rules

securityContext:

fsGroup:

2000

runAsNonRoot:

true

runAsUser:

1000

serviceAccountName:

prometheus-k8s

serviceMonitorNamespaceSelector:

{}

serviceMonitorSelector:

{}

version:

v2.16.0

/<code>

直接執行prometheus-prometheus.yaml

<code>

kubectl

apply

-f

prometheus-prometheus

.yaml

/<code>

更新完成後,我們就可以在 Prometheus 的 Pod 中獲取到上面創建的 etcd 證書文件了,具體的路徑我們可以進入 Pod 中查看:


創建 ServiceMonitor

現在 Prometheus 訪問 etcd 集群的證書已經準備好了,接下來創建 ServiceMonitor 對象即可(prometheus-serviceMonitorEtcd.yaml)

<code>

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:

30s

scheme:

https

tlsConfig:

caFile:

/etc/prometheus/secrets/etcd-certs/ca.pem

certFile:

/etc/prometheus/secrets/etcd-certs/kubernetes.pem

keyFile:

/etc/prometheus/secrets/etcd-certs/kubernetes-key.pem

insecureSkipVerify:

true

selector:

matchLabels:

k8s-app:

etcd

namespaceSelector:

matchNames:

-

kube-system

/<code>

關於 ServiceMonitor 屬性的更多用法可以查看文檔https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#endpoint

直接創建這個 ServiceMonitor 對象:

<code>

kubectl

apply

-f

prometheus-serviceMonitorEtcd

.yaml

/<code>

創建 Service

ServiceMonitor 創建完成了,但是現在還沒有關聯的對應的 Service 對象,所以需要我們去手動創建一個 Service 對象(prometheus-kubeEtcdService.yaml):

<code>

apiVersion:

v1

kind:

Service

metadata:

labels:

k8s-app:

etcd

name:

etcd-k8s

namespace:

kube-system

spec:

ports:

-

name:

port

port:

2379

protocol:

TCP

type:

ClusterIP

clusterIP:

None

apiVersion:

v1

kind:

Endpoints

metadata:

name:

etcd-k8s

namespace:

kube-system

labels:

k8s-app:

etcd

subsets:

-

addresses:

-

ip:

10.6

.2

.121

nodeName:

etcd1

-

ip:

10.6

.2

.122

nodeName:

etcd2

-

ip:

10.6

.2

.123

nodeName:

etcd3

ports:

-

name:

port

port:

2379

protocol:

TCP

/<code>

我們這裡創建的 Service 沒有采用前面通過 label 標籤的形式去匹配 Pod 的做法,因為前面我們說過很多時候我們創建的 etcd 集群是獨立於集群之外的,這種情況下面我們就需要自定義一個 Endpoints,要注意 metadata 區域的內容要和 Service 保持一致,Service 的 clusterIP 設置為 None。

Endpoints 的 subsets 中填寫 etcd 集群的地址即可,我們這裡是單節點的,直接創建該 Service 資源:

<code>/<code>

創建完成後,隔一會兒去 Prometheus 的 Dashboard 中查看 targets,便會有 etcd 的監控項了:


grafana展示: