在 Kubernetes 集群运维中,节点重启、版本升级和自动缩容都会触发 Pod 的主动驱逐。PodDisruptionBudget(简称 PDB)正是用来约束这类“自愿中断”的对象,它能够保证应用在运维操作期间始终有足够数量的副本对外提供服务。理解 PDB 的运作方式,是构建高可用系统的关键一步。

PodDisruptionBudget 的核心机制与字段含义
PDB 属于 policy 资源组,通过标签选择器匹配目标 Pod,再以两个互斥字段之一描述容忍度:minAvailable 指定驱逐后必须保持的最小健康副本数,maxUnavailable 指定同一时刻最多可不可用的副本比例或绝对值。当集群执行排水(drain)等自愿中断动作时,API 服务器会借助 PDB 控制器判断当前操作是否会导致可用副本低于阈值,若会则拒绝或暂停驱逐。
需要明确的是,PDB 仅作用于“自愿中断”,例如管理员执行的 kubectl drain、节点池缩容、集群升级。对于节点宕机、内核崩溃等“非自愿中断”,PDB 无能为力,这类场景需依赖多副本跨可用区部署与就绪探针。此外,PDB 不会阻断删除 Pod 的 API 调用本身,而是让驱逐控制器在批量操作中遵守预算,因此它更像一个并发安全阀而非删除拦截器。
下面是一个基础定义示例,要求匹配标签 app=web 的部署至少保留三个实例:
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: web-pdb
spec:
minAvailable: 3
selector:
matchLabels:
app: web
若改用比例控制,可写 maxUnavailable: 20%,表示五分之一实例可短暂离线。注意 minAvailable 和 maxUnavailable 不可同时设置,且取值若大于实际副本总数会导致永远无法驱逐,需结合 HPA 实际规模评估。
配置策略与常见误用分析
选择 minAvailable 还是 maxUnavailable 取决于业务模型。对延迟极度敏感的服务,用 minAvailable 锁定底线副本,能保证容量不缩水;对可容忍短暂降级的批处理作业,用 maxUnavailable 提升运维灵活度,让节点维护更快完成。实践中常犯的错误是把 PDB 的 minAvailable 设为等于 Deployment 的副本数,这样任何驱逐都会被阻塞,节点永远排不空,反而拖慢集群升级。
另一个误区是认为 PDB 能防止滚动更新引起的中断。实际上 RollingUpdate 由 Deployment 控制器管理,与 PDB 的自愿中断校验路径不同,PDB 主要盯防外部驱逐。如果应用只有单副本却又配置了 minAvailable: 1,节点维护时该 Pod 无法被移走,只能强制删除,此时 PDB 形同虚设。因此副本数设计应大于一,并让 PDB 阈值低于总副本。
以下例子展示一个允许最多一个实例不可用的配置,适合三副本以上的无状态 API:
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: api-pdb
spec:
maxUnavailable: 1
selector:
matchLabels:
tier: backend
当运维执行 kubectl drain node-1 --ignore-daemonsets 时,若驱逐会使不可用数超一,命令将等待或报错,直到新 Pod 在别的节点就绪。这种机制把“可用性”显式写进运维流程,避免人为疏忽。
与驱逐流程、监控告警的协同实践
在真实集群中,PDB 的效果依赖驱逐控制器的配合。从 Kubernetes 1.22 起,policy/v1 稳定,PDB 状态字段 disruptionsAllowed 能告诉你当前还能安全驱逐几个 Pod。将其接入 Prometheus,可绘制“节点维护阻塞次数”面板,提前发现预算过紧的问题。若发现 drain 长时间卡住,多半是 PDB 阈值过高或副本分布不均。
为保证 PDB 真正生效,Pod 必须设置合理的 terminationGracePeriodSeconds 与 preStop 钩子,让连接在断开前被 drained。否则即使 PDB 允许驱逐,旧 Pod 被强杀也会丢请求。建议配合 readinessProbe 在终止前摘流量,形成“PDB 控并发、探针控流量”的双重保护。
下面代码展示在 Deployment 中同时声明优雅停止与 PDB 引用的典型片段:
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
spec:
replicas: 4
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
terminationGracePeriodSeconds: 30
containers:
- name: nginx
image: nginx:1.25
readinessProbe:
httpGet:
path: /healthz
port: 80
initialDelaySeconds: 5
periodSeconds: 10
把上述 Deployment 与前面 minAvailable: 3 的 PDB 绑定后,任意单次节点维护最多同时终止一个 Web Pod,其余三副本继续接流。这种组合在电商大促前的集群补丁操作中已被广泛验证,既不让节点滞留,也不让错误率飙升。
PodDisruptionBudgetKubernetes自愿中断修改时间:2026-08-15 17:56:27