导读:本期聚焦于小伙伴创作的《Kubernetes PodDisruptionBudget 是什么以及如何配置才能避免服务中断》,敬请观看详情。节点维护或集群缩容时,为什么关键服务还会突然不可用。PodDisruptionBudget 是 Kubernetes 中控制自愿中断的保护机制,它限定同一时间因驱逐而离线的 Pod 数量。通过设定最小可用副本数或最大不可用比例,调度器在排水操作前会校验是否突破阈值。本文说明其工作原理与典型配置,帮助你在不影响发布效率的前提下保障业务连续性,尤其适合对可用性敏感的在线系统参考。

在 Kubernetes 集群运维中,节点重启、版本升级和自动缩容都会触发 Pod 的主动驱逐。PodDisruptionBudget(简称 PDB)正是用来约束这类“自愿中断”的对象,它能够保证应用在运维操作期间始终有足够数量的副本对外提供服务。理解 PDB 的运作方式,是构建高可用系统的关键一步。

Kubernetes PodDisruptionBudget 是什么以及如何配置才能避免服务中断

PodDisruptionBudget 的核心机制与字段含义

PDB 属于 policy 资源组,通过标签选择器匹配目标 Pod,再以两个互斥字段之一描述容忍度:minAvailable 指定驱逐后必须保持的最小健康副本数,maxUnavailable 指定同一时刻最多可不可用的副本比例或绝对值。当集群执行排水(drain)等自愿中断动作时,API 服务器会借助 PDB 控制器判断当前操作是否会导致可用副本低于阈值,若会则拒绝或暂停驱逐。

需要明确的是,PDB 仅作用于“自愿中断”,例如管理员执行的 kubectl drain、节点池缩容、集群升级。对于节点宕机、内核崩溃等“非自愿中断”,PDB 无能为力,这类场景需依赖多副本跨可用区部署与就绪探针。此外,PDB 不会阻断删除 Pod 的 API 调用本身,而是让驱逐控制器在批量操作中遵守预算,因此它更像一个并发安全阀而非删除拦截器。

下面是一个基础定义示例,要求匹配标签 app=web 的部署至少保留三个实例:

apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: web-pdb
spec:
  minAvailable: 3
  selector:
    matchLabels:
      app: web

若改用比例控制,可写 maxUnavailable: 20%,表示五分之一实例可短暂离线。注意 minAvailablemaxUnavailable 不可同时设置,且取值若大于实际副本总数会导致永远无法驱逐,需结合 HPA 实际规模评估。

配置策略与常见误用分析

选择 minAvailable 还是 maxUnavailable 取决于业务模型。对延迟极度敏感的服务,用 minAvailable 锁定底线副本,能保证容量不缩水;对可容忍短暂降级的批处理作业,用 maxUnavailable 提升运维灵活度,让节点维护更快完成。实践中常犯的错误是把 PDB 的 minAvailable 设为等于 Deployment 的副本数,这样任何驱逐都会被阻塞,节点永远排不空,反而拖慢集群升级。

另一个误区是认为 PDB 能防止滚动更新引起的中断。实际上 RollingUpdate 由 Deployment 控制器管理,与 PDB 的自愿中断校验路径不同,PDB 主要盯防外部驱逐。如果应用只有单副本却又配置了 minAvailable: 1,节点维护时该 Pod 无法被移走,只能强制删除,此时 PDB 形同虚设。因此副本数设计应大于一,并让 PDB 阈值低于总副本。

以下例子展示一个允许最多一个实例不可用的配置,适合三副本以上的无状态 API:

apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: api-pdb
spec:
  maxUnavailable: 1
  selector:
    matchLabels:
      tier: backend

当运维执行 kubectl drain node-1 --ignore-daemonsets 时,若驱逐会使不可用数超一,命令将等待或报错,直到新 Pod 在别的节点就绪。这种机制把“可用性”显式写进运维流程,避免人为疏忽。

与驱逐流程、监控告警的协同实践

在真实集群中,PDB 的效果依赖驱逐控制器的配合。从 Kubernetes 1.22 起,policy/v1 稳定,PDB 状态字段 disruptionsAllowed 能告诉你当前还能安全驱逐几个 Pod。将其接入 Prometheus,可绘制“节点维护阻塞次数”面板,提前发现预算过紧的问题。若发现 drain 长时间卡住,多半是 PDB 阈值过高或副本分布不均。

为保证 PDB 真正生效,Pod 必须设置合理的 terminationGracePeriodSeconds 与 preStop 钩子,让连接在断开前被 drained。否则即使 PDB 允许驱逐,旧 Pod 被强杀也会丢请求。建议配合 readinessProbe 在终止前摘流量,形成“PDB 控并发、探针控流量”的双重保护。

下面代码展示在 Deployment 中同时声明优雅停止与 PDB 引用的典型片段:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
spec:
  replicas: 4
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      terminationGracePeriodSeconds: 30
      containers:
      - name: nginx
        image: nginx:1.25
        readinessProbe:
          httpGet:
            path: /healthz
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 10

把上述 Deployment 与前面 minAvailable: 3 的 PDB 绑定后,任意单次节点维护最多同时终止一个 Web Pod,其余三副本继续接流。这种组合在电商大促前的集群补丁操作中已被广泛验证,既不让节点滞留,也不让错误率飙升。

PodDisruptionBudgetKubernetes自愿中断修改时间:2026-08-15 17:56:27

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。