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

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,并通过测试验证其行为是否符合预期。

--- # Source: calico/templates/calico-kube-controllers.yaml # This manifest creates a Pod Disruption Budget for Controller to allow K8s Cluster Autoscaler to evict apiVersion: policy/v1 kind: PodDisruptionBudget metadata: name: calico-kube-controllers namespace: kube-system labels: k8s-app: calico-kube-controllers spec: maxUnavailable: 1 selector: matchLabels: k8s-app: calico-kube-controllers --- # Source: calico/templates/calico-kube-controllers.yaml apiVersion: v1 kind: ServiceAccount metadata: name: calico-kube-controllers namespace: kube-system --- # Source: calico/templates/calico-node.yaml apiVersion: v1 kind: ServiceAccount metadata: name: calico-node namespace: kube-system --- # Source: calico/templates/calico-config.yaml # This ConfigMap is used to configure a self-hosted Calico installation. kind: ConfigMap apiVersion: v1 metadata: name: calico-config namespace: kube-system data: # Typha is disabled. typha_service_name: "none" # Configure the backend to use. calico_backend: "bird" # Configure the MTU to use for workload interfaces and tunnels. # By default, MTU is auto-detected, and explicitly setting this field should not be required. # You can override auto-detection by providing a non-zero value. veth_mtu: "0" # The CNI network configuration to install on each node. The special # values in this config will be automatically populated. cni_network_config: |- { "name": "k8s-pod-network", "cniVersion": "0.3.1", "plugins": [ { "type": "calico", "log_level": "info", "log_file_path": "/var/log/calico/cni/cni.log", "datastore_type": "kubernetes", "nodename": "__KUBERNETES_NODE_NAME__", "mtu": __CNI_MTU__, "ipam": { "type": "calico-ipam" }, "policy": { "type": "k8s" }, "kubernetes": { "kubeconfig": "__KUBECONFIG_FILEPATH__"
03-20
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值