You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让kube-state-metrics自动将自定义标签注入所有Pod/Deployment指标?

解决方案:将自定义标签注入kube-state-metrics的所有Pod/Deployment指标

一、kube-state-metrics原生参数的局限

你使用的--metric-labels-allowlist=deployments=[team],pods=[team]参数,仅会把允许的team标签添加到kube_pod_labels、kube_deployment_labels这类标签汇总指标中,不会自动注入到kube_pod_status_ready、kube_deployment_status_replicas_available等业务指标里——这是kube-state-metrics的设计逻辑,它不会主动将标签复制到所有关联指标上。

二、两种可行的实现方式

方式1:通过Prometheus记录规则(推荐)

这种方式逻辑清晰、性能可控,核心是从标签汇总指标中提取team标签,关联到其他指标并生成带标签的新指标:

针对Pod/Deployment指标的记录规则示例:

apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  name: kube-state-metrics-team-labels
  namespace: monitoring
spec:
  groups:
  - name: kube-pod-team-labels
    rules:
    # 先从kube_pod_labels中提取并格式化team标签
    - record: kube_pod:team_joined
      expr: |
        label_replace(
          kube_pod_labels,
          "team", "$1", "label_team", "(.+)"
        )
    # 将team标签关联到kube_pod_status_ready指标
    - record: kube_pod_status_ready:team_joined
      expr: |
        kube_pod_status_ready * on(namespace, pod) group_left(team) kube_pod:team_joined
    # 其他Pod相关指标可按此模式复制,替换指标名即可

  - name: kube-deployment-team-labels
    rules:
    # 先从kube_deployment_labels中提取并格式化team标签
    - record: kube_deployment:team_joined
      expr: |
        label_replace(
          kube_deployment_labels,
          "team", "$1", "label_team", "(.+)"
        )
    # 将team标签关联到kube_deployment_status_replicas_available指标
    - record: kube_deployment_status_replicas_available:team_joined
      expr: |
        kube_deployment_status_replicas_available * on(namespace, deployment) group_left(team) kube_deployment:team_joined

之后你可以直接使用带team标签的kube_pod_status_ready:team_joined等指标编写告警规则,无需每次手动分组。

方式2:通过ServiceMonitor的metricRelabelings(局限性较大)

这种方式是在Prometheus抓取kube-state-metrics指标时,尝试通过relabel逻辑关联标签,但由于Prometheus的relabeling是单指标处理,无法直接跨指标关联,实现逻辑较复杂,且仅适用于带pod/deployment标签的指标:

ServiceMonitor配置示例:

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: kube-state-metrics
  namespace: monitoring
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: kube-state-metrics
  endpoints:
  - port: http-metrics
    metricRelabelings:
    # 处理Pod相关指标:生成临时关联标识,提取team标签
    - action: replace
      sourceLabels: [__name__, namespace, pod]
      targetLabel: __tmp_identifier
      regex: (kube_pod_.+);(.+);(.+)
      replacement: $2:$3
    - action: replace
      sourceLabels: [__tmp_identifier, label_team]
      targetLabel: team
      regex: (.+);(.+)
      replacement: $2

    # 处理Deployment相关指标:类似逻辑
    - action: replace
      sourceLabels: [__name__, namespace, deployment]
      targetLabel: __tmp_identifier
      regex: (kube_deployment_.+);(.+);(.+)
      replacement: $2:$3
    - action: replace
      sourceLabels: [__tmp_identifier, label_team]
      targetLabel: team
      regex: (.+);(.+)
      replacement: $2

这种方式的局限性:如果指标没有pod或deployment标签(比如部分汇总级指标),就无法完成关联;且relabeling顺序非常关键,容易出错。

三、注意事项

  • 优先选择记录规则方式,逻辑清晰易维护,不会影响原生指标的抓取。
  • 无论用哪种方式,都要确保kube_pod_labels和kube_deployment_labels指标被Prometheus正常抓取,否则无法提取team标签。

内容的提问来源于stack exchange,提问作者Ivan Aracki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 23:00:23