使用prometheus监控多k8s集群 多个集群

2023-05-16

原文:
https://cloud.tencent.com/developer/article/1402436

1 需求分析:

遇到一个需求,要使用prometheus监控多个k8s集群。

调研发现prometheus配合node_exporter、kube-state-metrics可以很方便地采集单个集群的监控指标。因此最初的构想是在每套k8s集群里部署prometheus,由它采集该集群的监控指标,再运用prometheus的联邦模式将多个prometheus中的监控数据聚合采集到一个中心prometheus里来,参考模型为Hierarchical federation 链接:(https://prometheus.io/docs/prometheus/latest/federation/#hierarchical-federation)。

但甲方觉得上述方案中每个k8s集群都要部署prometheus,增加了每套k8s集群的资源开销,希望全局只部署一套prometheus,由它统一采集多个k8s集群的监控指标。尽管个人不太认可这种方案,中心prometheus今后很有可能成为性能瓶颈,但甲方要求的总得尽力满足,下面开始研究如何用一个prometheus采集多个k8s集群的监控指标。

2 步骤

1 prometheus采集当前k8s监控数据

2 prometheus采集其它k8s监控数据
从上述分析来看,假设其它k8s部署了node_exporter和kube-state-metrics,用prometheus采集其它k8s集群的监控数据也是可行的,只需要解决两个问题:

设置好kubernetes_sd_configs,让其可通过其它k8s集群的apiserver发现抓取的endpionts。
设置好relabel_configs,构造出访问其它k8s集群中的service, pod, node等endpoint URL。

3 实施参考

# 假设就部署在default命名空间
helm install --name prometheus --namespace default stable/prometheus

部署完毕之后,由于默认并没有创造任何ingress资源对象,创建的service的类型也仅仅是ClusterIP,所以从集群外部是没法访问到它的,不过可以简单地将端口映射出来,如下:

kubectl -n default port-forward service/prometheus-server 30080:80

这里使用了kubectl port-forward命令,详细使用方法参考这里。

然后用浏览器访问http://127.0.0.1:30080/graph,就可访问到prometheus的WebConsole了。

访问http://127.0.0.1:30080/config可以看到当前prometheus的配置,其中抓取当前k8s集群监控指标的配置如下:

scrape_configs:
# 抓取当前prometheus的监控指标
- job_name: prometheus
  scrape_interval: 1m
  scrape_timeout: 10s
  metrics_path: /metrics
  scheme: http
  static_configs:
  - targets:
    - localhost:9090
# 通过kubernetes_sd_configs发现机制,通过apiserver的接口列出当前k8s集群中endpoints列表,匹配到apiserver的endpoint,从该endpoint抓取apiserver的监控指标
- job_name: kubernetes-apiservers
  scrape_interval: 1m
  scrape_timeout: 10s
  metrics_path: /metrics
  scheme: https
  kubernetes_sd_configs:
  - role: endpoints
  bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
  tls_config:
    ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
    insecure_skip_verify: true
  relabel_configs:
  - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
    separator: ;
    regex: default;kubernetes;https
    replacement: $1
    action: keep
# 通过kubernetes_sd_configs发现机制,通过apiserver的接口列出当前k8s集群中node列表,从node列表中每个node抓取node的监控指标(kubelet通过/metrics接口将node的监控指标export出来了)
- job_name: kubernetes-nodes
  scrape_interval: 1m
  scrape_timeout: 10s
  metrics_path: /metrics
  scheme: https
  kubernetes_sd_configs:
  - role: node
  bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
  tls_config:
    ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
    insecure_skip_verify: true
  relabel_configs:
  - separator: ;
    regex: __meta_kubernetes_node_label_(.+)
    replacement: $1
    action: labelmap
  - separator: ;
    regex: (.*)
    target_label: __address__
    replacement: kubernetes.default.svc:443
    action: replace
  - source_labels: [__meta_kubernetes_node_name]
    separator: ;
    regex: (.+)
    target_label: __metrics_path__
    replacement: /api/v1/nodes/${1}/proxy/metrics
    action: replace
# 通过kubernetes_sd_configs发现机制,通过apiserver的接口列出当前k8s集群中node列表,从node列表中每个node抓取cadvisor的监控指标(kubelet通过/metrics/cadvisor接口将cadvisor的监控指标export出来了)
- job_name: kubernetes-nodes-cadvisor
  scrape_interval: 1m
  scrape_timeout: 10s
  metrics_path: /metrics
  scheme: https
  kubernetes_sd_configs:
  - role: node
  bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
  tls_config:
    ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
    insecure_skip_verify: true
  relabel_configs:
  - separator: ;
    regex: __meta_kubernetes_node_label_(.+)
    replacement: $1
    action: labelmap
  - separator: ;
    regex: (.*)
    target_label: __address__
    replacement: kubernetes.default.svc:443
    action: replace
  - source_labels: [__meta_kubernetes_node_name]
    separator: ;
    regex: (.+)
    target_label: __metrics_path__
    replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor
    action: replace
# 通过kubernetes_sd_configs发现机制,通过apiserver的接口列出当前k8s集群中endpoints列表,匹配到打了prometheus_io_scrape: true annotation的endpoint,从匹配到的endpoint列表中每个endpoint抓取该endpoint暴露的监控指标
- job_name: kubernetes-service-endpoints
  scrape_interval: 1m
  scrape_timeout: 10s
  metrics_path: /metrics
  scheme: http
  kubernetes_sd_configs:
  - role: endpoints
  relabel_configs:
  - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]
    separator: ;
    regex: "true"
    replacement: $1
    action: keep
  - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme]
    separator: ;
    regex: (https?)
    target_label: __scheme__
    replacement: $1
    action: replace
  - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path]
    separator: ;
    regex: (.+)
    target_label: __metrics_path__
    replacement: $1
    action: replace
  - source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]
    separator: ;
    regex: ([^:]+)(?::\d+)?;(\d+)
    target_label: __address__
    replacement: $1:$2
    action: replace
  - separator: ;
    regex: __meta_kubernetes_service_label_(.+)
    replacement: $1
    action: labelmap
  - source_labels: [__meta_kubernetes_namespace]
    separator: ;
    regex: (.*)
    target_label: kubernetes_namespace
    replacement: $1
    action: replace
  - source_labels: [__meta_kubernetes_service_name]
    separator: ;
    regex: (.*)
    target_label: kubernetes_name
    replacement: $1
    action: replace
