← 中文资源

简体中文版本

用 PodDisruptionBudget 保障可用性

为关键 Deployment 设置 minAvailable,并验证节点排空时驱逐操作遵守预算而不是一次性移除全部副本。

阅读英文原文

概述

节点排空、集群升级和自动扩缩容的缩容都属于自愿中断:集群请求 Pod 离开。PodDisruptionBudget 告诉驱逐 API 同时可以有多少个 Pod 不可用。它本身不会让工作负载高可用,但能防止维护操作一次性移除过多副本。

步骤

  1. 创建预算,三副本时保持两个可用:
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: payments-api
  namespace: production
spec:
  minAvailable: 2
  selector:
    matchLabels:
      app: payments-api
  1. 用 kubectl get pdb payments-api -n production 确认 ALLOWED DISRUPTIONS 为 1。
  2. 执行 kubectl drain node-1 --ignore-daemonsets --delete-emptydir-data,观察 Pod 逐个迁移。
  3. 用拓扑分布约束把副本分散到不同节点,否则预算无法防止所有副本落在同一节点。

验证

预期排空时一次只驱逐一个 Pod,新 Pod 就绪后才继续;当健康副本少于两个时,排空会等待而不是强行删除。若排空长时间阻塞,检查是否有多个 PDB 选中同一批 Pod,重叠预算会叠加限制。

注意事项

  • PDB 只约束自愿中断,节点崩溃等非自愿中断仍可能同时失去所有副本。
  • minAvailable 等于副本数会让所有排空永久阻塞,应使用 N-1 或 maxUnavailable 百分比。
  • 选择器必须与 Pod 标签匹配,匹配不到任何 Pod 的 PDB 既不保护服务又会阻塞维护。
  • 修改副本数或扩缩容策略后要重新复核预算,并纳入版本控制。