其實監控 k8s 外部集群和監控內部集群沒啥區別,大概思路就是把外部資源通過 endpoint的方式給他虛擬成 k8s 集群內部的一個資源,其實下面操作就是有點為了用k8s 而用 k8s 了,有點吃力不討好的架勢,但是我們這里為了學習,可以玩耍
prometheus-operator 監控 etcd
無論是 Kubernetes 集群外的還是使用 Kubeadm 安裝在集群內部的 etcd 集群,我們這里都將其視作集群外的獨立集群,因為對於二者的使用方法沒什么特殊之處。
對於 etcd 集群一般情況下,為了安全都會開啟 https 證書認證的方式,所以要想讓 Prometheus 訪問到 etcd 集群的監控數據,就需要提供相應的證書校驗。由於我們集群是通過二進制安裝的。所以我清楚的知道 etcd 證書存放的位置,kubeadm 安裝的可以通過kubectl get pod etcd-master -n kube-system -o yaml找到證書etcd 證書對應存放的位置
# ll ca.pem client.pem client-key.pem
-rw-r--r--. 1 root root 1326 8月 20 21:16 ca.pem
-rw-------. 1 root root 1675 8月 20 21:16 client-key.pem
-rw-r--r--. 1 root root 1359 8月 20 21:16 client.pem
我們將需要使用到的證書通過 secret 對象保存到集群中去
# # kubectl -n monitoring create secret generic etcd-certs --from-file=./ca.pem --from-file=./client.pem --from-file=./client-key.pem
secret/etcd-certs created
添加證書到 pod 中
# cat prometheus/prometheus-prometheus.yaml
...
podMonitorSelector: {}
replicas: 2
secrets:
- etcd-certs
resources:
requests:
memory: 400Mi
...
更新完成后,我們就可以在 Prometheus 的 Pod 中獲取到上面創建的 etcd 證書文件了,具體的路徑我們可以進入 Pod 中查看:
/etc/prometheus/secrets/etcd-certs $ pwd
/etc/prometheus/secrets/etcd-certs
/etc/prometheus/secrets/etcd-certs $ ls
ca.pem client-key.pem client.pem
創建 ServiceMonitor
現在 Prometheus 訪問 etcd 集群的證書已經准備好了,接下來創建 ServiceMonitor 對象即可(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: 30s
scheme: https
tlsConfig:
caFile: /etc/prometheus/secrets/etcd-certs/ca.crt
certFile: /etc/prometheus/secrets/etcd-certs/healthcheck-client.crt
keyFile: /etc/prometheus/secrets/etcd-certs/healthcheck-client.key
insecureSkipVerify: true
selector:
matchLabels:
k8s-app: etcd
namespaceSelector:
matchNames:
- kube-system
上面我們在 monitoring 命名空間下面創建了名為 etcd-k8s 的 ServiceMonitor 對象,基本屬性和前面章節中的一致,匹配 kube-system 這個命名空間下面的具有 k8s-app=etcd 這個 label 標簽的 Service,jobLabel 表示用於檢索 job 任務名稱的標簽,和前面不太一樣的地方是 endpoints 屬性的寫法,配置上訪問 etcd 的相關證書,endpoints 屬性下面可以配置很多抓取的參數,比如 relabel、proxyUrl,tlsConfig 表示用於配置抓取監控數據端點的 tls 認證,由於證書 serverName 和 etcd 中簽發的可能不匹配,所以加上了 insecureSkipVerify=true

關於 ServiceMonitor 屬性的更多用法可以查看文檔:https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md 了解更多
直接創建這個 ServiceMonitor 對象:
# kubectl apply -f prometheus/prometheus-serviceMonitorEtcd.yaml
servicemonitor.monitoring.coreos.com/etcd-k8s created
創建 service 和 endpoint
ServiceMonitor 創建完成了,但是現在還沒有關聯的對應的 Service 對象,所以需要我們去手動創建一個 Service 對象(prometheus-etcdService.yaml):
apiVersion: v1
kind: Service
metadata:
name: etcd-k8s
namespace: kube-system
labels:
k8s-app: etcd
spec:
type: ClusterIP
clusterIP: None
ports:
- name: port
port: 2379
protocol: TCP
---
apiVersion: v1
kind: Endpoints
metadata:
name: etcd-k8s
namespace: kube-system
labels:
k8s-app: etcd
subsets:
- addresses:
- ip: 192.168.4.77
- ip: 192.168.4.74
- ip: 192.168.4.75
ports:
- name: port
port: 2379
protocol: TCP
我們這里創建的 Service 沒有采用前面通過 label 標簽的形式去匹配 Pod 的做法,因為前面我們說過很多時候我們創建的 etcd 集群是獨立於集群之外的,這種情況下面我們就需要自定義一個 Endpoints,要注意 metadata 區域的內容要和 Service 保持一致,Service 的 clusterIP 設置為 None.
Endpoints 的 subsets 中填寫 etcd 集群的地址即可,
# kubectl apply -f prometheus-etcdService.yaml
service/etcd-k8s created
endpoints/etcd-k8s created
等過一會我們就可以在 prometheus 的 dashboard 中看到 etcd 被監控到了

數據采集到后,可以在 grafana 中導入編號為3070的 dashboard,獲取到 etcd 的監控圖表。

監空集群外部主機信息
其實道理和上面的大大致相同,總結大概的幾個步驟
1,在需要監控的機器上部署 exporter
2,在 k8s 集群內部創建 serviceMonitor
3,然后創建 svc ,創建 endpoint
4,在 grafana 創建 dashboard
5,添加配置告警信息
具體操作大家可以自己來實踐。這里不過多贅述。21
