23.1 k8s监控中标签relabel的应用和原理

news2024/11/30 8:39:22

本节重点介绍 :

  • relabel的源码在 7.7节做过详细的解读
  • 强大的relabel能力 在k8s中的应用
    • 应用1: labelmap 在采集cadvisor指标时 对服务发现标签key名字截取
    • 应用2: 采集pod自定义指标中replace 和 keep的应用
    • 应用3: k8s服务组件采集时的endpoint过滤
    • 应用4: hashmod 解决k8s大集群采集问题
    • 应用5: drop 去掉不想要采集的指标

强大的relabel能力 做标签截取、变换、静态分片

prometheus relabel说明

  • relabel官方文档
  • 其中 action有六个配置项,含义如下
action_name含义
replace将 source_labels 中正则匹配的结果赋值到 target_label中
keep保留source_labels 中正则 匹配的目标
drop去掉source_labels 中正则 匹配的目标
hashmod将source_labels 中正则 匹配的目标 做分片
labelmap将正则匹配到的所有标签名称做替换
labeldrop去掉正则匹配到的标签
labelkeep保留正则匹配到的标签

在采集k8s中relabel的应用

应用1: labelmap 在采集cadvisor指标时 对服务发现标签key名字截取

  • 在采集cadvisor时可以看到服务发现源给添加了很多__meta_kubernetes_node_label_开头的标签
  • image.png
  • /service-discovery页面查看 kubernetes-nodes-cadvisor的结果外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
  • 但是这些标签名字太长了,需要精简。我们使用如下的relabel配置
relabel_configs:
- separator: ;
  regex: __meta_kubernetes_node_label_(.+)
  replacement: $1
  action: labelmap
  • 以这个标签为例,__meta_kubernetes_node_label_kubernetes_io_os="linux"
  • 上面的配置代表匹配_meta_kubernetes_node_label_开头的key,只保留后面的部分
  • 所以在最终的标签看到的就是kubernetes_io_os="linux"
  • labelmap代表匹配到的标签赋值给目标标签
  • 源码位置 D:\go_path\src\github.com\prometheus\prometheus\pkg\relabel\relabel.go
func relabel(lset labels.Labels, cfg *Config) labels.Labels {
	case LabelMap:
		for _, l := range lset {
			if cfg.Regex.MatchString(l.Name) {
				res := cfg.Regex.ReplaceAllString(l.Name, cfg.Replacement)
				lb.Set(res, l.Value)
			}
		}
}

应用2: 采集pod自定义指标中replace 和 keep的应用

  • 我们在使用pod自定义指标时在pod yaml 的spec.template.metadata.annotations中需要定义三个以prometheus.io开头的配置
  • 分别代表是否需要prometheus采集、metrics暴露的端口、metrics的http path信息
  • 我们之前写的go代码 ink8s_pod_metrics项目中的deployment配置如下
spec:
  replicas: 1
  selector:
    matchLabels:
      app: ink8s-pod-metrics
  template:
    metadata:
      labels:
        app: ink8s-pod-metrics
      annotations:
        prometheus.io/scrape: 'true'
        prometheus.io/port: '8080'
        prometheus.io/path: 'metrics'
  • 在采集pod自定义指标时采用如下(job=kubernetes-pods)
  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
其中keep的应用
  • 配置如下
  - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
    separator: ;
    regex: "true"
    replacement: $1
    action: keep
  • 含义是保留 __meta_kubernetes_pod_annotation_prometheus_io_scrape这个标签为true的pod
  • 也就是pod的yaml中 spec.template.metadata.annotations 配置prometheus.io/scrape: 'true'的才需要采集
  • 其余的pod不采集
  • image.png
