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 等权限

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

从目标集群获取token凭证

1.21以前版本的集群中,Pod中获取Token的形式是通过挂载ServiceAccount的Secret来获取Token,这种方式获得的Token是永久的。该方式在1.21及以上的版本中不再推荐使用,并且根据社区版本迭代策略,在1.25及以上版本的集群中,ServiceAccount将不会自动创建对应的Secret。可参考kubernetes官方提供的如何创建长期token: kubernetes.io/zh-cn/docs/...

将对应token保存为文件,为了演示便利,本Prometheus使用虚拟形态部署

在prometheus配置中写入其他集群信息,并启动

yaml 复制代码
- 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数据进行汇总。

增加联邦配置信息,并重启

csharp 复制代码
  - 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可获取多个集群数据

点击关注,第一时间了解华为云新鲜技术~

相关推荐
荣光波比21 小时前
K8S(一)—— 云原生与Kubernetes(K8S)从入门到实践:基础概念与操作全解析
云原生·容器·kubernetes
hello_2501 天前
k8s基础监控promql
云原生·容器·kubernetes
用户6120414922131 天前
C语言做的物联网设备数据采集模拟器
c语言·后端·敏捷开发
静谧之心1 天前
在 K8s 上可靠运行 PD 分离推理:RBG 的设计与实现
云原生·容器·golang·kubernetes·开源·pd分离
1024find1 天前
Spark on k8s部署
大数据·运维·容器·spark·kubernetes
能不能别报错2 天前
K8s学习笔记(十六) 探针(Probe)
笔记·学习·kubernetes
能不能别报错2 天前
K8s学习笔记(十四) DaemonSet
笔记·学习·kubernetes
火星MARK2 天前
k8s面试题
容器·面试·kubernetes
赵渝强老师2 天前
【赵渝强老师】Docker容器的资源管理机制
linux·docker·容器·kubernetes
能不能别报错2 天前
K8s学习笔记(十五) pause容器与init容器
笔记·学习·kubernetes