只监控一个命名空间 pod - Prometheus & Kubernetes & cadvisor

Posted

技术标签:

【中文标题】只监控一个命名空间 pod - Prometheus & Kubernetes & cadvisor【英文标题】:Monitor only one namespace pods - Prometheus & Kubernetes & cadvisor 【发布时间】:2021-07-15 09:13:10 【问题描述】:

我在 kubernetes 上部署了 istio,并从 istio 插件安装了 prometheus。我的目标是只监视一个应用程序的一些 pod(例如 bookinfo 应用程序的所有 pod)。监控 Pod 的作业定义如下:

    - bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
      job_name: kubernetes-nodes-cadvisor
      kubernetes_sd_configs:
      - role: node
      relabel_configs:
      - action: labelmap
        regex: __meta_kubernetes_node_label_(.+)
      - replacement: kubernetes.default.svc:443
        target_label: __address__
      - regex: (.+)
        replacement: /api/v1/nodes/$1/proxy/metrics/cadvisor
        source_labels:
        - __meta_kubernetes_node_name
        target_label: __metrics_path__
      scheme: https
      tls_config:
        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
        insecure_skip_verify: true

我的问题是我不知道如何只监控一个命名空间的 pod。例如,我将 bookinfo 应用程序部署在名为 Book 的命名空间中。我只想要命名空间 Book 中的 pod 指标。但是,prometheus 会收集节点的所有 pod 指标。而不是像Monitor only one namespace metrics - Prometheus with Kubernetes这样更改应用程序的注释,我想知道是否有一种方法可以通过更改上面的作业定义来仅选择一个命名空间。或者有什么方法可以通过标签来选择监视器?

【问题讨论】:

【参考方案1】:

以下内容将匹配所有带有标签的目标 pod:some_label 任何值。

relabel_configs:
  - action: keep
    source_labels: [__meta_kubernetes_pod_label_some_label]
    regex: (.*)

如果您想保留带有标签的目标:monitor 和值:true,您可以这样做:

relabel_configs:
  - action: keep
    source_labels: [__meta_kubernetes_pod_label_monitor]
    regex: true

所有不匹配的 pod 都将从抓取中删除。

你应该能够为命名空间做同样的事情:

relabel_configs:
  - action: keep
    source_labels: [__meta_kubernetes_namespace]
    regex: Book

编辑 >

有没有办法将 [container_label_io_kubernetes_container_name] 标签更改为“container_name”?

试试这个:

relabel_configs:
  - action: replace
    source_labels: [container_label_io_kubernetes_container_name]
    target_label: container_name

prometheus docs about configuration里都有解释

【讨论】:

非常感谢您的回答。这正是我所需要的。 嗨,我还有一个问题。我尝试使用 cadvisor daemonset。但是标签很长。比如',container_label_io_kubernetes_container_name="istio-proxy"',有没有办法把标签改成"container_name"?【参考方案2】:

我在 cadvisor 的文档中找到了一个方法。 https://github.com/google/cadvisor/blob/master/docs/runtime_options.md 它说我们可以更改参数'--docker_only'和'--raw_cgroup_prefix_whitelist'来选择要监控的容器。

【讨论】:

以上是关于只监控一个命名空间 pod - Prometheus & Kubernetes & cadvisor的主要内容,如果未能解决你的问题,请参考以下文章

Grafana Dashboards 列出命名空间中的 pod 不起作用

如何使用网络策略停止所有外部流量并仅允许命名空间内的 Pod 间网络调用?

无法从阿里巴巴集群中获取命名空间、节点和 Pod 数据

Kubernetes对象之Pod

如何在一个 Kubernetes 集群中的命名空间之间隔离 Keycloak Infinispan,以防止 KC pod 相互发现和同步

k8s基础整理-标签/注解/命名空间