为自愿中断保底
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 的预算对节点故障毫无作用。