PDB 约束的是哪种中断
PodDisruptionBudget 只管「自愿驱逐」:kubectl drain、节点排空、集群自动缩容都通过驱逐 API 进行,控制器在放行前检查 minAvailable 或 maxUnavailable 是否还允许中断。超出预算的驱逐请求会被拒绝并不断重试,直到预算释放。它不保证可用性:节点宕机、进程崩溃、OOM 这类非自愿中断不经过驱逐 API,PDB 无从约束。因此 PDB 必须配合足够的副本数才有意义。
基本信息
| 适用平台 | Kubernetes 各版本,policy/v1 的 PodDisruptionBudget |
|---|---|
| 关键字段 | minAvailable 与 maxUnavailable,支持整数或百分比 |
| 相关操作 | kubectl drain、kubectl cordon、驱逐 API(Eviction 子资源) |
| 观察入口 | kubectl get pdb -A 查看 ALLOWED DISRUPTIONS 列 |
| 不覆盖范围 | 节点故障、Pod 崩溃、OOM 等非自愿中断 |
典型使用场景
- 集群升级与节点维护:保证滚动排空时始终保留足够副本对外服务
- 集群自动缩容:让缩容决策受可用性预算约束
- 有状态服务维护:单副本切换前用预算控制中断节奏
- 平台巡检:确认关键服务都有 PDB,避免维护时整体不可用
- 灰度下线:先用预算限制中断数量,再逐步放量
PDB 声明
PDB 声明
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: web-pdb
namespace: prod
spec:
minAvailable: 2 # 至少保留 2 个可用副本
selector:
matchLabels:
app: web
# 也可用 maxUnavailable: 1 表达「最多中断 1 个」排水时的观察
排水时的观察
kubectl get pdb -A # 看 ALLOWED DISRUPTIONS 是否为 0
kubectl drain node1 --ignore-daemonsets --delete-emptydir-data
kubectl get events -A --field-selector reason=EvictionBlocked | tail -3
kubectl describe pdb web-pdb -n prod | tail -10 # 当前可用/期望副本与预算典型情形与行为
| 情形 | 行为 | 说明 |
|---|---|---|
| 预算充足 | 驱逐立即放行 | ALLOWED DISRUPTIONS 大于 0 |
| 预算耗尽 | 驱逐被拒并重试 | drain 会等待,事件里出现阻塞原因 |
| 节点故障 | 直接中断,不受约束 | PDB 只作用于自愿驱逐 |
| 单副本配 minAvailable: 1 | 永远无法驱逐 | 需先扩副本或临时放宽预算 |
ALLOWED DISRUPTIONS 就是「当前还能中断几个副本」:它等于 0 时任何驱逐都会等待,此时先看副本是否真的 Ready,再看预算是否设置得过严。
drain 的强制选项会绕过驱逐 API 与 PDB 约束,只在明确接受可用性影响、且有回滚方案时使用,不要把它当作解决卡住的常规手段。
维护前先算一遍预算:把副本数与 minAvailable 对照,确认排空前还剩多少可中断副本;预算不足时提前扩副本或分批维护,比卡在 drain 上再临时处理从容得多。