找回密码
 立即注册
首页 业界区 安全 k8s~Kubernetes PDB

k8s~Kubernetes PDB

尚腱埂 4 天前
在Kubernetes(k8s)中,PodDisruptionBudget(PDB)是一种资源对象,用于限制在自愿中断(voluntary disruptions)期间同时终止的Pod数量,从而保障应用的可用性。以下是详细说明:
我们为Deployment配置了PDB(PodDisruptionBudget),目的是在自愿中断(如节点维护、升级)时,保证一定数量的Pod副本可用。但是,PDB并不影响非自愿中断(如节点故障、资源不足导致的驱逐)。因此,测试PDB功能是否生效,我们需要模拟自愿中断的场景。

PodDisruptionBudget 的作用


  • 核心目标

    • 确保在主动运维操作(如节点排水、集群升级、自动缩容等)时,应用始终有指定数量的Pod保持运行。
    • 防止因同时终止过多Pod导致服务不可用。

  • 适用场景

    • 节点维护(kubectl drain)
    • 集群自动扩缩容(如Cluster Autoscaler)
    • 控制器(如Deployment)的滚动更新不适用(PDB仅针对非控制器触发的终止)。

  • 关键字段 spec.minAvailable

    • 定义:指定必须保持可用的Pod的最小数量(或百分比)。
    • 示例
      1. spec:
      2.   minAvailable: 2  # 绝对数值
      3.   # 或
      4.   minAvailable: "50%"  # 百分比形式
      复制代码
    • 行为:当用户或系统尝试终止Pod时,Kubernetes会确保至少minAvailable个Pod处于运行状态。如果违反此约束,操作会被拒绝。

  • 其他相关字段

    • maxUnavailable(与minAvailable二选一):允许不可用的Pod的最大数量(或百分比)。
      1. spec:
      2.   maxUnavailable: 1  # 最多允许1个Pod不可用
      复制代码

使用注意事项


  • 选择器(Selector)
    PDB通过selector匹配Pod,需确保与目标Pod的标签一致:
    1. selector:
    2.   matchLabels:
    3.     app: my-app
    复制代码
注意:deployment中的选择器也是这个,它们是一个的,上面的my-app并不是deployment的name
  1. spec:
  2.    selector:
  3.      matchLabels:
  4.        app: my-app
复制代码

  • 与控制器协作

    • PDB不控制Pod的创建/删除,需配合Deployment、StatefulSet等使用。
    • 例如:设置minAvailable: 1确保Deployment的Pod至少有一个始终可用。

  • 资源冲突

    • 若minAvailable值过大(如超过副本数),可能导致节点无法排水(需手动调整)。

  • 非自愿中断

    • PDB仅对自愿中断生效(如节点排水)。硬件故障、OOM Kill等非自愿中断不受PDB约束。

示例配置
  1. apiVersion: policy/v1
  2. kind: PodDisruptionBudget
  3. metadata:
  4.   name: my-app-pdb
  5. spec:
  6.   minAvailable: "50%"  # 至少50%的Pod保持可用
  7.   selector:
  8.     matchLabels:
  9.       app: hello
  10. ---
  11. apiVersion: apps/v1
  12. kind: Deployment
  13. metadata:
  14.   name: hello-deployment
  15. spec:
  16.   replicas: 3
  17.   selector:
  18.     matchLabels:
  19.       deployment: hello  # ← 查找标签为deployment=hello的Pod
  20.   template:
  21.     metadata:
  22.       labels:
  23.         deployment: hello  # ← 创建Pod时给它打上deployment=hello标签
  24.     spec:
  25.       containers:
  26.       - name: nginx
  27.         image: nginx:1.14.2
复制代码
总结


  • minAvailable:是PDB的核心字段,直接定义应用的高可用底线。
  • 适用性:适合有状态服务或对可用性敏感的无状态服务。
  • 平衡:需根据业务需求在“可维护性”和“可用性”之间权衡(如设置过高可能导致维护困难)。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册