prometheus-operator 監控 k8s 外部集群


其實監控 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

image-20200907105741840

關於 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 被監控到了

image-20200907110826673

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

image-20200907111001939

監空集群外部主機信息

其實道理和上面的大大致相同,總結大概的幾個步驟

1,在需要監控的機器上部署 exporter

2,在 k8s 集群內部創建 serviceMonitor

3,然后創建 svc ,創建 endpoint

4,在 grafana 創建 dashboard

5,添加配置告警信息

具體操作大家可以自己來實踐。這里不過多贅述。21


免責聲明!

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



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