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 的形式部署,在集群升级、节点池缩容、主动驱逐等场景中充当最后一道防线。
2.2 PDB准入策略的触发时机
PDB 准入策略并非对所有 API 请求都生效,它仅在以下三类高风险操作中被触发:
- Eviction 子资源请求(Pod 主动驱逐)
客户端调用POST /api/v1/namespaces/{ns}/pods/{name}/eviction时,准入控制器读取目标 Pod 所属的 PDB,校验驱逐后剩余 Pod 数量是否 ≥minAvailable(或maxUnavailable是否超标)。 - 节点排水(kubectl drain)
Drain 操作本质上是批量 Eviction 请求,每个 Pod 的驱逐都会触发 PDB 准入校验。若某个 Pod 的驱逐会导致 PDB 违约,整个 Drain 流程将阻塞或报错。 - 集群升级 / 节点池缩容
自动化升级工具(如 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 前确认工作负载有替代保护机制 |
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%,否则升级流程将完全阻塞。