在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的最小数量(或百分比)。
- 示例:
- spec:
- minAvailable: 2 # 绝对数值
- # 或
- minAvailable: "50%" # 百分比形式
复制代码 - 行为:当用户或系统尝试终止Pod时,Kubernetes会确保至少minAvailable个Pod处于运行状态。如果违反此约束,操作会被拒绝。
- 其他相关字段
- maxUnavailable(与minAvailable二选一):允许不可用的Pod的最大数量(或百分比)。
- spec:
- maxUnavailable: 1 # 最多允许1个Pod不可用
复制代码
使用注意事项
- 选择器(Selector)
PDB通过selector匹配Pod,需确保与目标Pod的标签一致:- selector:
- matchLabels:
- app: my-app
复制代码 注意:deployment中的选择器也是这个,它们是一个的,上面的my-app并不是deployment的name- spec:
- selector:
- matchLabels:
- app: my-app
复制代码
- 与控制器协作
- PDB不控制Pod的创建/删除,需配合Deployment、StatefulSet等使用。
- 例如:设置minAvailable: 1确保Deployment的Pod至少有一个始终可用。
- 资源冲突
- 若minAvailable值过大(如超过副本数),可能导致节点无法排水(需手动调整)。
- 非自愿中断
- PDB仅对自愿中断生效(如节点排水)。硬件故障、OOM Kill等非自愿中断不受PDB约束。
示例配置
- apiVersion: policy/v1
- kind: PodDisruptionBudget
- metadata:
- name: my-app-pdb
- spec:
- minAvailable: "50%" # 至少50%的Pod保持可用
- selector:
- matchLabels:
- app: hello
- ---
- apiVersion: apps/v1
- kind: Deployment
- metadata:
- name: hello-deployment
- spec:
- replicas: 3
- selector:
- matchLabels:
- deployment: hello # ← 查找标签为deployment=hello的Pod
- template:
- metadata:
- labels:
- deployment: hello # ← 创建Pod时给它打上deployment=hello标签
- spec:
- containers:
- - name: nginx
- image: nginx:1.14.2
复制代码 总结
- minAvailable:是PDB的核心字段,直接定义应用的高可用底线。
- 适用性:适合有状态服务或对可用性敏感的无状态服务。
- 平衡:需根据业务需求在“可维护性”和“可用性”之间权衡(如设置过高可能导致维护困难)。
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |
|
|
|
|
|
相关推荐
|
|
|