# 通过kubernetes_sd_configs发现机制,通过apiserver的接口列出当前k8s集群中service列表,匹配到打了prometheus_io_scrape: pushgateway annotation的service,从匹配到的service列表中每个service抓取该service暴露的监控指标
- job_name: prometheus-pushgateway
  honor_labels: true
  scrape_interval: 1m
  scrape_timeout: 10s
  metrics_path: /metrics
  scheme: http
  kubernetes_sd_configs:
  - role: service
  relabel_configs:
  - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_probe]
    separator: ;
    regex: pushgateway
    replacement: $1
    action: keep
# 通过kubernetes_sd_configs发现机制,通过apiserver的接口列出当前k8s集群中service列表,匹配到打了prometheus_io_scrape: true annotation的service,从匹配到的service列表中每个service抓取该service暴露的监控指标(这里通过blackbox这个服务来抓取,需要在prometheus所在的namespace部署blackbox服务)
- job_name: kubernetes-services
  params:
    module:
    - http_2xx
  scrape_interval: 1m
  scrape_timeout: 10s
  metrics_path: /probe
  scheme: http
  kubernetes_sd_configs:
  - role: service
  relabel_configs:
  - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_probe]
    separator: ;
    regex: "true"
    replacement: $1
    action: keep
  - source_labels: [__address__]
    separator: ;
    regex: (.*)
    target_label: __param_target
    replacement: $1
    action: replace
  - separator: ;
    regex: (.*)
    target_label: __address__
    replacement: blackbox
    action: replace
  - source_labels: [__param_target]
    separator: ;
    regex: (.*)
    target_label: instance
    replacement: $1
    action: replace
  - separator: ;
    regex: __meta_kubernetes_service_label_(.+)
    replacement: $1
    action: labelmap
  - source_labels: [__meta_kubernetes_namespace]
    separator: ;
    regex: (.*)
    target_label: kubernetes_namespace
    replacement: $1
    action: replace
  - source_labels: [__meta_kubernetes_service_name]
    separator: ;
    regex: (.*)
    target_label: kubernetes_name
    replacement: $1
    action: replace
