prometheus中relabel_configs的使用
relabel_configs 是 Prometheus 在抓取目标之前对 目标标签(Target Labels) 进行改写、过滤、新增的核心配置,只作用于服务发现阶段的元标签,不影响已采集的指标内容。
relabel_configs核心字段
relabel_configs:
- source_labels: [label1, label2] # 源标签,多个用分隔符拼接
separator: ';' # 拼接分隔符,默认 ;
regex: '(.+)' # 正则匹配 source_labels 的值
target_label: new_label # 要写入的目标标签
replacement: 'prefix-${1}' # 替换内容,$1 是正则捕获组
action: replace # 动作:replace/keep/drop/labelmap/labeldrop/labelkeep
常用 Action
1. replace(默认):新增 / 修改标签
把 source_labels 匹配 regex 的值,经 replacement 处理后写入 target_label。
# 示例:从 __meta_kubernetes_pod_namespace 提取命名空间到 env 标签
- source_labels: [__meta_kubernetes_pod_namespace]
regex: 'prod'
target_label: env
replacement: 'production'
2. keep:只保留匹配的目标
不匹配 regex 的目标直接丢弃,不抓取。
# 示例:只保留 env=production 的目标
- source_labels: [env]
regex: 'production'
action: keep
3. drop:丢弃匹配的目标
匹配 regex 的目标直接丢弃。
# 示例:丢弃测试环境目标
- source_labels: [env]
regex: 'test'
action: drop
5. labeldrop/labelkeep:删除 / 保留指定标签
labeldrop:删除标签名匹配 regex 的标签labelkeep:只保留标签名匹配 regex 的标签
# 删除所有 __tmp_ 开头的临时标签
- regex: __tmp_.+
action: labeldrop
生产常用示例
抓取 Node Exporter 指标
# Job 1: 抓取 Node Exporter 指标
- job_name: 'nodes'
kubernetes_sd_configs:
- role: node
relabel_configs:
# 1. 地址替换:将默认的 10250 (kubelet) 端口替换为 9100 (Node Exporter) 端口
- source_labels: [__address__]
regex: '(.*):10250'
replacement: '${1}:9100'
target_label: __address__
action: replace
# 2. 标签映射:将 Kubernetes 节点的标签映射为 Prometheus 标签
- action: labelmap
regex: __meta_kubernetes_node_label_(.+)
配置逐行解释
- action: labelmap
regex: __meta_kubernetes_node_label_(.+)
它的核心目的是:将 Kubernetes 自动发现的、名称冗长的元数据标签(以 `__meta_kubernetes_node_label_` 开头),批量转换为简洁、易用的业务标签,同时去掉前面的下划线前缀,使其成为普通标签。
#action: labelmap
含义:这是一个批量操作指令。与 replace 操作针对单个标签不同,labelmap 会扫描目标(Target)上所有现有的标签。
作用:它寻找所有标签名(Key)符合 regex 规则的标签,并将它们的值(Value)复制给新生成的标签。
#regex: __meta_kubernetes_node_label_(.+)
含义:这是一个正则表达式,用于匹配标签名。
__meta_kubernetes_node_label_:这是 Kubernetes 服务发现机制自动给每个节点打上的前缀。Prometheus 规定,所有以 __meta_ 开头的标签都是“元数据标签”,它们仅用于服务发现阶段的过滤和匹配,默认不会保留在最终的监控数据中(抓取完成后会被丢弃)。
(.+):这是正则中的捕获组。它匹配前缀后面的所有内容。
例如:K8s 节点有一个标签叫 topology.kubernetes.io/zone。
在 Prometheus 发现时,它变成了 __meta_kubernetes_node_label_topology_kubernetes_io_zone。
这里的 (.+) 就捕获了 topology_kubernetes_io_zone 这部分。
#replacement: $1 (隐含的默认值)
虽然你的配置中没有写这一行,但 labelmap 的默认 replacement 值就是 $1。
含义:它定义了新标签名的命名规则。$1 代表引用上面 regex 中第一个括号 (.+) 捕获到的内容。
实际转换效果演示
假设你的 Kubernetes 集群中有一个节点,它拥有以下 Kubernetes 原生标签:
kubernetes.io/os: linuxnode.kubernetes.io/instance-type: m5.large
当 Prometheus 通过 kubernetes_sd_configs 发现这个节点时,它会先给这些标签加上前缀,变成内部元数据标签:
__meta_kubernetes_node_label_kubernetes_io_os=linux__meta_kubernetes_node_label_node_kubernetes_io_instance_type=m5.large
应用你的配置后
| 原始元数据标签名 (Source Label) | 匹配 Regex | 捕获组 ($1) | 生成的新标签名 (Target Label) | 标签值 |
|---|---|---|---|---|
__meta_kubernetes_node_label_kubernetes_io_os |
匹配 | kubernetes_io_os |
kubernetes_io_os |
linux |
__meta_kubernetes_node_label_node_kubernetes_io_instance_type |
匹配 | node_kubernetes_io_instance_type |
node_kubernetes_io_instance_type |
m5.large |
采集 cAdvisor(容器监控)
利用 Kubernetes 节点名称,动态构造出通过 API Server 访问 cAdvisor 指标的具体路径。
简单来说,它告诉 Prometheus:“不要只去默认的 /metrics 路径找数据,而是去 /api/v1/nodes/<节点名>/proxy/metrics/cadvisor 这个特定路径抓取。”
- source_labels: [__meta_kubernetes_node_name]
regex: (.+)
replacement: /metrics/cadvisor
target_label: __metrics_path__
配置逐行解析
source_labels: [__meta_kubernetes_node_name]- 含义:指定源数据。
- 解释:
__meta_kubernetes_node_name是 Prometheus 通过 Kubernetes 服务发现(SD)自动获取的元数据标签,代表了当前被发现的节点名称(例如k8s-node-01)。
regex: (.+)- 含义:匹配规则。
- 解释:这是一个正则表达式,
(.+)表示匹配任意非空字符。这里的作用是确保节点名称存在(即不为空)。如果节点名存在,它会被捕获为变量$1。
replacement: /metrics/cadvisor- 含义:替换值(但在本例中是一个“陷阱”)。
- 解释:这里定义了当
regex匹配成功时,要填入的值。 - 注意:在标准的 Prometheus 配置中,如果这里只写
/metrics/cadvisor,那么target_label最终的值就是/metrics/cadvisor。但是,在K8s (cAdvisor 监控),这通常是不完整的。 - 通常的完整写法:为了通过 API Server 代理访问,这里通常需要使用变量引用,例如
/api/v1/nodes/${1}/proxy/metrics/cadvisor。如果配置文件中确实只写了/metrics/cadvisor,那通常是因为__address__已经被指向了 Kubelet 的直接端口(如 10250)
target_label: __metrics_path__- 含义:指定目标标签。
- 解释:
__metrics_path__是 Prometheus 的一个特殊标签(以__开头)。它决定了 Prometheus 向目标发起 HTTP 请求时,URL 中的路径部分(即http://<IP>:<Port>/**此路径**)。默认值是/metrics。
注意:
cAdvisor的数据路径为/api/v1/nodes//proxy/metrics,但是我们不推荐使用这种方式,因为这种方式是通过APlServer去代理访问的,对于大规模的集群比如会对APlServer造成很大的压力,
所以我们可以直接通过访问kubelet的/metrics/cadvisor这个路径来获取cAdvisor的数据
监控apiserver
它的核心目的是:在成千上万个服务接口(Endpoints)中,精准地只保留 Kubernetes API Server 的监控目标,丢弃其他所有无关的服务。
relabel_configs:
- source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
action: keep
regex: default;kubernetes;https
配置逐行解析
source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]- 含义:指定三个源标签作为判断依据。
- 解释:Prometheus 会把这三个标签的值提取出来。
__meta_kubernetes_namespace:服务所在的命名空间。__meta_kubernetes_service_name:服务的名称。__meta_kubernetes_endpoint_port_name:端口名称(通常是http或https)。
separator: ;(隐含的默认值)- 含义:分隔符。
- 解释:虽然配置里没写,但 Prometheus 默认会用分号
;将上面提取的三个值连接成一个长字符串。 - 连接后的样子:
<命名空间>;<服务名>;<端口名>
regex: default;kubernetes;https- 含义:匹配规则。
- 解释:这是一个精确匹配的正则表达式。它要求上面连接起来的字符串必须完全等于default;kubernetes;https。
default:必须在default命名空间。kubernetes:服务名必须叫kubernetes(这是 K8s 集群内部 API Server 的默认服务名)。https:端口名必须叫https(对应 443 端口)。
action: keep- 含义:保留操作。
- 解释:这是过滤的核心。
- 如果匹配成功:保留这个目标(Target),Prometheus 会去抓取它的指标。
- 如果匹配失败:丢弃这个目标,Prometheus 会完全忽略它,不进行任何抓取。
实际工作流程演示
假设你的集群里有两个服务:
- 服务 A(API Server):
- 命名空间:
default - 服务名:
kubernetes - 端口名:
https - 拼接结果:
default;kubernetes;https - 结果:匹配成功 -> 保留(Prometheus 开始监控它)。
- 命名空间:
- 服务 B(例如 Nginx):
- 命名空间:
web - 服务名:
my-nginx - 端口名:
http - 拼接结果:
web;my-nginx;http - 结果:匹配失败 -> 丢弃(Prometheus 忽略它)。
- 命名空间:

浙公网安备 33010602011771号