Kubernetes 的 Pod 中断预算(Pod Disruption Budget,简称 PDB)用于确保在自愿性中断(如节点维护、集群升级或滚动更新)期间,应用仍能保持足够的可用副本数。它的核心作用是防止应用因人为操作导致服务不可用。
什么是自愿性中断?
自愿性中断是指由管理员或自动化流程主动触发的操作,比如:
使用 kubectl drain 排空节点进行维护 执行节点升级或重启 应用 Deployment 的滚动更新这些操作可能会删除 Pod,而 PDB 能控制在此类场景下,最多允许多少 Pod 被同时中断。
Pod 中断预算如何工作?
PDB 通过设置一个最小可用 Pod 数量或最大允许不可用数量,来限制控制器(如 Deployment、StatefulSet)在中断期间可以删除的 Pod 数量。
当执行如 kubectl drain 这类操作时,驱逐 API 会检查对应工作负载是否配置了 PDB。如果有,调度器会验证驱逐后是否仍能满足 PDB 的约束。如果不满足,该操作会被拒绝或暂停。
例如,假设你有一个 5 个副本的应用,设置 PDB 要求至少 3 个 Pod 可用:
最多允许 2 个 Pod 被中断 在节点排空时,系统只会批准不影响最低可用性的驱逐请求如何配置 PDB?
PDB 通过 YAML 定义,关键字段包括 minAvailable 或 maxUnavailable,二者选其一:
示例 1:保证至少 3 个 Pod 可用
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: my-pdb
spec:
minAvailable: 3
selector:
matchLabels:
app: my-app
示例 2:最多允许 1 个 Pod 不可用(适用于 3 副本)
spec:
maxUnavailable: 1
selector:
matchLabels:
app: my-app
selector 用于匹配受保护的 Pod,通常与 Deployment 的标签一致。
非自愿中断不受 PDB 保护
需要注意的是,PDB 只对自愿性中断有效。如果是节点崩溃、网络故障或 kubelet 崩溃等非自愿中断,PDB 不起作用。这类情况需要依赖副本机制和健康检查来恢复服务。
基本上就这些。PDB 是保障运维操作期间服务稳定的关键机制,合理配置能避免误操作引发的服务雪崩。
