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

news/2024/12/21 21:23:38/

本节重点介绍 :

  • 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: $1action: 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: 1selector:matchLabels:app: ink8s-pod-metricstemplate:metadata:labels:app: ink8s-pod-metricsannotations: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: $1action: keep- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]separator: ;regex: (.+)target_label: __metrics_path__replacement: $1action: replace- source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]separator: ;regex: ([^:]+)(?::\d+)?;(\d+)target_label: __address__replacement: $1:$2action: replace
其中keep的应用
  • 配置如下
  - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]separator: ;regex: "true"replacement: $1action: 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: $1action: 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:$2action: 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;httpsreplacement: $1action: keep
解读一下
  • 过滤手段为

  • 最后的动作为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: 2target_label: __tmp_hashreplacement: $1action: hashmod- source_labels: [__tmp_hash]regex: ^0$replacement: $1action: keep
  • 第2个prometheus配置
relabel_configs:- source_labels: [__address__]regex: (.*)modulus: 2target_label: __tmp_hashreplacement: $1action: hashmod- source_labels: [__tmp_hash]regex: ^1$replacement: $1action: 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.Moduluslb.Set(cfg.TargetLabel, fmt.Sprintf("%d", mod))

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

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

本节重点总结 :

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

http://www.ppmy.cn/news/1536417.html

相关文章

如何高效使用Prompt与AI大模型对话

一、如何与人工智能对话 在人工智能的世界里&#xff0c;提示词&#xff08;Prompt&#xff09;就像是一把钥匙&#xff0c;能够解锁AI智能助手的潜力&#xff0c;帮助你更高效地获取信息、解决问题。但如何正确使用这把钥匙&#xff0c;却是一门艺术。本文将带你了解提示词的…

WPF入门教学二十三 自定义控件开发

在WPF&#xff08;Windows Presentation Foundation&#xff09;中&#xff0c;自定义控件开发是一项强大的功能&#xff0c;它允许开发者根据特定需求创建独特的用户界面元素。自定义控件可以是简单的用户控件&#xff0c;也可以是更复杂的继承自现有控件的自定义控件。以下是…

GTest测试框架介绍

文章目录 GTest使用简单的宏断言事件机制全局使用样例局部使用样例 GTest是谷歌发布的一个跨平台的单元测试框架,主要是为了在不同平台上编写的C单元测试而生成的 提供了丰富的断言,致命和非致命的判断,参数化 GTest使用 简单的宏断言 断言分两类 一类是ASSERT系列的,如果当…

通讯方面的数据,人工智能 机器学习的时候,因为数字都接近于一,数据归一化的一种方法,做了一个简化版本的Z-score标准化

这个表达式实现了一种形式的数据归一化&#xff0c;它将张量x中的每个元素除以x的标准差的估计值。这种处理方式可以使得变换后的数据具有单位标准差&#xff08;假设数据已经是零均值或者在计算过程中考虑了均值&#xff09;。具体来说&#xff0c;它是基于以下步骤进行的&…

《OpenCV 计算机视觉》—— 视频背景建模

文章目录 一、背景建模的目的二、背景建模的方法三、背景建模的步骤四、注意事项五、代码实现 一、背景建模的目的 视频背景建模的主要目的是从视频序列中提取出静态背景&#xff0c;以便将动态的前景对象与静态的背景进行分离。这有助于进一步分析和处理视频内容&#xff0c;…

java8 双冒号(::)使用方法

双冒号&#xff08;::&#xff09;运算符是跟函数式接口相关的运算符&#xff0c;作为函数式接口的赋值操作。 双冒号用于静态方法 使用方法&#xff1a;将类的静态方法赋值给一个函数式接口&#xff0c;静态方法的参数个数、类型要跟函数式的接口一致。调用这个函数式接口就…

202408第十五届蓝桥杯青少组省赛C++中级组题解

202408第十五届蓝桥杯青少组省赛C++中级组题解 单选题 1、定义 char a[]="hello\nworld",执行 cout<<a,输出结果是(B) A、helloworld B、hello world C、 hellonworld D、 hello\nworld 解析:\n输出时会换行。 2、 的结果是(C)。 A、 B、

滚雪球学Oracle[4.2讲]:PL/SQL基础语法

全文目录&#xff1a; 前言一、PL/SQL基础语法1.1 变量声明变量声明示例&#xff1a; 二、记录类型与集合类型的使用2.1 记录类型记录类型的定义与使用 2.2 集合类型 三、PL/SQL表与关联数组3.1 PL/SQL表&#xff08;嵌套表&#xff09;嵌套表的定义与使用 3.2 关联数组关联数组…