求助:基于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 - 运行时长:
在Grafana字段设置中把单位改为"时间"(如小时/分钟)time() - kube_pod_container_start_time_seconds - 工作集内存:
非运行状态返回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
相关产品推荐
相关产品推荐

