PDB 与发布运维是什么
PDB 限制自愿中断时同时不可用的副本数:节点 drain、节点回收等运维动作受其约束,预算不允许时驱逐被拒绝。它保护运维与发布的穿插安全,但对 Deployment 自身滚动更新的替换不生效,也不覆盖非自愿中断(宕机)。
基本信息
| 字段 | minAvailable / maxUnavailable(数量或百分比) |
|---|---|
| 作用范围 | 通过 Eviction API 的自愿中断(drain、节点回收) |
| 不覆盖 | 滚动更新的替换、非自愿中断(宕机) |
| 行为 | 预算不允许时驱逐被拒绝 |
| 选择器 | matchLabels 决定保护哪组 Pod |
典型使用场景
- 集群维护:节点 drain 前靠 PDB 控住可用副本
- 节点回收:弹性缩容时避免同时驱逐过多实例
- 多工作负载共存:按服务重要性设置不同预算
- 演练日:模拟节点维护验证预算是否够宽
实践要点
- 预算留余量:minAvailable 别等于副本数,留出可驱逐空间
- 标签核对:选择器写错等于没保护
- 与滚动更新区分:发布节奏由 maxSurge/maxUnavailable 控制
- 单副本慎用:1 副本配 minAvailable 1 会锁死 drain
- 定期演练:长期没 drain 过的预算要验证可用性
- 预算与副本一起改:扩缩容时核对预算占比,避免名额漂移
- 多 PDB 不叠加:命中同一组 Pod 时按最严预算执行,配置前先梳理覆盖面
- 命名对应:PDB 名称与工作负载对应,排障一眼能认
PDB 示例
PDB 示例
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata: {name: web-pdb}
spec:
minAvailable: 80%
selector:
matchLabels: {app: web}生效范围
| 场景 | PDB 是否生效 | 说明 |
|---|---|---|
| 节点 drain | 生效 | 驱逐走 Eviction API |
| 滚动更新 | 不生效 | 控制器直接替换 |
| 节点宕机 | 不生效 | 属非自愿中断 |
PDB 拖得住 drain,拖不住 Deployment 控制器:滚动更新的 Pod 替换不查 PDB。
预算松紧是权衡:太紧保护强但维护被阻塞,太松保护弱,按可用性目标定。
drain 卡住先查 PDB:看 allowed disruptions 是否为 0,再决定调预算还是腾副本。
把预算写进服务模板:新服务默认带 PDB,而不是出事后再补。