写点什么

Prometheus 多集群监控的 3 种方案,你选哪种?

  • 2024-03-14
    广东
  • 本文字数:3102 字

    阅读完需:约 10 分钟

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: v1kind: ServiceAccountmetadata:  name: prometheus-test  namespace: kube-system
---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRolemetadata: name: prometheus-testrules:- 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/v1kind: ClusterRoleBindingmetadata: name: prometheus-testroleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: prometheus-testsubjects:- 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 可获取多个集群数据



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


发布于: 刚刚阅读数: 5
用户头像

提供全面深入的云计算技术干货 2020-07-14 加入

生于云,长于云,让开发者成为决定性力量

评论

发布
暂无评论
Prometheus多集群监控的3种方案,你选哪种?_后端_华为云开发者联盟_InfoQ写作社区