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

本文分享自華爲雲社區《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

將對應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可獲取多個集羣數據

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章