其中replace的应用
  • 设置__metrics_path__标签
  - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
    separator: ;
    regex: (.+)
    target_label: __metrics_path__
    replacement: $1
    action: replace
  • 意思是将__meta_kubernetes_pod_annotation_prometheus_io_path赋值给__metrics_path__
  • 设置__address__标签
  - source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]
    separator: ;
    regex: ([^:]+)(?::\d+)?;(\d+)
    target_label: __address__
    replacement: $1:$2
    action: replace
  • 意思是将相关__meta_kubernetes_pod_annotation_prometheus_io_port作为端口赋值给__address__
  • 也就是是告诉prometheus 这个pod的采集地址为 ${pod_ip}:${pod_port}/${path}

应用3: k8s服务组件采集时的endpoint过滤

  • endpoint资源是暴露一个服务的ip地址和port的列表
  • 代表采用k8s服务发现 endpoint,endpoint会非常多,所以需要过滤apiserver的
kubernetes_sd_configs:
- role: endpoints
  • 相应的relabel配置为
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

解读一下
  • 过滤手段为

    • 标签 __meta_kubernetes_namespace=default
    • 并且 __meta_kubernetes_service_name=kubernetes
    • 并且 __meta_kubernetes_endpoint_port_name 匹配https,
  • 最后的动作为keep,也就是只采集满足上面三个标签组的endpoint

  • k8s 会在default namespace中创建apiserver的 service

$ kubectl get svc -A |grep  443
default         kubernetes                                     ClusterIP   10.96.0.1       <none>        443/TCP                  9d
  • 最后获取到的endpoint转换为采集路径为:https://masterip:6443/metrics

应用4 :hashmod 解决k8s大集群采集问题

场景说明
  • 有的k8s集群数据量太大了,一个prometheus采集会导致内存消耗过多,采集效率下降
  • 此时需要启动多个prometheus,使用hashmod做静态分片
  • hashmod需要和keep或drop做配合
配置说明
  • 第1个prometheus配置
relabel_configs:
  - source_labels: [__address__]
    regex: (.*)
    modulus: 2
    target_label: __tmp_hash
    replacement: $1
    action: hashmod
  - source_labels: [__tmp_hash]
    regex: ^0$
    replacement: $1
    action: keep

  • 第2个prometheus配置
relabel_configs:
  - source_labels: [__address__]
    regex: (.*)
    modulus: 2
    target_label: __tmp_hash
    replacement: $1
    action: hashmod
  - source_labels: [__tmp_hash]
    regex: ^1$
    replacement: $1
    action: keep

  • 解读一下,两个prometheus的 modulus=2代表一共两个分片
  • 其中第1个 regex: ^0$ 第二个 regex: ^1$ ,然后通过action: keep做保留
  • 意思是target的__address__做hash之后对2取模
  • =0由第1个prometheus采集,=1由第2个prometheus采集
源码解读
	case HashMod:
		mod := sum64(md5.Sum([]byte(val))) % cfg.Modulus
		lb.Set(cfg.TargetLabel, fmt.Sprintf("%d", mod))

应用5 :drop 去掉不想要采集的指标

场景说明
  • 有些指标数据量很大,可以达到百万的量级,这种指标对监控系统是很大的压力
  • 有些指标我们不关心
  • 所以我们就可以使用drop将这些指标去掉
  • 配置样例,如下面的例子:drop掉以kubelet_|apiserver_|storage_开头的指标
- source_labels: [__name__]
    separator: ;
    # 标签key前缀匹配到的drop
    regex: '(kubelet_|apiserver_|container_fs_).*'
    replacement: $1
    action: drop

本节重点总结 :

  • relabel的源码在 7.7节做过详细的解读
  • 强大的relabel能力 在k8s中的应用
    • 应用1: labelmap 在采集cadvisor指标时 对服务发现标签key名字截取
    • 应用2: 采集pod自定义指标中replace 和 keep的应用
    • 应用3: k8s服务组件采集时的endpoint过滤
    • 应用4: hashmod 解决k8s大集群采集问题
    • 应用5: drop 去掉不想要采集的指标

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2191682.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

资产管理系统建设方案,资产盘点,rfid,出入库,消耗品管理,系统方案,系统源码(word原件)

