首页/云/Kubernetes 速查/PDB 与驱逐 API 的配合
调度与资源52 条

PDB 与驱逐 API 的配合

kubectl drain 走 Eviction API:受 PDB 限制时按 allowed disruptions 逐个放行;长时间阻塞会体现在事件与等待提示里。

Kubernetes 速查云更新于 2026-10-13

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 上再临时处理从容得多。

易错点

  • 单副本服务却配 minAvailable: 1:节点维护永远卡住,drain 长时间无进展且提示并不显眼
  • 副本数够但就绪数不足:预算按就绪副本计算,Pod 长期 NotReady 时同样会无限等待
  • 只看 drain 的输出不看事件:把 PDB 阻塞误判成节点或 kubelet 故障,排查方向走偏
  • 关键服务完全没有 PDB:节点维护时全部副本被一次性驱逐,出现整体不可用

数据来源与参考

  • Kubernetes 官方文档 · 驱逐 API 与 PDB
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