本文分享自華爲雲社區《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可獲取多個集羣數據