K8S中如何配置PDB(Pod Disruption Budget)

发布于:2025-08-14 ⋅ 阅读:(17) ⋅ 点赞:(0)

1. PDB 核心概念

  • 作用:控制自愿中断(如节点升级、缩容)期间,应用的最小可用副本数或最大不可用比例。
  • 关键参数
    • minAvailable:必须保持运行的 Pod 数量(如 2 或 50%)。
    • maxUnavailable:允许中断的 Pod 数量(如 1 或 10%)。
  • 注意两者只能选其一,不可同时使用。

2. 配置步骤

(1)编写 PDB YAML 文件
apiVersion: policy/v1  # Kubernetes ≥1.21 使用 policy/v1
kind: PodDisruptionBudget
metadata:
  name: myapp-pdb      # PDB 名称
  namespace: default   # 目标命名空间
spec:
  minAvailable: 1      # 或 maxUnavailable: "20%"
  selector:
    matchLabels:
      app: myapp       # 匹配目标 Pod 的标签(需与 Deployment/StatefulSet 一致)
(2)应用配置
kubectl apply -f pdb.yaml
(3)验证配置
kubectl get pdb -n default          # 查看 PDB 状态
kubectl describe pdb myapp-pdb      # 检查详情

3. 关键注意事项

3.1 适用对象

3.2 中断类型

  • 仅对以下控制器管理的 Pod 生效:Deployment / StatefulSet / ReplicaSet / ReplicationController
  • 不适用:裸 Pod(未绑定控制器)。
  • 仅针对自愿中断(如 kubectl drain),对节点宕机等非自愿中断无效。

3.3 参数冲突

3.4 优先级干扰

  • 若设置 minAvailable: 2 但当前副本数为 1,PDB 会阻止所有驱逐操作。
  • 若集群启用 Pod 优先级,高优先级 Pod 可能绕过 PDB 限制驱逐低优先级 Pod。

4. 实际场景示例

场景 1:确保至少 2 个 Pod 可用
spec:
  minAvailable: 2
  selector:
    matchLabels:
      app: nginx
场景 2:允许最多 1 个 Pod 不可用
spec:
  maxUnavailable: 1
  selector:
    matchLabels:
      app: redis

5. 测试与维护

  • 模拟节点维护

    kubectl drain <node-name> --ignore-daemonsets

    若违反 PDB 规则,命令会报错并终止。

  • 删除 PDB

    kubectl delete pdb myapp-pdb -n default

6. 总结

PDB 是保障应用高可用的关键工具,需结合业务需求合理置 minAvailable 或 maxUnavailable,并通过测试验证其行为是否符合预期。


网站公告

今日签到

点亮在社区的每一天
去签到