
# 使用Prometheus监控多个集群
#### 应用场景
通常情况下，用户的集群数量不止一个，例如生产集群、测试集群、开发集群等。如果在每个集群安装Prometheus监控集群里的业务各项指标的话，很大程度上提高了维护成本和资源成本，同时数据也不方便汇聚到一块查看，这时候可以通过部署一套Prometheus，对接监控多个集群的指标信息。
#### 方案架构
将多个集群对接到同一个Prometheus监控系统，如下所示，节约维护成本和资源成本，且方便汇聚监控信息。
![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000001352090724.png "点击放大")
#### 前提条件
- 目标集群已创建。
- Prometheus与目标集群之间网络保持连通。
- 已在一台Linux主机中使用二进制文件安装Prometheus，详情请参见[Installation](https://prometheus.io/docs/prometheus/latest/installation/)。
 
#### 操作步骤
1. 分别获取目标集群的bearer_token 信息。 
   1. 在目标集群创建rbac权限。
      登录到目标集群后台节点，创建prometheus_rbac.yaml文件。
      ```
      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
      ```
      执行以下命令创建rbac权限。
      **kubectl apply -f prometheus_rbac.yaml**
      
   
   2. 获取目标集群bearer_token信息。
      ![](https://support.huaweicloud.com/bestpractice-cce/public_sys-resources/note_3.0-zh-cn.png)
      - 1.21以前版本的集群中，Pod中获取Token的形式是通过挂载ServiceAccount的Secret来获取Token，这种方式获得的Token是永久的。该方式在1.21及以上的版本中不再推荐使用，并且根据社区版本迭代策略，在1.25及以上版本的集群中，ServiceAccount将不会自动创建对应的Secret。 1.21及以上版本的集群中，直接使用[TokenRequest](https://kubernetes.io/zh-cn/docs/reference/kubernetes-api/authentication-resources/token-request-v1/) API[获得Token](https://kubernetes.io/zh-cn/docs/reference/access-authn-authz/service-accounts-admin/#bound-service-account-token-volume)，并使用投射卷（Projected Volume）挂载到Pod中。使用这种方法获得的Token具有固定的生命周期，并且当挂载的Pod被删除时这些Token将自动失效。详情请参见[Token安全性提升说明](https://support.huaweicloud.com/usermanual-cce/cce_10_0477.html)。
        
      
      - 如果您在业务中需要一个永不过期的Token，您也可以选择[手动管理ServiceAccount的Secret](https://kubernetes.io/zh-cn/docs/reference/access-authn-authz/service-accounts-admin/#manual-secret-management-for-serviceaccounts)。尽管存在手动创建永久ServiceAccount Token的机制，但还是推荐使用[TokenRequest](https://kubernetes.io/zh-cn/docs/reference/kubernetes-api/authentication-resources/token-request-v1/)的方式使用短期的Token，以提高安全性。
       
      首先获取serviceaccount信息。
      **kubectl describe sa prometheus-test -n kube-system**
      ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000001403252957.png "点击放大")
      **kubectl describe secret prometheus-test-token-hdhkg -n kube-system**
      ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000001352573116.png "点击放大")
      记录下这个token值，就是要搜集的bearer_token信息。
      
   
   
   
   
2. 配置bearer_token 信息。 
   登录到Prometheus所在机器，进入Prometheus的安装目录，将目标集群的token信息保存在文件中。
   ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000001352413288.png "点击放大")
   
   
3. 配置Prometheus监控job。 
   示例job监控的是容器指标。如果需要监控其他指标，可自行添加job编写抓取规则。
   ```
   - job_name: k8s_cAdvisor
       scheme: https
       bearer_token_file: k8s_token #上一步中的token文件
       tls_config:
         insecure_skip_verify: true
       kubernetes_sd_configs:  #kubernetes 自动发现配置
       - role: node    #node类型的自动发现
         bearer_token_file: k8s_token #上一步中的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
         replacement: xxxxx   ##根据实际情况填写 集群信息。也可不写
   ###下面这个job是监控另一个集群
     - job_name: k8s02_cAdvisor
       scheme: https
       bearer_token_file: k8s02_token #上一步中的token文件
       tls_config:
         insecure_skip_verify: true
       kubernetes_sd_configs: 
       - role: node    
         bearer_token_file: k8s02_token #上一步中的token文件
         api_server: https://192.168.0.147:5443  #K8s集群 apiserver地址
         tls_config:
           insecure_skip_verify: true   #跳过对服务端的认证
       relabel_configs:  ##用于在抓取metrics之前修改target的已有标签
       - 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: xxxx    ##根据实际情况填写 集群信息。也可不写
   ```
   
   
4. 启动prometheus服务。 
   配置完毕后，启动prometheus服务
   **./prometheus --config.file=prometheus.yml**
   
   
5. 登录prometheus服务访问页面，查看监控信息。 
   ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000001352253356.png "点击放大")
   ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000001654458777.png "点击放大")
   
   
 
