首页/开发/CI/CD 与发布速查/PodDisruptionBudget 与发布期运维
发布策略60 条

PodDisruptionBudget 与发布期运维

PDB 限制自愿中断时同时不可用的副本数:节点 drain、节点回收等运维动作受其约束;对 Deployment 自身滚动更新不生效,但决定运维与发布能否安全穿插。

CI/CD 与发布速查开发更新于 2026-10-13

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,而不是出事后再补。

易错点

  • minAvailable 等于副本数:drain 永远无法完成,节点维护被无限阻塞
  • PDB 选择器写错标签:保护了错误的 Pod 集合,关键时刻失去约束
  • 单副本服务配强预算:缩容与维护全被锁死,副本数与预算一起设计
  • 把 PDB 当发布保护:滚动更新不受它约束,发布期可用性靠策略与探针
  • allowed disruptions 长期为 0 无人知:维护被静默阻塞,纳入监控告警
  • 两个 PDB 命中同一组 Pod:按最严预算执行,配置前先梳理覆盖面

数据来源与参考

  • Kubernetes 文档《Specifying a Disruption Budget for your Application》
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