本文分享自華為雲社群《Prometheus多叢集監控方案》,作者: 可以交個朋友。
一、背景
不少使用者在k8s叢集外裸機環境部署了prometheus監控元件想要查詢k8s叢集的監控指標,又或者是想採集多個k8s叢集中的節點指標,容器指標,master元件指標等。
二、Prometheus多叢集監控能力介紹
當前透過Prometheus採集多套k8s叢集中的容器指標通常有三種方式。
- 透過APIServer代理的方式獲取k8s叢集指標,直接在prometheus.yml配置相關其他kubernetes叢集資訊,實現一個prometheus同時採集多個kubernetes叢集資訊
-
透過prometheus 聯邦模式,實現一個prometheus拉取其他prometheus 資料
-
透過Prometheus Agent模式remote write遠端儲存,實現多個prometheus向同一個prometheus 輸出資料(推薦)
三種方式對比分析
- APIServer方式解決了資料冗餘的方式,但是引入了配置的複雜性。同時隨著k8s叢集規模擴大,走APIServer代理請求獲取叢集指標資料對AIserver負載過大。
- Prometheus聯邦機制相對來說配置簡單,最早的多叢集監控方案。但是缺點也很明顯: 佔用資源較多,出現資料冗餘; global Prometheus 彙總葉子Prometheus資料,處理資料壓力大。
-
Prometheus Agent remote write方案配置簡單,可以解決多叢集監控資料冗餘問題。同時可在remotewrite中配置過濾規則,減輕遠端Prometheus資料處理壓力
綜上所述關於多叢集監控方式,比較推薦Prometheus Agent remote write方案
三、配置實現
3.1 一個prometheus同時採集多個kubernetes叢集操作
promethues透過配置bearer token,利用apiserver 代理的的形式,獲取k8s叢集的node指標,容器指標。
在目標叢集建立Prometheus訪問Kubernetes資源物件的RBAC資源kubectl apply -f prometheus_rbac.yaml,目的為了Prometheus使用該serviceAccount能夠自動發現叢集相關資源,並擁有執行get list 等許可權
apiVersion: v1 kind: ServiceAccount metadata: name: prometheus-test namespace: kube-system --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: prometheus-test rules: - apiGroups: - "" resources: - nodes - services - endpoints - pods - nodes/proxy verbs: - get - list - watch - apiGroups: - "extensions" resources: - ingresses verbs: - get - list - watch - apiGroups: - "" resources: - configmaps - nodes/metrics verbs: - get - nonResourceURLs: - /metrics verbs: - get --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: prometheus-test roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: prometheus-test subjects: - kind: ServiceAccount name: prometheus-test namespace: kube-system
1.21以前版本的叢集中,Pod中獲取Token的形式是透過掛載ServiceAccount的Secret來獲取Token,這種方式獲得的Token是永久的。該方式在1.21及以上的版本中不再推薦使用,並且根據社群版本迭代策略,在1.25及以上版本的叢集中,ServiceAccount將不會自動建立對應的Secret。可參考kubernetes官方提供的如何建立長期token: https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-service-account/#manually-create-an-api-token-for-a-serviceaccount
將對應token儲存為檔案,為了演示便利,本Prometheus使用虛擬形態部署
在prometheus配置中寫入其他叢集資訊,並啟動- job_name: k8s_cAdvisor scheme: https bearer_token_file: k8s_token tls_config: insecure_skip_verify: true kubernetes_sd_configs: #kubernetes 自動發現配置 - role: node #node型別的自動發現 bearer_token_file: k8s_token #步驟1中建立的token檔案 api_server: https://192.168.0.153:5443 #k8s叢集 apiserver地址 tls_config: insecure_skip_verify: true #跳過對服務端的認證 relabel_configs: #用於在抓取metrics之前修改target的已有標籤 - target_label: __address__ replacement: 192.168.0.153:5443 action: replace ##將metrics_path地址轉換為/api/v1/nodes/${1}/proxy/metrics/cadvisor #相當於透過APIServer代理到kubelet上獲取資料 - source_labels: [__meta_kubernetes_node_name] #指定我們需要處理的源標籤 regex: (.+) #匹配源標籤的值,(.+)表示源標籤什麼值都可以匹配上 target_label: __metrics_path__ #指定了需要replace後的標籤 replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor # 表示替換後的標籤即__metrics_path__ 對應的值。其中${1}表示正則匹配的值,即nodename - target_label: cluster 為該叢集下的node節點打上cluster標籤便於分組管理 replacement: k8s #為cluster標籤賦值,值可以是叢集名稱或者其他唯一識別符號 ###該job用於監控另一個叢集 - job_name: k8s02_cAdvisor scheme: https bearer_token_file: k8s02_token tls_config: insecure_skip_verify: true kubernetes_sd_configs: - role: node bearer_token_file: k8s02_token #步驟1中建立的token檔案 api_server: https://192.168.0.147:5443 tls_config: insecure_skip_verify: true relabel_configs: - target_label: __address__ replacement: 192.168.0.147:5443 action: replace - source_labels: [__meta_kubernetes_node_name] regex: (.+) target_label: __metrics_path__ replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor - target_label: cluster replacement: k8s02
啟動prometheus服務: ./prometheus --config.file=prometheus.yml
3.2 prometheus聯邦操作
Prometheus支援拉取其他Prometheus的資料到本地,稱為聯邦機制。這樣我們可以在每個叢集內部署一個Prometheus,然後部署一個global Prometheus用於拉取每個叢集內部的Prometheus資料進行彙總。
增加聯邦配置資訊,並重啟
- job_name: 'federate-k8s01' scrape_interval: 15s honor_labels: true metrics_path: '/federate' #固定配置 params: 'match[]': - '{job="istio-mesh"}' #目標prometheus的監控job列表 ,根據實際情況填寫 - '{job="kubernetes-cadvisor"}' static_configs: - targets: - '100.85.123.205:32298' #目標prometheus的訪問地址
3.3 prometheus remote write模式操作
Remote Write支援將k8s叢集內Prometheus採集的metrics寫到遠端儲存中,遠端儲存可以是Prometheus,也可以是其他時序資料庫。在使用者使用的時候,直接從遠端儲存中讀取資料,並提供全域性檢視。
以下以華為雲CCE監控外掛kube-prometheus-stack為例。(開源Promethues需要手動進行配置)
被寫入prometheus需要開啟web.enable-remote-write-receiver,表示本prometheus接受來著其他prometheus的遠端寫入需要採集指標的叢集中安裝kube-prometheus-stack外掛
部署模式採用Agent模式,引數配置對接第三方,資料上報地址為遠端儲存的地址。如果遠端是prometheus-server,可以填寫: http://ip:port/api/v1/write
檢視kube-prometheus-stack agent日誌,確認remote write成功確認中心prometheus可獲取多個叢集資料
點選關注,第一時間瞭解華為雲新鮮技術~