在 cAdvisor 的刮板中更改 Prometheus 作业标签会破坏 Grafana 仪表板

Posted

技术标签:

【中文标题】在 cAdvisor 的刮板中更改 Prometheus 作业标签会破坏 Grafana 仪表板【英文标题】:Changing Prometheus job label in scraper for cAdvisor breaks Grafana dashboards 【发布时间】:2021-11-23 02:47:00 【问题描述】:

我使用社区图表kube-prometheus-stack 使用 Helm 在我的 Kubernetes 集群上安装了 Prometheus - 我在捆绑的 Grafana 实例中获得了一些漂亮的仪表板。我现在希望 Vertical Pod Autoscaler 的推荐器使用 Prometheus 作为历史指标的数据源,as described here。意思是,我必须对 cAdvisor 的 Prometheus 刮板设置进行更改,this answer 为我指明了正确的方向,因为在进行更改后,我现在可以在 cAdvisor 的指标上看到正确的 job 标签。

很遗憾,现在 Grafana 仪表板中的一些图表已损坏。看起来它不再获取 CPU 指标 - 而只是显示 CPU 相关图表的“无数据”。

所以,我假设我必须调整图表才能再次正确获取指标,但我在 Grafana 中没有看到任何明显的地方可以做到这一点?

不确定它是否与问题相关,但我正在 Azure Kubernetes 服务 (AKS) 上运行我的 Kubernetes 集群。

这是我在安装 Prometheus 时提供给 Helm 图表的完整 values.yaml

kubeControllerManager:
  enabled: false
kubeScheduler:
  enabled: false
kubeEtcd:
  enabled: false
kubeProxy:
  enabled: false
kubelet:
  serviceMonitor:
    # Diables the normal cAdvisor scraping, as we add it with the job name "kubernetes-cadvisor" under additionalScrapeConfigs
    # The reason for doing this is to enable the VPA to use the metrics for the recommender
    # https://github.com/kubernetes/autoscaler/blob/master/vertical-pod-autoscaler/FAQ.md#how-can-i-use-prometheus-as-a-history-provider-for-the-vpa-recommender
    cAdvisor: false
prometheus:
  prometheusSpec:
    retention: 15d
    storageSpec:
      volumeClaimTemplate:
        spec:
          # the azurefile storage class is created automatically on AKS
          storageClassName: azurefile
          accessModes: ["ReadWriteMany"]
          resources:
            requests:
              storage: 50Gi
    additionalScrapeConfigs:
      - job_name: 'kubernetes-cadvisor'
        scheme: https
        metrics_path: /metrics/cadvisor
        tls_config:
          ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
          insecure_skip_verify: true
        bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
        kubernetes_sd_configs:
        - role: node
        relabel_configs:
        - action: labelmap
          regex: __meta_kubernetes_node_label_(.+)

Kubernetes 版本:1.21.2

kube-prometheus-stack 版本:18.1.1

掌舵版本:version.BuildInfoVersion:"v3.6.3", GitCommit:"d506314abfb5d21419df8c7e7e68012379db2354", GitTreeState:"dirty", GoVersion:"go1.16.5"

【问题讨论】:

你用的是哪个 Kubernetes 版本? @kkopczak 这是版本 1.21.2 - 我也会用这些信息更新问题 您使用的是哪个版本的 Helm?另外,请提供您的日志。 @kkopczak 我现在也将掌舵版本添加到问题中。当您说提供日志时,您指的是来自 helm 的日志吗? - 安装 Prometheus 时可能使用--debug 标志? 【参考方案1】:

很遗憾,我无法访问 Azure AKS,因此我在我的 GKE 集群上重现了这个问题。下面我将提供一些解释,可能有助于解决您的问题。

首先你可以尝试执行这个node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate规则,看看它是否返回任何结果:

如果它没有返回任何记录,请阅读以下段落。

为 cAdvisor 创建抓取配置

我建议不要为 cadvisor 创建一个全新的抓取配置,而是使用在kubelet.serviceMonitor.cAdvisor: true 时默认生成的配置,但要进行一些修改,例如将标签更改为job=kubernetes-cadvisor

在我的示例中,“kubernetes-cadvisor”抓取配置如下所示:

注意:我在values.yaml 文件中的additionalScrapeConfigs 下添加了此配置(values.yaml 文件的其余部分可能与您的类似)。

