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可获取多个集群数据

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

相关推荐
李少兄3 小时前
Kubernetes 日志管理
docker·容器·kubernetes
秋饼3 小时前
【K8S测试程序--git地址】
git·容器·kubernetes
oMcLin3 小时前
如何在RHEL 9上配置并优化Kubernetes 1.23高可用集群,提升大规模容器化应用的自动化部署与管理?
kubernetes·自动化·php
ghostwritten3 小时前
Kubernetes 网络模式深入解析?
网络·容器·kubernetes
OpsEye3 小时前
Redis 内存碎片的隐形消耗——如何用 memory purge 命令释放空间?
运维·网络·数据库·redis·缓存·内存·监控
原神启动14 小时前
K8S(七)—— Kubernetes Pod 基础概念与实战配置
云原生·容器·kubernetes
不想画图4 小时前
Kubernetes(五)——rancher部署和Pod详解
linux·kubernetes·rancher
大都督老师4 小时前
配置 containerd 使用镜像加速器拉取 Docker Hub 镜像
容器·kubernetes·k8s
木童66215 小时前
Kubernetes 操作管理完全指南:从陈述式到声明式,覆盖全生命周期
云原生·容器·kubernetes
不想画图16 小时前
Kubernetes(三)——组网概念和基础操作指令
云原生·容器·kubernetes