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: linux
  • node.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__

配置逐行解析

  1. source_labels: [__meta_kubernetes_node_name]
    • 含义:指定源数据
    • 解释__meta_kubernetes_node_name 是 Prometheus 通过 Kubernetes 服务发现(SD)自动获取的元数据标签,代表了当前被发现的节点名称(例如 k8s-node-01)。
  2. regex: (.+)
    • 含义:匹配规则。
    • 解释:这是一个正则表达式,(.+) 表示匹配任意非空字符。这里的作用是确保节点名称存在(即不为空)。如果节点名存在,它会被捕获为变量 $1
  3. 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)
  4. 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

配置逐行解析

  1. 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:端口名称(通常是 httphttps)。
  2. separator: ; (隐含的默认值)
    • 含义:分隔符。
    • 解释:虽然配置里没写,但 Prometheus 默认会用分号 ; 将上面提取的三个值连接成一个长字符串。
    • 连接后的样子<命名空间>;<服务名>;<端口名>
  3. regex: default;kubernetes;https
    • 含义:匹配规则。
    • 解释:这是一个精确匹配的正则表达式。它要求上面连接起来的字符串必须完全等于default;kubernetes;https。
      • default:必须在 default 命名空间。
      • kubernetes:服务名必须叫 kubernetes(这是 K8s 集群内部 API Server 的默认服务名)。
      • https:端口名必须叫 https(对应 443 端口)。
  4. 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 忽略它)。
posted @ 2026-04-22 00:57  mangolxh  阅读(19)  评论(0)    收藏  举报