固定资产管理系统需求要点&#xff1a; 1. 实现公司内部固定资产管理全生命周期管理&#xff0c;包括资产采购、资产入库、资产领用、资产借用、资产归还、资产报废、资产维修、资产调拨等全过程管理。 2. 可实现集团内部固定资产盘点管理&#xff0c;包括盘点计划、盘点查询等…

【深度解析】从电视广播到互联网接入:通信卫星如何改变我们的世界?

1.通信卫星的发展历程和现状 1.1 早期发展 通信卫星的发展历程可以追溯到20世纪50年代末期和60年代初期。 1957年10月4日&#xff0c;苏联成功发射了第一颗人造卫星“斯普特尼克1号”&#xff0c;标志着人类进入了太空时代&#xff0c;也推动了通信卫星的发展。 1958年12月18…

.NET 一款支持天蝎的免杀WebShell

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…

【ubuntu】【VirtualBox】VirtualBox无法加载USB移动设备的解决方法(支持U盘启动盘)

TOC 提示&#xff1a;测试可用 一、安装VirtualBox VirtualBox-7.1.2-164945-Win。 下载路径。 Download_Old_Builds_7_0 – Oracle VirtualBox 二、安装Oracle_VirtualBox_Extension_Pack-7.1.2 下载路径见上文。 三、安装增强功能 四、挂载USB 4.1 设置USB协议 4.2 挂…

深度学习基础—目标检测算法

目录 1.滑动窗口算法 2.滑动窗口的卷积实现 &#xff08;1&#xff09;1*1卷积的作用 &#xff08;2&#xff09;全连接层转化为卷积层 &#xff08;3&#xff09;在卷积层上实现滑动窗口 3.Bounding Box预测&#xff08;YOLO算法&#xff09; 1.滑动窗口算法 假如要构建一…

YOLOv10改进 | 融合篇,YOLOv10改进主干网络为GhostNetV3+MLCA注意机制

摘要 GhostNetV3 引入了多分支重参数化机制,通过在卷积层中添加额外的平行分支来改善性能。这些分支在训练过程中提供更多的表征能力,最终通过将多个分支重组为一个卷积层来实现推理时的高效性。通过添加配备 BatchNorm 层的重复分支将再参数化引入紧凑型模型。因此作为YOLO…

2024年优化苹果免签封装APP H5站打包苹果APP 绿标-永不掉千(永久使用)

大家都知道苹果手机做APP签名很贵&#xff0c; 这个程序就是吧您的H5网站 一切网页可以打开的&#xff0c;封装成app 苹果手机上可以直接安装使用 永久可用&#xff01;&#xff01;很简单&#xff0c;可以看视频教程来安装使用&#xff0c; 视频教程&#xff1a; https://ww…

【AIGC】2022-CVPR-利用潜在扩散模型进行高分辨率图像合成

2022-CVPR-High-Resolution Image Synthesis with Latent Diffusion Models 利用潜在扩散模型进行高分辨率图像合成摘要1. 引言2. 相关工作3. 方法3.1. 感知图像压缩3.2. 潜在扩散模型3.3. 调节机制 4. 实验4.1. 关于感知压缩权衡4.2. 利用潜在扩散生成图像4.3. 条件潜在扩散4.…

Spring Boot ⽇志

目录 1.⽇志使⽤ 2.⽇志级别 3.⽇志配置 3.1配置⽇志级别 3.2⽇志持久化 3.3配置⽇志⽂件分割 4.更简单的⽇志输出 1.⽇志使⽤ 在使用之前我们先来了解一下为什么要使用&#xff1f; ⽇志的⽤途 1.系统监控 我们可以通过⽇志记录这个系统的运⾏状态&#xff0c;对数…

【Codeforces】CF 2019 E

Tree Pruning #差分 #树形结构 题目描述 You are given a tree with n n n nodes, rooted at node 1 1 1. In this problem, a leaf is a non-root node with degree 1 1 1. In one operation, you can remove a leaf and the edge adjacent to it (possibly, new leaves…

