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

求助:基于Prometheus+Grafana实现K8s Pod/容器状态与资源监控视图

实现思路与解决方案

核心问题拆解

你遇到的本质是kube-state-metrics提供的K8s对象状态指标和cAdvisor提供的容器资源使用指标标签维度不统一,导致无法直接关联。两者的核心关联键是namespace、pod、container三个标签,部分场景需要通过node标签补全关联链路。

分步实现方案

1. 多指标关联核心逻辑

利用PromQL的group_left()/group_right()实现跨指标家族的标签合并,将状态类指标的标签注入资源使用类指标,反之亦然。

基础关联示例(容器状态+内存数据)

# 仅保留运行中容器的工作集内存,同时关联状态标签
container_memory_working_set_bytes
  * on(namespace,pod,container) group_left(container_state)
  (
    label_replace(kube_pod_container_status_running == 1, "container_state", "Running", "", "1")
    or label_replace(kube_pod_container_status_waiting == 1, "container_state", "Waiting", "", "1")
    or label_replace(kube_pod_container_status_terminated == 1, "container_state", "Terminated", "", "1")
  )

2. 表格字段逐一定制

按需求拆分字段,用独立PromQL查询每个列:

  • Pod名称/容器名称:直接在Grafana表格的"字段"设置中选择pod/container标签展示
  • 容器状态:
    case
      when kube_pod_container_status_running == 1 then "Running"
      when kube_pod_container_status_waiting == 1 then "Waiting"
      when kube_pod_container_status_terminated == 1 then "Terminated"
      else "Unknown"
    end
    
  • 运行时长:
    time() - kube_pod_container_start_time_seconds
    
    在Grafana字段设置中把单位改为"时间"(如小时/分钟)
  • 工作集内存:
    if(kube_pod_container_status_running == 1, container_memory_working_set_bytes, NaN)
    
    非运行状态返回NaN,Grafana自动显示为空白/N/A
  • 内存请求/限制:
    直接查询对应指标,未配置的容器无该指标,在Grafana中设置"值为空时显示N/A":
    # 内存请求
    kube_pod_container_resource_requests_memory_bytes
    # 内存限制
    kube_pod_container_resource_limits_memory_bytes
    

3. 节点过滤配置

在Grafana中添加节点多选变量:

  • 变量类型选"Query"
  • 查询语句:label_values(kube_node_info, node)
  • 勾选"允许全选"和"多选"
  • 给每个PromQL语句末尾加上{node=~"$node"},确保指标带node标签(若container_*无node标签,可通过kube_pod_info关联:on(pod,namespace) group_left(node) kube_pod_info)

4. CPU相关独立表格

复用上述关联逻辑,替换为CPU指标:

  • CPU使用率:rate(container_cpu_usage_seconds_total[5m])
  • CPU请求:kube_pod_container_resource_requests_cpu_cores
  • CPU限制:kube_pod_container_resource_limits_cpu_cores

关键注意事项

  • 确保kube-state-metrics和cAdvisor都正常部署,指标采集无遗漏
  • 过滤掉container="POD"的pause容器,在PromQL中加container!="POD"
  • 若标签名不一致(如部分指标用pod_name而非pod),用label_replace统一:label_replace(指标, "pod", "$1", "pod_name", "(.*)")

内容的提问来源于stack exchange,提问作者Joseph Gagnon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 02:17:14