使用Prometheus监控Kubernetes cgroup问题及配置Grafana告警
Kubernetes集群cgroup内存故障致Pod卡在Init状态的Prometheus+Grafana告警配置
前置依赖
- 集群内部署kube-state-metrics组件,确保Prometheus可正常抓取其metrics端口;同时保证cAdvisor、kubelet核心指标采集正常,无丢点。
这类Docker cgroup内存分配失败导致的Init状态故障,核心判定特征有两个:一是Pod持续停留在Init阶段超过正常启动阈值,二是对应cgroup路径内存使用率触顶,或init容器退出日志携带
cgroup memory alloc failed、no space left on device: cgroup类报错。
核心PromQL查询语句
以下为精准匹配故障的查询语句,可直接复制使用:
# 匹配卡在Init状态且关联cgroup内存高使用率的异常Pod ( kube_pod_init_container_status_waiting{container=~"init-.*"} == 1 * on(namespace, pod) group_left(node) kube_pod_info ) * on(node) group_left() ( 1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) > 0.9 or (container_memory_usage_bytes{id=~"/kubepods/besteffort/.*|/kubepods/burstable/.*"} / container_spec_memory_limit_bytes > 0.97) )
语句逻辑说明:
- 第一层筛选所有处于等待状态的init容器,关联拿到Pod所在节点信息
- 第二层匹配节点整体内存使用率超90%,或节点上kubepods对应cgroup路径内存使用率超97%的场景,排除普通启动慢、镜像拉取失败导致的Init卡滞,精准定位cgroup内存分配问题。
Grafana告警配置步骤
- 打开集群监控对应的Grafana实例,新建Panel,数据源选择已对接的Prometheus,将上述PromQL粘贴到查询框,查询时间范围设置为
5m,最小步长设为15s。 - 切换到Alert标签页,设置触发条件:当查询返回结果值大于0,且持续时长满足
2m时触发告警。正常Pod的init容器启动耗时不会超过1分钟,2分钟阈值可过滤绝大多数正常启动场景,避免误报。 - 配置告警固定标签:添加
severity=critical、fault_category=cgroup_alloc_error标签,方便后续告警路由到对应运维组。 - 配置告警通知模板,直接嵌入指标标签减少排障信息查询成本:
[严重告警] Pod因cgroup内存分配失败卡Init状态 命名空间: {{ $labels.namespace }} 异常Pod: {{ $labels.pod }} 所在节点: {{ $labels.node }} 节点内存使用率: {{ $value | humanizePercentage }}
- 配置通知渠道,选择对应运维组的接收渠道(企业微信、邮件、钉钉等)保存即可。
配置避坑点
- 禁止单独用
kube_pod_status_phase{phase="Pending"}作为告警判断条件,会把镜像拉取中、调度中、正常启动的Pod全部误报,必须叠加容器状态、cgroup内存使用率两个维度的条件做联合判断。 - 如果集群运行时从Docker切换为containerd,上述规则不需要修改,cgroup内存分配的指标特征完全一致。
- 告警触发后优先排查对应节点是否存在cgroup泄漏问题,再检查异常Pod的init容器内存request/limit配置是否超过节点cgroup可分配配额。
内容的提问来源于stack exchange,提问作者Mohit Dhingra
相关产品推荐
相关产品推荐

