Prometheus多叢集監控的3種方案,你選哪種?

华为云开发者联盟發表於2024-03-14

本文分享自華為雲社群《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
從目標叢集獲取token憑證

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

Prometheus多叢集監控的3種方案,你選哪種?

將對應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

Prometheus多叢集監控的3種方案,你選哪種?

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的訪問地址

Prometheus多叢集監控的3種方案,你選哪種?

3.3 prometheus remote write模式操作

Remote Write支援將k8s叢集內Prometheus採集的metrics寫到遠端儲存中,遠端儲存可以是Prometheus,也可以是其他時序資料庫。在使用者使用的時候,直接從遠端儲存中讀取資料,並提供全域性檢視。

以下以華為雲CCE監控外掛kube-prometheus-stack為例。(開源Promethues需要手動進行配置)

被寫入prometheus需要開啟web.enable-remote-write-receiver,表示本prometheus接受來著其他prometheus的遠端寫入

Prometheus多叢集監控的3種方案,你選哪種?

需要採集指標的叢集中安裝kube-prometheus-stack外掛

Prometheus多叢集監控的3種方案,你選哪種?

部署模式採用Agent模式,引數配置對接第三方,資料上報地址為遠端儲存的地址。如果遠端是prometheus-server,可以填寫: http://ip:port/api/v1/write

檢視kube-prometheus-stack agent日誌,確認remote write成功

Prometheus多叢集監控的3種方案,你選哪種?

確認中心prometheus可獲取多個叢集資料

Prometheus多叢集監控的3種方案,你選哪種?

點選關注,第一時間瞭解華為雲新鮮技術~

相關文章