【问题标题】:How to get a pod's labels in Prometheus when pulling the metrics from Kube State Metrics从 Kube State Metrics 中提取指标时如何在 Prometheus 中获取 pod 的标签
【发布时间】:2018-10-25 16:49:57
【问题描述】:

我有一个 Prometheus pod 和我的 Kube-State-Metrics (KSM) pod 一起运行。 KSM 收集集群中所有命名空间的所有 Pod 的所有指标。 Prometheus 只是从 KSM 中抓取指标 - 这样 Prometheus 就不需要抓取单个 pod。

在部署 pod 时,它们的部署具有某些与 pod 相关的标签,如下所示。他们有两个重要的标签:APPTEAM

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    APP: AppABC
    TEAM: TeamABC
...

 

在 Prometheus 中,我的抓取配置如下所示:

scrape_configs:
  - job_name: 'pod monitoring'
    honor_labels: true
    kubernetes_sd_configs:
    - role: pod
    relabel_configs:
    - action: labelmap
      regex: __meta_kubernetes_pod_label_(.+)
...

 

问题是,当 Prometheus 从 kube-state-metrics 抓取信息时,它会用 kube-state-metrics 覆盖 APP。例如下面的这个指标实际上是针对名为 "AppABC" 的应用程序,但 Prometheus 将app 标签覆盖为kube-state-metrics

kube_pod_container_status_restarts_total{
    app="kube-state-metrics",
    container="appabccontainer",
    job="pod monitoring",
    namespace="test-namespace",
    pod="appabc-766cbcb68d-29smr"
}

我是否可以从 kube-state-metrics 中抓取指标,但将 APPTEAM 标签放在一起而不覆盖它们?

 

编辑 - 我想通了

我的问题:我的部署和 Pod 定义了某些标签(APP、TEAM)。 Kube-state-metrics 从 K8 API 获取这些。当 Prometheus 从 kube-state-metrics 中抓取数据时,它没有这些标签。

我的目标:将这些标签暴露给 Prometheus。

我的解决方案:您可以使用 PromQL 进行分组。所以在我的 prometheus-rules.yaml 中,我改变了这个:

expr: kube_pod_status_phase{phase="Failed"} > 0

到这里:

expr: kube_pod_status_phase{phase="Failed"} * on (pod,namespace) group_right kube_pod_labels > 0

所以我的新警报规则如下所示:

- name: Pod_Failed
  rules:
  - alert: pod_failed
    expr: kube_pod_status_phase{phase="Failed"} * on (pod,namespace) group_right kube_pod_labels > 0
    labels:
      appname: '{{ $labels.label_APP }}' # This is what I wanted to capture
      teamname: '{{ $labels.label_TEAM }}' # This is what I wanted to capture
    annotations:
      summary: 'Pod: {{ $labels.pod }} is down'
      description: 'Pod: {{ $labels.pod }} is down in {{ $labels.namespace }} namespace.'

【问题讨论】:

  • 您能发布来自kube-state-metrics 的指标吗?它们可能位于kube-state-metrics:8080/metrics
  • 我想我明白了。我在编辑下发布了我的解决方案。

标签: kubernetes prometheus prometheus-alertmanager


【解决方案1】:

解决方案:使用 PromQL 您可以进行分组。所以在我的 prometheus-rules.yaml 中,我改变了这个:

expr: kube_pod_status_phase{phase="Failed"} > 0

到这里:

expr: kube_pod_status_phase{phase="Failed"} * on (pod,namespace) group_right kube_pod_labels > 0

所以我的新警报规则如下所示:

- name: Pod_Failed
  rules:
  - alert: pod_failed
    expr: kube_pod_status_phase{phase="Failed"} * on (pod,namespace) group_right kube_pod_labels > 0
    labels:
      appname: '{{ $labels.label_APP }}' # This is what I wanted to capture
      teamname: '{{ $labels.label_TEAM }}' # This is what I wanted to capture
    annotations:
      summary: 'Pod: {{ $labels.pod }} is down'
      description: 'Pod: {{ $labels.pod }} is down in {{ $labels.namespace }} namespace.'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-12
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多