跳到主要内容

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

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

最后校对于

集群里所有 Pod 申请的 CPU,已经超过「去掉最大那台节点后」集群能提供的量。换句话说,集群扛不住任何一台节点宕机:那台节点上的 Pod 将无处可调度。这是容量预警,不是故障;它看的是 requests,不是实际 CPU 用量。

规则​

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

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

常见原因​

  • 负载增长(副本数增加、HPA 扩容),节点池却没有跟着扩。
  • 节点被手动或被自动扩缩容缩掉了。
  • requests 设得远高于容器实际用量,集群看起来比实际更满。
  • 有一台节点比其它节点大很多,「去掉最大节点」预留的量就很大。

处置步骤​

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

补充说明​

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

用到的指标​

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

相关告警​

  • KubeMemoryOvercommit:Cluster … has overcommitted memory resource requests for Pods by … bytes and cannot tolerate node failure.
  • KubeCPUQuotaOvercommit:Cluster … has overcommitted CPU 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: KubeCPUOvercommit
expr: |-
sum(namespace_cpu:kube_pod_container_resource_requests:sum{job="kube-state-metrics",}) by (cluster) - (sum(kube_node_status_allocatable{job="kube-state-metrics",resource="cpu"}) by (cluster) - max(kube_node_status_allocatable{job="kube-state-metrics",resource="cpu"}) by (cluster)) > 0
and
(sum(kube_node_status_allocatable{job="kube-state-metrics",resource="cpu"}) by (cluster) - max(kube_node_status_allocatable{job="kube-state-metrics",resource="cpu"}) by (cluster)) > 0
for: 10m
labels:
severity: warning
annotations:
summary: "Cluster {{ $labels.cluster }} has overcommitted CPU resource requests for Pods by {{ $value }} CPU shares and cannot tolerate node failure."
runbook_url: "https://n9e.github.io/alert-rules/kubernetes/kubecpuovercommit"

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

来源与许可​

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