KubeDeploymentReplicasMismatch 告警:含义、常见原因与处置
Prometheus 告警 KubeDeploymentReplicasMismatch 是什么意思、常见原因有哪些、PromQL 规则怎么写、响了怎么处置,附可直接使用的规则 YAML。
最后校对于
一个 Deployment 的可用副本数已经 15 分钟低于期望值,并且当前没有在发布(最近 10 分钟内已更新副本数没有变化)。有副本缺失或未就绪,服务在低于计划容量的状态下运行。
- 级别:警告(
warning) - 持续:15 分钟
- 属于 Kubernetes 告警规则(
kubernetes.yml)
规则
(
kube_deployment_spec_replicas{job="kube-state-metrics"}
>
kube_deployment_status_replicas_available{job="kube-state-metrics"}
) and (
changes(kube_deployment_status_replicas_updated{job="kube-state-metrics"}[10m])
==
0
)
告警信息:Deployment {{ $labels.namespace }}/{{ $labels.deployment }} has not matched the expected number of replicas for longer than 15 minutes.
常见原因
- 新 Pod 调度不上去:CPU 或内存不够,或者亲和性规则、污点让所有节点都不满足条件。
- Pod 在崩溃循环或就绪探针一直失败,始终不计入可用副本。
- 部分节点上拉不下镜像。
- 命名空间配额用满,ReplicaSet 创建不了缺的 Pod(看 ReplicaSet 上的
exceeded quota事件)。 - 节点故障带走了副本,替补的 Pod 又因为上面某个原因卡住。
处置步骤
- kubectl describe deploy <name> -n <ns> 看 Conditions 与 Events;
- kubectl get pod -n <ns> -l <selector> 看未就绪 Pod 的状态与原因;
- 常见为资源不足无法调度、镜像拉取失败、就绪探针不通过;
- 按 Pod 的具体状态排查,资源不足的扩容节点或调低 requests。
补充说明
changes(...[10m]) == 0这一段让规则在正常滚动发布期间保持安静。发布本身卡住不动时,告警的是 KubeDeploymentRolloutStuck。- 表达式里限定了
job="kube-state-metrics"。如果你的采集任务或命名空间叫别的名字,要改掉这些匹配条件,否则规则永远匹配不到数据。
用到的指标
kube_deployment_spec_replicas(kube-state-metrics)kube_deployment_status_replicas_available(kube-state-metrics)kube_deployment_status_replicas_updated(kube-state-metrics)
相关告警
- KubeDeploymentRolloutStuck:Rollout of deployment …/… is not progressing for longer than 15 minutes.
- KubePodNotReady:Pod …/… has been in a non-ready state for longer than 15 minutes.
- KubePodCrashLooping:Pod …/… (…) is in waiting state (reason: "CrashLoopBackOff").
- KubeHpaMaxedOut:HPA …/… has been running at max replicas for longer than 15 minutes.
Prometheus 规则 YAML
加到通过 rule_files 加载的规则文件里即可;也可以一次下载全部 Kubernetes 规则:kubernetes.yml。
- alert: KubeDeploymentReplicasMismatch
expr: |-
(
kube_deployment_spec_replicas{job="kube-state-metrics"}
>
kube_deployment_status_replicas_available{job="kube-state-metrics"}
) and (
changes(kube_deployment_status_replicas_updated{job="kube-state-metrics"}[10m])
==
0
)
for: 15m
labels:
severity: warning
annotations:
summary: "Deployment {{ $labels.namespace }}/{{ $labels.deployment }} has not matched the expected number of replicas for longer than 15 minutes."
runbook_url: "https://n9e.github.io/alert-rules/kubernetes/kubedeploymentreplicasmismatch"
用夜莺:这条规则内置在 Kubernetes 集成模板里,导入到业务组后,夜莺发出的每条告警都会带上处置步骤。
来源与许可
规则表达式改编自 kubernetes-mixin(Apache-2.0)。处置步骤来自夜莺的集成模板(Apache-2.0),含义和常见原因为本页撰写。