机制定位
PodDisruptionBudget 声明「自愿中断时的可用底线」:用 minAvailable 或 maxUnavailable 表达可容忍的副本损失,drain、节点维护、集群升级等主动操作都必须遵守。适用平台是 Kubernetes(policy/v1)。它保护的范围仅限于自愿中断——节点宕机、进程崩溃这类非自愿中断不受约束。允许中断数可以在 status 里直接看到,是维护前的必查项。
基本信息
| 适用平台 | Kubernetes(policy/v1,1.21 起为稳定版本) |
|---|---|
| 两种写法 | minAvailable 与 maxUnavailable,二选一 |
| 保护范围 | 仅自愿中断:drain、驱逐 API 等主动操作 |
| 关键状态 | status.disruptionsAllowed 表示当前允许中断的副本数 |
典型使用场景
- 节点维护前排雷:确认目标工作负载的 PDB 是否允许中断
- 滚动升级保护:避免集群升级一次性抽走过多副本
- 核心服务兜底:为网关、鉴权这类强依赖服务设置可用下限
- 巡检失配配置:找出 minAvailable 等于副本数、导致排水永远卡住的对象
- 演练验证:主动驱逐一个副本,观察 PDB 是否按预期拦住多余动作
PDB 示例
PDB 示例
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: web-pdb
namespace: prod
spec:
minAvailable: 2
selector:
matchLabels:
app: web查看状态
查看状态
kubectl get pdb -n prod # 概览
kubectl describe pdb web-pdb -n prod | grep -A3 'Allowed disruptions'
kubectl get pdb web-pdb -n prod -o jsonpath='{.status}' # 期望与实际副本数
kubectl get deploy web -o jsonpath='{.spec.replicas}' # 与副本数对照
kubectl drain node1 --ignore-daemonsets --dry-run=client # 先演练再执行配置与后果
| 配置 | 含义 | 常见后果 |
|---|---|---|
| minAvailable 小于副本数 | 允许损失若干副本 | 维护可正常推进 |
| minAvailable 等于副本数 | 一个都不允许中断 | drain 无法完成,维护被无限拖长 |
| maxUnavailable: 1 | 最多同时中断一个 | 维护变慢但可控 |
| selector 写错 | 未匹配到任何 Pod | PDB 形同虚设,保护预期落空 |
minAvailable 与 maxUnavailable 二选一;单副本服务设 minAvailable: 1 会让排水永远无法完成,需要评估是否改为允许中断或先扩副本。
PDB 不保护非自愿中断:节点宕机时副本照样直接丢,高可用还要依赖多副本与反亲和等机制共同保障。
维护前检查清单
- 核对 allowed disruptions 大于 0,等于 0 时排水会被无限期阻塞
- 确认副本数与可用下限留有余量,单副本服务需要先扩副本再维护
- 确认选择器确实匹配到目标 Pod,写错时保护形同虚设
- 记录这次调整:临时放宽 PDB 后要记得恢复,避免长期留下宽松配置