当前位置:   article > 正文

Prometheus多集群监控的3种方案,你选哪种?_一个prometheus exporter 可以采多个kafka集群的指标吗

一个prometheus exporter 可以采多个kafka集群的指标吗

本文分享自华为云社区《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 等权限

  1. apiVersion: v1
  2. kind: ServiceAccount
  3. metadata:
  4. name: prometheus-test
  5. namespace: kube-system
  6. ---
  7. apiVersion: rbac.authorization.k8s.io/v1
  8. kind: ClusterRole
  9. metadata:
  10. name: prometheus-test
  11. rules:
  12. - apiGroups:
  13. - ""
  14. resources:
  15. - nodes
  16. - services
  17. - endpoints
  18. - pods
  19. - nodes/proxy
  20. verbs:
  21. - get
  22. - list
  23. - watch
  24. - apiGroups:
  25. - "extensions"
  26. resources:
  27. - ingresses
  28. verbs:
  29. - get
  30. - list
  31. - watch
  32. - apiGroups:
  33. - ""
  34. resources:
  35. - configmaps
  36. - nodes/metrics
  37. verbs:
  38. - get
  39. - nonResourceURLs:
  40. - /metrics
  41. verbs:
  42. - get
  43. ---
  44. apiVersion: rbac.authorization.k8s.io/v1
  45. kind: ClusterRoleBinding
  46. metadata:
  47. name: prometheus-test
  48. roleRef:
  49. apiGroup: rbac.authorization.k8s.io
  50. kind: ClusterRole
  51. name: prometheus-test
  52. subjects:
  53. - kind: ServiceAccount
  54. name: prometheus-test
  55. namespace: kube-system
  • 从目标集群获取token凭证

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

    

cke_151.png

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

  • 在prometheus配置中写入其他集群信息,并启动
  1. - job_name: k8s_cAdvisor
  2. scheme: https
  3. bearer_token_file: k8s_token
  4. tls_config:
  5. insecure_skip_verify: true
  6. kubernetes_sd_configs: #kubernetes 自动发现配置
  7. - role: node #node类型的自动发现
  8. bearer_token_file: k8s_token #步骤1中创建的token文件
  9. api_server: https://192.168.0.153:5443 #k8s集群 apiserver地址
  10. tls_config:
  11. insecure_skip_verify: true #跳过对服务端的认证
  12. relabel_configs: #用于在抓取metrics之前修改target的已有标签
  13. - target_label: __address__
  14. replacement: 192.168.0.153:5443
  15. action: replace
  16. ##将metrics_path地址转换为/api/v1/nodes/${1}/proxy/metrics/cadvisor
  17. #相当于通过APIServer代理到kubelet上获取数据
  18. - source_labels: [__meta_kubernetes_node_name] #指定我们需要处理的源标签
  19. regex: (.+) #匹配源标签的值,(.+)表示源标签什么值都可以匹配上
  20. target_label: __metrics_path__ #指定了需要replace后的标签
  21. replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor # 表示替换后的标签即__metrics_path__ 对应的值。其中${1}表示正则匹配的值,即nodename
  22. - target_label: cluster 为该集群下的node节点打上cluster标签便于分组管理
  23. replacement: k8s #为cluster标签赋值,值可以是集群名称或者其他唯一标识符
  24. ###该job用于监控另一个集群
  25. - job_name: k8s02_cAdvisor
  26. scheme: https
  27. bearer_token_file: k8s02_token
  28. tls_config:
  29. insecure_skip_verify: true
  30. kubernetes_sd_configs:
  31. - role: node
  32. bearer_token_file: k8s02_token #步骤1中创建的token文件
  33. api_server: https://192.168.0.147:5443
  34. tls_config:
  35. insecure_skip_verify: true
  36. relabel_configs:
  37. - target_label: __address__
  38. replacement: 192.168.0.147:5443
  39. action: replace
  40. - source_labels: [__meta_kubernetes_node_name]
  41. regex: (.+)
  42. target_label: __metrics_path__
  43. replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor
  44. - target_label: cluster
  45. replacement: k8s02

启动prometheus服务: ./prometheus --config.file=prometheus.yml

cke_152.png

3.2 prometheus联邦操作

Prometheus支持拉取其他Prometheus的数据到本地,称为联邦机制。这样我们可以在每个集群内部署一个Prometheus,然后部署一个global Prometheus用于拉取每个集群内部的Prometheus数据进行汇总。

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

  1. - job_name: 'federate-k8s01'
  2. scrape_interval: 15s
  3. honor_labels: true
  4. metrics_path: '/federate' #固定配置
  5. params:
  6. 'match[]':
  7. - '{job="istio-mesh"}' #目标prometheus的监控job列表 ,根据实际情况填写
  8. - '{job="kubernetes-cadvisor"}'
  9. static_configs:
  10. - targets:
  11. - '100.85.123.205:32298' #目标prometheus的访问地址

cke_153.png

3.3 prometheus remote write模式操作

Remote Write支持将k8s集群内Prometheus采集的metrics写到远程存储中,远程存储可以是Prometheus,也可以是其他时序数据库。在用户使用的时候,直接从远端存储中读取数据,并提供全局视图。

以下以华为云CCE监控插件kube-prometheus-stack为例。(开源Promethues需要手动进行配置)

  • 被写入prometheus需要开启web.enable-remote-write-receiver,表示本prometheus接受来着其他prometheus的远程写入

cke_154.png

  • 需要采集指标的集群中安装kube-prometheus-stack插件

cke_155.png

部署模式采用Agent模式,参数配置对接第三方,数据上报地址为远端存储的地址。如果远端是prometheus-server,可以填写: http://ip:port/api/v1/write

  • 查看kube-prometheus-stack agent日志,确认remote write成功

cke_156.png

  • 确认中心prometheus可获取多个集群数据

cke_157.png

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/273191
推荐阅读
相关标签
  

闽ICP备14008679号