- job_name: 'kubernetes-cadvisor'
  honor_labels: true
  honor_timestamps: true
  scrape_interval: 30s
  scrape_timeout: 10s
  metrics_path: /metrics/cadvisor
  scheme: https
  authorization:
    type: Bearer
    credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
  tls_config:
    ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
    insecure_skip_verify: true
  follow_redirects: true
  relabel_configs:
  - source_labels: [job]
    separator: ;
    regex: (.*)
    target_label: __tmp_prometheus_job_name
    replacement: $1
    action: replace
  - source_labels: [__meta_kubernetes_service_label_app_kubernetes_io_name]
    separator: ;
    regex: kubelet
    replacement: $1
    action: keep
  - source_labels: [__meta_kubernetes_service_label_k8s_app]
    separator: ;
    regex: kubelet
    replacement: $1
    action: keep
  - source_labels: [__meta_kubernetes_endpoint_port_name]
    separator: ;
    regex: https-metrics
    replacement: $1
    action: keep
  - source_labels: [__meta_kubernetes_endpoint_address_target_kind, __meta_kubernetes_endpoint_address_target_name]
    separator: ;
    regex: Node;(.*)
    target_label: node
    replacement: $1
    action: replace
  - source_labels: [__meta_kubernetes_endpoint_address_target_kind, __meta_kubernetes_endpoint_address_target_name]
    separator: ;
    regex: Pod;(.*)
    target_label: pod
    replacement: $1
    action: replace
  - source_labels: [__meta_kubernetes_namespace]
    separator: ;
    regex: (.*)
    target_label: namespace
    replacement: $1
    action: replace
  - source_labels: [__meta_kubernetes_service_name]
    separator: ;
    regex: (.*)
    target_label: service
    replacement: $1
    action: replace
  - source_labels: [__meta_kubernetes_pod_name]
    separator: ;
    regex: (.*)
    target_label: pod
    replacement: $1
    action: replace
  - source_labels: [__meta_kubernetes_pod_container_name]
    separator: ;
    regex: (.*)
    target_label: container
    replacement: $1
    action: replace
  - separator: ;
    regex: (.*)
    target_label: endpoint
    replacement: https-metrics
    action: replace
  - source_labels: [__metrics_path__]
    separator: ;
    regex: (.*)
    target_label: metrics_path
    replacement: $1
    action: replace
  - source_labels: [__address__]
    separator: ;
    regex: (.*)
    modulus: 1
    target_label: __tmp_hash
    replacement: $1
    action: hashmod
  - source_labels: [__tmp_hash]
    separator: ;
    regex: "0"
    replacement: $1
    action: keep
  kubernetes_sd_configs:
  - role: endpoints
    kubeconfig_file: ""
    follow_redirects: true
    namespaces:
      names:
      - kube-system

修改 Prometheus 规则

默认情况下,从 cAdvisor 获取数据的 Prometheus 规则在其 PromQL 表达式中使用 job="kubelet"

job=kubelet改成job=kubernetes-cadvisor后,我们还需要修改Prometheus规则中的这个标签:注意:我们只需要修改有metrics_path="/metrics/cadvisor的规则(这些是从 cAdvisor 检索数据的规则。

$ kubectl get prometheusrules prom-1-kube-prometheus-sta-k8s.rules -o yaml
...
  - name: k8s.rules
    rules:
    - expr: |-
        sum by (cluster, namespace, pod, container) (
          irate(container_cpu_usage_seconds_totaljob="kubernetes-cadvisor", metrics_path="/metrics/cadvisor", image!=""[5m])
        ) * on (cluster, namespace, pod) group_left(node) topk by (cluster, namespace, pod) (
          1, max by(cluster, namespace, pod, node) (kube_pod_infonode!="")
        )
      record: node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate
...
here we have a few more rules to modify...

修改 Prometheus 规则并等待一段时间后,我们可以查看它是否按预期工作。我们可以像一开始一样尝试执行node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate

此外,让我们检查一下我们的 Grafana 以确保它已开始正确显示我们的仪表板:

【讨论】:

你好@SørenPedersen。你成功了吗? 非常感谢@kkopczak 的精彩回答 - 我会尽快花一些时间来测试这个 @kkopczak 我现在已经尝试了您的建议,并且效果很好! - 非常感谢您花时间写下这个答案。为了获得规则,我必须运行 kubectl get prometheusrules --namespace prometheus prometheus-kube-prometheus-k8s.rules -o yaml > rules.yaml 然后按照您的指示修改文件,然后运行 ​​kubectl apply -f rules.yaml --record --namespace prometheus 以应用更改(我们在单独的命名空间中有 prometheus)

以上是关于在 cAdvisor 的刮板中更改 Prometheus 作业标签会破坏 Grafana 仪表板的主要内容,如果未能解决你的问题,请参考以下文章

在 Angular 4 中使用节点模块(网站刮板)使用失败

Node.js 刮板中的内存泄漏

cadvisor详解

chartjs-plugin-datasource-prometheus 展示prometheus 数据

刮板给空白输出

屏幕刮板如何工作? [关闭]