k8s之PodDisruptionBudget详解

1.PDB介绍

Pod中断预算是Kubernetes API的一部分,可以kubectl像其他对象类型一样使用命令进行管理。它们允许在操作期间对 Pod 指定安全约束,例如耗尽节点以进行维护。

PodDisruptionBudget是一个 API 对象,用于指定必须同时启动的副本的最小数量或百分比。在项目中设置这些值在节点维护期间(例如缩减集群升级集群 )很有用,并且仅在自愿驱逐时(而不是节点故障时)才有效。

对象PodDisruptionBudget的配置由以下主要部分组成:

标签选择器,它是对一组 pod 的标签查询。

可用性级别,指定必须同时可用的最小 Pod 数量,可以是:

  • minAvailable即使在发生中断时,也必须始终有足够的可用 pod。
  • maxUnavailable是在中断期间不可用的 pod 数量。

允许maxUnavailable为0%或0或minAvailable为100%或等于副本数量,但可以阻止节点被驱逐(drained)。

您可以使用以下命令检查所有项目的 pod 中断预算:

kubectl get poddisruptionbudget --all-namespaces

当系统中 PodDisruptionBudget至少有minAvailable pod 正在运行时,即视为健康 。超过该限制的每个 pod 都将被驱逐。

根据您的 pod 优先级和抢占设置,较低优先级的 pod 可能会被删除,尽管它们的 pod 中断预算要求较高。

2.使用

您可以使用PodDisruptionBudget对象来指定必须同时启动的副本的最小数量或百分比。

要配置 pod 中断预算:

创建一个 YAML 文件,其对象定义类似于以下内容:

yaml 复制代码
apiVersion: policy/v1 # PodDisruptionBudget是 API 组的一部分policy/v1。
kind: PodDisruptionBudget
metadata:
  name: my-pdb
spec:
  minAvailable: 2   # 必须同时可用的最小 Pod 数量。这可以是整数,也可以是指定百分比的字符串,例如20%。
  selector:  # matchLabels对一组资源进行标签查询。和 的结果matchExpressions在逻辑上是相连的。
    matchLabels:
      foo: bar

或者:

yaml 复制代码
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: my-pdb
spec:
  maxUnavailable: 25% 
  selector: 
    matchLabels:
      foo: bar

3.PDB 作用

  1. 集群管理员手动驱逐 Pod (kubectl drain 等操作)
    • 例如,你执行 kubectl drain --ignore-daemonsets 以清空一个节点上的 Pod。
    • PDB 会阻止 Kubernetes 在同一时间驱逐超过 1 个 Pod,以保证至少有 2 个 Pod 仍在运行。
  2. 自动缩容或节点维护
    • 如果集群进行自动缩容(AutoScaler)或节点升级,PDB 也会限制 同时终止的 Pod 数量,避免影响服务可用性。

⚠️ 注意:minAvailable 和 maxUnavailable 只能二选一,不能同时定义。

总结

• PDB 主要用于"计划性"中断(驱逐、升级、节点维护等),而非意外宕机。

• 适用于 StatefulSet、Deployment、DaemonSet 等工作负载,以 防止一次性驱逐过多 Pod,导致服务不可用。

• 在**高可用应用(如 Redis、Elasticsearch、Kafka 等)**中,PDB 能有效避免集群维护时造成的 服务中断。

相关推荐
极客先躯9 小时前
高级java每日一道面试题-2026年05月03日-实战篇[Docker]-如何实现容器化环境的数据加密?
java·运维·docker·容器·金融·加解密·高级面试
阿里云云原生13 小时前
将内核专家经验封装进 Agent:SysOM 巡检 Skill 开源,赋能你的运维自动化闭环
云原生
自律懒人13 小时前
AI应用从原型到上线的最后一公里——灵光闪应用一键部署深度实测,30+免费API + Serverless零配置发布
人工智能·云原生·开源·serverless
程序喵大人14 小时前
【C++进阶】STL容器与迭代器 - 05 map 和 set 为什么按键保持有序
开发语言·c++·容器·迭代器·stl
风曦Kisaki15 小时前
Kubernetes(K8s)笔记Day03: Pod命名空间,标签,Pod 的调度,污点与容忍度,Pod 常见状态和重启策略,Pod 生命周期
linux·运维·笔记·docker·云原生·容器·kubernetes
张忠琳15 小时前
【NVIDIA】NVIDIA k8s-device-plugin v0.19.3 资源管理器模块深度分析之三
云原生·容器·架构·kubernetes·nvidia
Chengbei1117 小时前
云安全漏洞挖掘SKILL、一站式云漏洞挖掘工具,支持S3爆破、IMDS探测、K8s检测与AK/SK权限利用
前端·人工智能·网络安全·云原生·容器·kubernetes·系统安全
Ai拆代码的曹操18 小时前
K8s 调度器 predicate 阶段揭秘:为什么你的 Pod 总是堆在同一台机器
后端·容器
Ai拆代码的曹操18 小时前
手摸手排查:Pod CrashLoopBackOff 日志丢失问题,3 层兜底方案
后端·容器
瞬间&永恒~19 小时前
【MySQL】练习5-1:配置慢查询日志
linux·运维·云原生