基于Prometheus和AlertManager监控Kubernetes集群内存泄漏
监控Pod内存泄漏的Prometheus告警方案
已有通用告警规则参考
社区常见的监控套件(如kube-prometheus-stack)中,通常包含针对内存异常增长的告警规则,核心思路是结合内存增长率和使用率阈值,再通过持续时间过滤临时波动。
实现内存持续增长告警的具体方法
针对你的需求,基于container_memory_working_set_bytes指标,可通过以下方式构建告警规则:
1. 基础持续增长告警(快速泄漏场景)
通过rate()函数计算内存的小时增长率,结合使用率阈值,同时设置持续触发时间来确认泄漏趋势:
sum by(pod, namespace) (rate(container_memory_working_set_bytes[1h])) > 0 and sum by(pod, namespace) (container_memory_working_set_bytes) / sum by(pod, namespace) (kube_pod_container_resource_limits_memory_bytes) > 0.7 and sum by(pod, namespace) (kube_pod_container_resource_limits_memory_bytes) > 0
rate(container_memory_working_set_bytes[1h]) > 0:表示Pod内存每小时处于增长状态- 使用率>70%:过滤掉正常内存增长的场景(如刚启动的Pod)
- 最后一行排除未设置内存limit的Pod,避免除法运算错误
对应的Prometheus告警规则配置:
apiVersion: monitoring.coreos.com/v1 kind: PrometheusRule metadata: name: pod-memory-leak-rules namespace: monitoring spec: groups: - name: pod-memory-leak rules: - alert: PodMemoryLeakDetected expr: | sum by(pod, namespace) (rate(container_memory_working_set_bytes[1h])) > 0 and sum by(pod, namespace) (container_memory_working_set_bytes) / sum by(pod, namespace) (kube_pod_container_resource_limits_memory_bytes) > 0.7 and sum by(pod, namespace) (kube_pod_container_resource_limits_memory_bytes) > 0 for: 2h labels: severity: warning annotations: summary: "Pod {{ $labels.pod }} ({{ $labels.namespace }}) 疑似内存泄漏" description: "该Pod内存已持续增长2小时,当前使用率达{{ humanize $value }}%,请排查内存使用情况。"
2. 缓慢泄漏场景适配
针对内存缓慢增长的情况,可对比不同时间段的内存值,结合长周期增长率判断:
sum by(pod, namespace) (container_memory_working_set_bytes) > 1.5 * sum by(pod, namespace) (container_memory_working_set_bytes offset 24h) and sum by(pod, namespace) (rate(container_memory_working_set_bytes[6h])) > 0 and sum by(pod, namespace) (kube_pod_container_resource_limits_memory_bytes) > 0
offset 24h:对比当前内存与24小时前的内存值,若高出50%则标记异常rate(container_memory_working_set_bytes[6h]) > 0:确保6小时内内存处于持续增长状态
关键注意事项
- 时间窗口调整:根据业务Pod的内存特性调整
rate()的时间窗口(如1h/6h)和for的持续时间,避免误报或漏报 - 排除新启动Pod:可添加
time() - kube_pod_created{pod=~"{{ $labels.pod }}", namespace=~"{{ $labels.namespace }}"} > 86400条件,只监控运行超过24小时的Pod,避免刚启动的正常内存增长触发告警 - 结合OOM指标:若需更精准的告警,可叠加
container_memory_failures_total指标(内存分配失败次数),但该指标通常对应泄漏已较严重的阶段
内容的提问来源于stack exchange,提问作者Dsh
相关产品推荐
相关产品推荐

