PodDisruptionBudget(PDB)仅约束自愿性驱逐(如kubectl drain),不防误删或OOM等非自愿中断;须设minAvailable或maxUnavailable之一,并配合容忍度、就绪探针及监控实现高可用闭环。

在 Kubernetes 中,PodDisruptionBudget(PDB)是保障应用高可用的关键机制,专门用于约束“主动驱逐”(如 kubectl drain、节点升级、集群维护等场景),防止因同时中断过多 Pod 导致服务不可用。
明确 PDB 的适用范围
PDB 只对自愿性干扰(voluntary disruptions)生效,比如:
-
kubectl drain node-1操作 - 控制平面发起的节点 NotReady 后的驱逐(需满足 pod-eviction-timeout)
- 手动触发的
kubectl delete pod不受 PDB 限制——这点必须注意,PDB 不防误删
它不干预非自愿驱逐,例如内存 OOM、磁盘耗尽、污点自动驱逐等。这些属于 kubelet 或内核行为,需靠资源限制、容忍度、监控告警来协同防护。
选择并设置核心参数
一个 PDB 必须指定 minAvailable 或 maxUnavailable 之一(二者不可共存),推荐根据副本数和业务容忍度选其一:
- 若应用有 3 个副本,要求至少 2 个持续提供服务 → 设
minAvailable: 2 - 若允许最多 1 个副本短暂不可用 → 设
maxUnavailable: 1 - 支持百分比写法,如
minAvailable: "60%",适用于副本数动态变化的场景(如 HPA 调整后)
务必通过 selector.matchLabels 精准关联到目标工作负载(Deployment/StatefulSet),标签需与 Pod 模板中一致。
配合容忍度与就绪探针协同生效
PDB 单独配置不能解决节点异常时的流量黑窗问题,需组合使用:
- 为关键网关或入口 Pod 配置长周期容忍:
tolerationSeconds: 300(5 分钟),避免节点短暂失联即被驱逐 - 确保
readinessProbe设置合理:探测失败后 Pod 自动从 Service Endpoint 移除,防止流量打到不健康实例 - 避免将
livenessProbe设置过激——频繁重启可能触发 PDB 计算误判,导致驱逐被阻塞
验证与日常可观测性
配置后需确认 PDB 已加载且约束有效:
- 查看当前 PDB 状态:
kubectl get pdb -n <ns> - 检查是否影响 drain:
kubectl drain node-1 --dry-run=client -v=6可模拟并输出拦截原因 - 在 KubeSphere 或 Prometheus + Grafana 中监控
policy_pod_disruption_budget_status_conditions指标,重点关注DisruptionsAllowed == 0的异常时段
真实环境中,PDB 是一道“防驱逐盾牌”,但不是万能开关。它需要和资源请求/限制、污点容忍、探针策略、节点水位监控共同构成高可用闭环。

















