如何让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
相关产品推荐
相关产品推荐