需求设计书,需求分析报告,需求说明书(word原件)

第3章 技术要求 3.1 软件开发要求 第4章 项目建设内容 第5章 系统安全需求 5.1 物理设计安全 5.2 系统安全设计 5.3 网络安全设计 5.4 应用安全设计 5.5 对用户安全管理 5.6 其他信息安全措施 第6章 其他非功能需求 6.1 性能设计 6.2 稳定性设计 6.3 安全性设计 6.4 兼容性设计…

Valhalla实现 -Docker部署利用OSM(Mapbox)地图实现路径规划可视化

一. Valhalla基本概念 1. 背景介绍&#xff1a; 官网介绍文档&#xff1a;https://valhalla.github.io/valhalla/ Valhalla是一个开源的路由引擎&#xff0c;能够实现实时路径规划&#xff0c;处理大量请求返回最优路径。 基于 OSM 数据&#xff0c;结合灵活的多模式交通方式…

百度文心智能体平台开发萌猫科研加油喵

百度文心智能体平台开发萌猫科研加油喵 在科研的道路上&#xff0c;研究生们常常面临着巨大的压力和挑战。为了给这个充满挑战的群体带来一些鼓励和温暖&#xff0c;我借助百度文心智能体平台开发了一个独特的智能体 《萌猫科研加油喵》。 一、百度文心智能体平台介绍 百度文…

Cilium-实战系列-(一)Cilium-安装与部署

前言&#xff1a; 1、首先说一下这篇实战系列和Cilium-ebpf系列文章为 “一文一武”&#xff0c;一个注重点解&#xff0c;一个注重实际操作。 Cilium ebpf 系列文章-什么是ebpf?&#xff08;一&#xff09;_clium ebpf-CSDN博客文章浏览阅读419次。一、We Create a containe…

【Python】Hypercorn:轻量级的异步ASGI/WSGI服务器

Hypercorn 是一个支持异步 ASGI 和同步 WSGI 应用的高效 Python 服务器。它结合了现代协议支持&#xff08;包括 HTTP/1、HTTP/2 和 HTTP/3&#xff09;&#xff0c;并且为异步 Web 框架&#xff08;如 FastAPI 和 Quart&#xff09;提供了卓越的性能和灵活性。通过 Hypercorn&…

2.创建第一个MySQL存储过程(2/10)

引言 在现代数据库管理中&#xff0c;存储过程扮演着至关重要的角色。它们是一组为了执行特定任务而编写的SQL语句集合&#xff0c;这些语句被保存在数据库中&#xff0c;并且可以被多次调用执行。存储过程不仅可以提高数据库操作的效率&#xff0c;还能增强数据的安全性和一致…

来自德国的义齿雕刻机电主轴SycoTec 4033

在口腔医学的精密世界中&#xff0c;每一次技术的飞跃都意味着患者体验与治疗效果的双重提升。随着数字化、自动化技术的蓬勃发展&#xff0c;义齿加工领域正经历着前所未有的变革&#xff0c;而德国SycoTec公司推出的4033高速电主轴卓越的性能和广泛的应用性&#xff0c;提升了…

计算机毕业设计 网上体育商城系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

Python第三方库选择与使用陷阱避免

Python第三方库选择与使用陷阱避免 Python 生态系统丰富多样&#xff0c;其中的第三方库提供了许多强大的功能&#xff0c;使得开发者可以快速构建应用。然而&#xff0c;随着第三方库的增多&#xff0c;如何选择合适的库并避免一些常见的使用陷阱成为了开发者需要关注的重点。…

ChatGPT Canvas:交互式对话编辑器

自两年前 ChatGPT 发布以来&#xff0c;主流 AI 均以对话形式进行交互。传统的对话式界面可以直观看到反馈结果&#xff0c;但在需要深度编辑和协作的项目中就略显局限。为了解决此问题&#xff0c;几个月前 Claude 就发布过 Artifacts 功能&#xff0c;用来拓展原有对话。而现…