# 通过kubernetes_sd_configs发现机制,通过apiserver的接口列出当前k8s集群中pod列表,匹配到打了prometheus_io_scrape: true annotation的pod,从匹配到的pod列表中每个pod抓取该pod暴露的监控指标
- job_name: kubernetes-pods
  scrape_interval: 1m
  scrape_timeout: 10s
  metrics_path: /metrics
  scheme: http
  kubernetes_sd_configs:
  - role: pod
  relabel_configs:
  - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
    separator: ;
    regex: "true"
    replacement: $1
    action: keep
  - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
    separator: ;
    regex: (.+)
    target_label: __metrics_path__
    replacement: $1
    action: replace
  - source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]
    separator: ;
    regex: ([^:]+)(?::\d+)?;(\d+)
    target_label: __address__
    replacement: $1:$2
    action: replace
  - separator: ;
    regex: __meta_kubernetes_pod_label_(.+)
    replacement: $1
    action: labelmap
  - source_labels: [__meta_kubernetes_namespace]
    separator: ;
    regex: (.*)
    target_label: kubernetes_namespace
    replacement: $1
    action: replace
  - source_labels: [__meta_kubernetes_pod_name]
    separator: ;
    regex: (.*)
    target_label: kubernetes_pod_name
    replacement: $1
    action: replace

首先是一小段prometheus的抓取配置,官方解释在这里,这个比较简单,就不具体解释了

- job_name: kubernetes-service-endpoints
  scrape_interval: 1m
  scrape_timeout: 10s
  metrics_path: /metrics
  scheme: http

然后说明是用k8s的发现机制去发现抓取地址的:

  kubernetes_sd_configs:
  - role: endpoints

prometheus里k8s的发现机制配置见这里,注意这里没填api_server属性,因此用了默认值kubernetes.default.svc。

然后是一段relabel_configs配置,其作用主要是用于匹配最终要抓取的endpoint,构造抓取的地址,甚至给最终的时序指标加上一些label。这里以apiserver发现的node_exporter endpoint信息为例,在没有relabel之前,其endpoint信息如下:

。。。略

