跳到主要内容

KubeMemoryOvercommit 告警:含义、常见原因与处置

Prometheus 告警 KubeMemoryOvercommit 是什么意思、常见原因有哪些、PromQL 规则怎么写、响了怎么处置,附可直接使用的规则 YAML。

最后校对于

集群里所有 Pod 申请的内存,已经超过「去掉最大那台节点后」集群能提供的量,任何一台节点宕机都会让一部分 Pod 无处可调度。和 CPU 那条一样,看的是 requests 而不是实际用量;但内存没有弹性,放不下的 Pod 会一直 Pending,而不是跑得慢一点。

规则​

sum(namespace_memory:kube_pod_container_resource_requests:sum{}) by (cluster) - (sum(kube_node_status_allocatable{resource="memory", job="kube-state-metrics"}) by (cluster) - max(kube_node_status_allocatable{resource="memory", job="kube-state-metrics"}) by (cluster)) > 0
and
(sum(kube_node_status_allocatable{resource="memory", job="kube-state-metrics"}) by (cluster) - max(kube_node_status_allocatable{resource="memory", job="kube-state-metrics"}) by (cluster)) > 0

告警信息:Cluster {{ $labels.cluster }} has overcommitted memory resource requests for Pods by {{ $value | humanize }} bytes and cannot tolerate node failure.

常见原因​

  • 负载增长,节点池没有跟着扩。
  • 节点被缩掉了。
  • 内存 requests 设得远高于实际用量。
  • 有一台节点比其它节点大很多,为它预留的量就很大。

处置步骤​

  1. kubectl describe node | grep -A5 'Allocated resources' 汇总各节点的分配率;
  2. 这是容量规划信号而非即时故障——评估节点故障时是否还有冗余承接;
  3. 检查是否有 Pod 的 requests 设置得过高(远超实际用量),下调可释放大量可调度容量;
  4. 冗余确实不足的扩容节点。

补充说明​

  • 表达式用到 kubernetes-mixin 里的 recording rule namespace_memory:kube_pod_container_resource_requests:sum。没加载它,规则永远不会触发。
  • 表达式里限定了 job="kube-state-metrics"。如果你的采集任务或命名空间叫别的名字,要改掉这些匹配条件,否则规则永远匹配不到数据。

用到的指标​

  • namespace_memory:kube_pod_container_resource_requests:sum(kubernetes-mixin 的 recording rule)
  • kube_node_status_allocatable(kube-state-metrics)

相关告警​

  • KubeCPUOvercommit:Cluster … has overcommitted CPU resource requests for Pods by … CPU shares and cannot tolerate node failure.
  • KubeMemoryQuotaOvercommit:Cluster … has overcommitted memory resource requests for Namespaces.
  • KubeHpaMaxedOut:HPA …/… has been running at max replicas for longer than 15 minutes.

Prometheus 规则 YAML​

加到通过 rule_files 加载的规则文件里即可;也可以一次下载全部 Kubernetes 规则:kubernetes.yml。

- alert: KubeMemoryOvercommit
expr: |-
sum(namespace_memory:kube_pod_container_resource_requests:sum{}) by (cluster) - (sum(kube_node_status_allocatable{resource="memory", job="kube-state-metrics"}) by (cluster) - max(kube_node_status_allocatable{resource="memory", job="kube-state-metrics"}) by (cluster)) > 0
and
(sum(kube_node_status_allocatable{resource="memory", job="kube-state-metrics"}) by (cluster) - max(kube_node_status_allocatable{resource="memory", job="kube-state-metrics"}) by (cluster)) > 0
for: 10m
labels:
severity: warning
annotations:
summary: "Cluster {{ $labels.cluster }} has overcommitted memory resource requests for Pods by {{ $value | humanize }} bytes and cannot tolerate node failure."
runbook_url: "https://n9e.github.io/alert-rules/kubernetes/kubememoryovercommit"

用夜莺:这条规则内置在 Kubernetes 集成模板里,导入到业务组后,夜莺发出的每条告警都会带上处置步骤。

来源与许可​

规则表达式改编自 kubernetes-mixin(Apache-2.0)。处置步骤来自夜莺的集成模板(Apache-2.0),含义和常见原因为本页撰写。