介紹
上節課和大家講解了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展示: