概述
节点排空、集群升级和自动扩缩容的缩容都属于自愿中断:集群请求 Pod 离开。PodDisruptionBudget 告诉驱逐 API 同时可以有多少个 Pod 不可用。它本身不会让工作负载高可用,但能防止维护操作一次性移除过多副本。
步骤
- 创建预算,三副本时保持两个可用:
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: payments-api
namespace: production
spec:
minAvailable: 2
selector:
matchLabels:
app: payments-api
- 用
kubectl get pdb payments-api -n production确认ALLOWED DISRUPTIONS为 1。 - 执行
kubectl drain node-1 --ignore-daemonsets --delete-emptydir-data,观察 Pod 逐个迁移。 - 用拓扑分布约束把副本分散到不同节点,否则预算无法防止所有副本落在同一节点。
验证
预期排空时一次只驱逐一个 Pod,新 Pod 就绪后才继续;当健康副本少于两个时,排空会等待而不是强行删除。若排空长时间阻塞,检查是否有多个 PDB 选中同一批 Pod,重叠预算会叠加限制。
注意事项
- PDB 只约束自愿中断,节点崩溃等非自愿中断仍可能同时失去所有副本。
minAvailable等于副本数会让所有排空永久阻塞,应使用 N-1 或maxUnavailable百分比。- 选择器必须与 Pod 标签匹配,匹配不到任何 Pod 的 PDB 既不保护服务又会阻塞维护。
- 修改副本数或扩缩容策略后要重新复核预算,并纳入版本控制。