首页/云/云与容器速查/PodDisruptionBudget 中断预算
Kubernetes68 条

PodDisruptionBudget 中断预算

为自愿中断(drain、节点维护、集群升级)保底可用副本:minAvailable 或 maxUnavailable 二选一;它不防节点宕机等非自愿中断,那是多副本与反亲和要解决的问题。

云与容器速查云更新于 2026-10-13

为自愿中断保底

PodDisruptionBudget 为自愿中断保底可用副本数:节点排空、节点维护、集群升级这类主动驱逐操作在执行前会先检查 PDB,不满足就阻塞或重试。它不防节点断电、kubelet 失联这类非自愿中断,那些要靠多副本、反亲和与容量冗余解决。两者是不同层面的保护,不能相互替代。

基本信息

保护对象自愿中断:节点排空、维护与集群升级引发的主动驱逐
作用机制驱逐前检查预算,不满足则阻塞或重试
写法minAvailable 或 maxUnavailable,二选一,支持整数与百分比
不覆盖范围节点故障、内核崩溃等非自愿中断不受其约束
核查方式查看 PDB 列表中的允许中断数与健康副本数
前提条件必须有多副本才有意义,单副本配 PDB 会直接死锁

典型使用场景

  • 有状态集群滚动升级时限制同时不可用的实例数量
  • 无状态服务在节点维护窗口内保持足够的可用副本
  • 集群升级前的可用性兜底,避免一次性驱逐过多 Pod
  • 与反亲和配合,确保驱逐后副本仍分布在不同节点
  • 把关键服务的可用性下限写进 PDB,并纳入运维规范

PDB 示例与核查

PDB 示例与核查
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: web-pdb
spec:
  minAvailable: 2                 # 至少保留 2 个可用副本
  selector:
    matchLabels: { app: web }     # 选择器写错等于没保护

# 核查
kubectl get pdb -A                                        # 看允许中断数
kubectl drain node-1 --ignore-daemonsets --dry-run=server # 预演驱逐是否会被阻塞

字段读法

字段含义异常表现
MIN AVAILABLE 或 MAX UNAVAILABLE配置的可用性预算与实际健康副本冲突时驱逐无法进行
ALLOWED DISRUPTIONS当前允许被驱逐的副本数为 0 时排空操作会一直等待
EXPECTED PODS选择器匹配到的副本数为 0 说明选择器写错,等于没有保护
HEALTHY PODS当前健康副本数低于预算要求时驱逐被阻止
selector匹配范围匹配过宽会波及不相关的负载
单副本服务把 minAvailable 配成 1 会让节点排空直接死锁,维护永远做不下去。PDB 必须与多副本设计配套:单副本服务要么先扩副本,要么接受明确的停机窗口。
与反亲和的关系:PDB 保证驱逐过程中的可用副本数,反亲和保证副本分散在不同节点或可用区。缺了反亲和,多个副本可能落在同一节点,PDB 的预算对节点故障毫无作用。

易错点

  • PDB 与单副本并存:节点维护无限等待,最后只能强制删除 Pod 绕过保护
  • 选择器写错没匹配到任何 Pod:等于没有保护,运维却以为已经上了保险
  • 指望用 PDB 防节点断电:非自愿中断不受其约束,需要多副本与跨节点分布
  • 同时写 minAvailable 与 maxUnavailable:配置冲突,实际预算与预期不符

数据来源与参考

  • Kubernetes Docs:Pod Disruption Budgets

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