2. PDB准入策略概述:准入控制器原理、PDB准入策略的触发时机与生命周期

2.1 准入控制器原理:Kubernetes API请求的守门人

Kubernetes 准入控制器(Admission Controller)是一段拦截并处理 API Server 请求的插件式代码,位于请求通过认证与授权之后、对象持久化到 etcd 之前。PDB 准入策略正是利用这一机制,在关键变更操作(如节点排水、Pod 主动驱逐)生效前执行校验,防止违反 PodDisruptionBudget 约束的请求被写入集群状态。

核心流程: 认证 → 授权 → 准入控制(Mutating → Validating) → 持久化

准入控制器分为两类:

类型 执行顺序 典型行为 PDB 相关示例
Mutating(变更) 先执行 修改请求对象(注入 Sidecar、设置默认值) 为 Pod 注入 PDB 注解或默认标签
Validating(验证) 后执行 校验请求是否合规,拒绝非法操作 校验驱逐请求是否满足 PDB minAvailable

PDB 准入策略通常以 ValidatingAdmissionPolicy(VAP)或 ValidatingAdmissionWebhook 的形式部署,在集群升级、节点池缩容、主动驱逐等场景中充当最后一道防线。

Kubernetes API 请求准入控制流程 客户端请求 认证 / 授权 Mutating 准入 Validating 准入 etcd 拒绝请求(403) PDB 准入策略在此拦截

2.2 PDB准入策略的触发时机

PDB 准入策略并非对所有 API 请求都生效,它仅在以下三类高风险操作中被触发:

  1. Eviction 子资源请求(Pod 主动驱逐)
    客户端调用 POST /api/v1/namespaces/{ns}/pods/{name}/eviction 时,准入控制器读取目标 Pod 所属的 PDB,校验驱逐后剩余 Pod 数量是否 ≥ minAvailable(或 maxUnavailable 是否超标)。
  2. 节点排水(kubectl drain)
    Drain 操作本质上是批量 Eviction 请求,每个 Pod 的驱逐都会触发 PDB 准入校验。若某个 Pod 的驱逐会导致 PDB 违约,整个 Drain 流程将阻塞或报错。
  3. 集群升级 / 节点池缩容
    自动化升级工具(如 Karpenter、Cluster Autoscaler、Upgrade Controller)在驱逐 Pod 前,会通过 PDB 准入策略预检风险。若 PDB 约束过紧,升级流程会暂停并等待人工干预或自动回滚。
最佳实践: 在集群升级前,使用 kubectl get pdb --all-namespaces 检查所有 PDB 的 currentHealthy 与 desiredHealthy 比值。若 currentHealthy - 1 < desiredHealthy,则该 PDB 处于“脆弱”状态,升级可能被准入策略阻塞。

2.3 PDB准入策略的生命周期

PDB 准入策略从定义到生效,再到失效,经历以下完整生命周期阶段:

阶段 触发条件 准入控制器行为 运维关注点
1. 策略定义 创建 ValidatingAdmissionPolicy / Webhook 配置 注册校验规则,绑定 PDB 资源 确认 policy 的 matchConstraints 正确匹配 eviction 子资源
2. 策略激活 PDB 对象创建或更新 开始监控关联 Pod 集合的驱逐请求 检查 PDB 的 selector 是否覆盖目标工作负载
3. 拦截校验 Eviction / Drain / 升级触发驱逐 计算剩余 Pod 数量,与 PDB 约束比较 观察 kubectl describe eviction 的准入结果
4. 策略更新 PDB 的 minAvailable 或 maxUnavailable 变更 动态加载新约束,后续请求按新规则校验 变更 PDB 后立即生效,无需重启准入控制器
5. 策略失效 PDB 被删除或 selector 无匹配 Pod 停止对该 Pod 集合的拦截 删除 PDB 前确认工作负载有替代保护机制
PDB 准入策略生命周期 策略定义 策略激活 拦截校验 策略更新 策略失效 PDB 变更触发重新校验 PDB 删除 策略更新后立即生效,无需重启 准入控制器或 API Server

2.4 关键设计原则

  • 无状态校验: PDB 准入策略不维护内部状态,每次校验都实时查询 etcd 中的 PDB 和 Pod 集合,保证一致性。
  • 幂等性: 同一驱逐请求重复提交,只要 PDB 约束未变,校验结果始终一致。
  • 失败安全(Fail-Close): 若准入控制器无法连接 API Server 或 PDB 查询超时,默认拒绝驱逐请求,防止集群状态被破坏。
  • 动态绑定: PDB 的 selector 支持标签表达式,准入策略在每次校验时动态计算匹配的 Pod 集合,无需预注册。
常见陷阱: 当 PDB 的 minAvailable 设置为 100%(或 maxUnavailable: 0)时,任何单个 Pod 的驱逐都会被准入策略拒绝。在集群升级前,务必为这类 PDB 设置合理的 maxUnavailable: 1 或 minAvailable: 90%,否则升级流程将完全阻塞。