本文分享自华为云社区《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: 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: 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可获取多个集群数据
1.本站内容仅供参考,不作为任何法律依据。用户在使用本站内容时,应自行判断其真实性、准确性和完整性,并承担相应风险。
2.本站部分内容来源于互联网,仅用于交流学习研究知识,若侵犯了您的合法权益,请及时邮件或站内私信与本站联系,我们将尽快予以处理。
3.本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
4.根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
5.本站是非经营性个人站点,所有软件信息均来自网络,所有资源仅供学习参考研究目的,并不贩卖软件,不存在任何商业目的及用途
暂无评论内容