具体参考原文:https://cloud.tencent.com/developer/article/1402436

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用prometheus监控多k8s集群 多个集群 的相关文章

  • 在ubuntu连接Xlight FTP Server

    一 在windows上搭建服务器 http www xlightftpd com download htm 使用英文版 xff0c 使防止在ubuntu中登录中文版时 xff0c 显示乱码 新建用户和用户对应的服务器目录 如下所示 xff0
  • xinetd服务

    检查xinetd服务是否安装 lkmao 64 ubuntu ps au grep xinetd lkmao 2536 0 0 0 1 11760 2172 pts 0 S 43 06 17 0 00 grep color 61 auto
  • ssh免密登录mobaxterm使用方法

    1 如果要在服务器上添加两个公钥 xff0c 在服务器 ssh authorized keys上添加公钥 xff0c 在第一个公钥的下一行添加第二个公钥即可 xff1b 2 在mobaxterm上使用公私钥免密登录时 xff0c 需要在se
  • eclipse和ubuntu使用小技巧

    1 在当前界面查找某一关键字ctrl 43 f 然后在当前界面切换关键字下一个是ctrl 43 k 上一个是ctrl 43 shift 43 k 2 打开一个新的页面要激活输入法切换是ctrl 43 sapce
  • 关于pixhawk2.1+px4 1.7.3stable出现mag sensors inconsistent问题分析

    因为前两天在学校测试代码时 xff0c 飞机在mission模式下突然出现在每一个mission点都会停留两三分钟的问题 xff0c 而且偏航还一直在旋转 xff0c QGC上也会提示mag sensors inconsistent 于是考
  • px4+pixhawk2.1使用出现无sensors问题

    今天外场试飞突然发现地面站无法检测到sensors xff0c 距离上一次正常试飞没有进行任何操作 xff0c 怀疑可能是飞控板子上面的cube接触不良 xff0c 于是重新安装了下还是不能解决问题 xff0c 重新刷px4官方固件也是不能
  • Ubuntu安装之后卡顿解决方法

    前两天刚为电脑装了Ubuntu18 04 xff0c 然后发现很卡 这就奇怪了 xff0c 我这电脑在Windows运行还挺流畅的 xff0c 难道是系统是真的卡 xff1f 后来百度之后 xff0c 发现可能是以下两点原因 xff1a 1
  • AdGuard Home 安装使用教程

    原文链接 xff1a 使用 Envoy 和 AdGuard Home 阻挡烦人的广告 通常我们使用网络时 xff0c 宽带运营商会为我们分配一个 DNS 服务器 这个 DNS 通常是最快的 xff0c 距离最近的服务器 xff0c 但会有很
  • gdb调试段错误

    https blog csdn net Deutschester article details 6739861
  • 嵌入式开发:C++在深度嵌入式系统中的应用

    深度嵌入式系统通常在C语言中实现 为什么会这样 这样的系统是否也能从C 43 43 中获益 嵌入式开发人员在将广泛 高效的深度嵌入式代码库从C转换为C 43 43 方面的实践经验的贡献 嵌入式和深度嵌入式系统通常用C而不是C 43 43 实
  • Kalman滤波在船舶GPS导航定位系统中的应用

    matlab程序如下 xff1a function GPS clc clear T 61 1 雷达扫描周期 N 61 80 T 总采样次数 X 61 zeros 4 N 目标真实位置 速度 xff08 X Vx xff0c Y Vy xff
  • 通信协议详解(一):UART串口(协议+数据格式+设计实现)

    uart串口通信协议及verilog实现 文章目录 一 uart串口通信简介二 串口传输1 数据协议2 整体架构 三 串口传输实现1 发送模块2 接收模块 四 串口收发仿真总结 一 uart串口通信简介 通用异步收发器 UART xff08
  • Asterisk PJSIP中继(IMS)呼叫开启VoLTE手机出现一接通就自动挂机问题

    目录 一 问题描述 二 分析过程 1 网络抓SIP协议包 三 解决办法 版权声明 本文为博主 宽简厚重 Yuesichiu 原创文章 未经博主允许不得转载 https blog csdn net yuesichiu article deta
  • Asterisk支持从P-Preferred-Identity/P-Asserted-Identity/Remote-Party-ID中获取CID和DID

    一 概述 nbsp nbsp nbsp nbsp 主叫身份识别是指用于给被叫用户显示主叫呼入信息 被叫身份识别是指被叫接收到远端呼入后 如何识别被叫信息确实是呼叫自身 在IMS中 针对From To头域比较淡化 作为主被叫识别的关键头域为新
  • Asterisk修改res_pjsip以支持IMS VoLTE tel URI Scheme

    一 概述 nbsp nbsp Asterisk 13 0 0到Asterisk 16 15 0这些官方版本都是不支持IMS VoLTE tel URI scheme RFC3966 假如将Asterisk部署在这几个版本环境中不可避免地会遇
  • OpenCV图像处理——拉普拉斯金字塔

    拉普拉斯金字塔主要用于重建图像 xff0c 拉普拉斯就是为了在放大图像的时候 xff0c 可以预测残差 xff0c 何为残差 xff0c 即小图像放大的时候 xff0c 需要插入一些像素值 xff0c 在上文直接插入的是 0 xff0c 拉
  • OpenCV图像处理——数字图像处理基本操作

    1 读取和显示图像 xff1a 1 1 cv2 imread 函数 xff0c 原型 xff1a cv2 imread filename flags 参数 xff1a filepath xff1a 读入imge的完整路径 flags xff
  • 海思平台水印功能实现之二定时器Timer

    定时器可以自己创建或者直接使用POSIX Timer 我们这边水印每隔1秒刷新时间的时候使用的是POSIX Timer POSIX timer相关的操作 主要包括创建一个timer timer create 设定timer timer se
  • 机器视觉模型——投影矩阵

    1 概述 机器视觉就是用机器代替人眼和人脑来做测量和判断 机器视觉系统工作的基本过程是获取目标的图像后 xff0c 对图像进行识别 特征提取 分类 数学运算等分析操作 xff0c 并根据图像的分析计算结果 xff0c 来对相应的系统进行控制
  • 2014英伟达校园招聘-上海

    时间 xff1a 2013 10 19 地点 xff1a 上海交通大学中院楼 申请职位 xff1a 嵌入式系统工程师 1 指针数组和数组指针 函数指针 指针函数 2 存储对齐 3 Getmemory问题 4 6进制转换成10进制 5 时钟方

随机推荐