1. 简介

在容器编排技术快速发展的今天,Kubernetes 已成为事实上的标准。它帮助开发者和架构师在大规模集群中高效管理容器化应用。虽然 Kubernetes 在部署、扩缩容和运维方面表现出色,但如何在系统维护或升级期间保持应用的高可用性,仍然是一个需要深入思考的问题。

本文将重点介绍 Pod Disruption Budget(PDB),这是 Kubernetes 提供的一个机制,用于在自愿性中断(如节点升级、滚动更新、自动扩缩容等)期间确保应用的最小可用性。通过 PDB,我们可以定义一个应用在中断期间至少需要保持运行的 Pod 数量,从而避免服务不可用或性能下降。

我们还将探讨 PDB 如何与 ReplicaSet、Deployment、StatefulSet 等组件协同工作,以及如何配置和监控 PDB,帮助你在实际项目中更好地使用它。

2. 理解 Pod Disruption Budget

2.1. 什么是 Pod Disruption Budget

Pod Disruption Budget 是一种 Kubernetes 资源对象,用于限制在自愿性中断期间可以下线的 Pod 数量。它确保应用在这些中断期间仍然保持一定的可用性。

⚠️ 注意:PDB 只对自愿性中断(Voluntary Disruptions)生效,例如:

  • 节点维护(如升级、重启)
  • 滚动更新
  • 自动扩缩容
  • 集群自动伸缩器(Cluster Autoscaler)缩容节点

而不适用于非自愿性中断(如节点宕机、网络故障)。

2.2. PDB 的作用

PDB 的核心目标是:

✅ 保证在中断期间,应用仍有足够数量的 Pod 处于运行状态
✅ 防止因中断操作导致服务不可用
✅ 为 Kubernetes 提供调度依据,决定是否允许某些中断操作

例如,当你执行节点驱逐操作时,Kubernetes 会检查该节点上的 Pod 是否受 PDB 保护。如果中断会导致 PDB 被违反(即可用 Pod 数量低于设定值),Kubernetes 将拒绝该操作或延迟执行

2.3. PDB 与 Kubernetes 其他组件的关系

PDB 通常与以下控制器配合使用:

  • Deployment
  • ReplicaSet
  • StatefulSet

这些控制器负责确保指定数量的 Pod 副本始终处于运行状态。而 PDB 则在这些副本中进一步设置一个“底线”,确保在中断期间,至少有某个数量的 Pod 保持可用。

这种协作机制让 Kubernetes 在保持系统稳定性的同时,也能灵活地进行升级和维护。

3. 配置 Pod Disruption Budget

3.1. PDB 的基本结构

PDB 的配置通过 YAML 文件定义,其基本结构如下:

apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: my-pdb
spec:
  minAvailable: 1
  selector:
    matchLabels:
      app: myapp

其中:

  • minAvailable:表示中断期间至少需要保持运行的 Pod 数量(可为绝对值或百分比)
  • maxUnavailable:表示中断期间最多允许不可用的 Pod 数量(可为绝对值或百分比)
  • selector:用于选择受该 PDB 保护的 Pod(通过标签匹配)

⚠️ 注意:minAvailablemaxUnavailable 只能设置其中一个,不能同时存在。

3.2. 示例:为 Web 应用配置 PDB

假设我们有一个运行 3 个副本的 Web 应用,我们希望在中断期间至少保持 2 个 Pod 可用:

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

该配置确保最多只允许 1 个 Pod 被中断,从而保证服务的可用性。

3.3. 示例:为复杂应用配置 PDB

对于可以容忍部分中断的复杂应用,我们可以使用 maxUnavailable

apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: complex-app-pdb
spec:
  maxUnavailable: 50%
  selector:
    matchLabels:
      app: complex-app

该配置允许最多 50% 的 Pod 在中断期间不可用。

4. 管理与监控 PDB

4.1. 查看当前 PDB 列表

使用 kubectl get pdb 可查看当前集群中的所有 PDB:

$ kubectl get pdb
NAME               MIN AVAILABLE   MAX UNAVAILABLE   ALLOWED DISRUPTIONS   AGE
frontend-budget    2               N/A               1                     48h
backend-budget     1               N/A               2                     24h

4.2. 查看某个 PDB 的详细信息

使用 kubectl describe pdb <pdb-name> 可查看某个 PDB 的详细信息:

$ kubectl describe pdb frontend-budget
Name:           frontend-budget
Namespace:      default
Selector:       app=frontend
Status:
  Current Healthy:   3
  Desired Healthy:   2
  Disruptions Allowed:   1
  Expected Pods:    3

4.3. 监控 PDB 事件

通过 kubectl get events 可查看与 PDB 相关的事件:

$ kubectl get events --sort-by='.metadata.creationTimestamp'
LAST SEEN   TYPE      REASON              OBJECT                MESSAGE
2m          Normal    NoDisruption        pdb/frontend-budget   All disruptions are currently allowed
30s         Warning   DisruptionPrevented pdb/backend-budget    Disruption prevented due to PDB backend-budget

这些事件可以帮助你了解 PDB 是否正在发挥作用,以及是否有中断被阻止。

5. 高级 PDB 配置

5.1. 为有状态应用配置 PDB

对于数据库、消息队列等有状态应用,通常需要更高的可用性保障:

apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: database-pdb
spec:
  minAvailable: 1
  selector:
    matchLabels:
      app: my-database

该配置确保至少有一个数据库 Pod 始终可用,避免数据不可访问。

5.2. 为 Elasticsearch 集群配置 PDB

对于多组件系统(如 Elasticsearch),可以为每个组件单独配置 PDB:

apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
  name: quickstart
spec:
  version: 8.12.1
  nodeSets:
  - name: default
    count: 3
  podDisruptionBudget:
    spec:
      minAvailable: 2
      selector:
        matchLabels:
          elasticsearch.k8s.elastic.co/cluster-name: quickstart

此配置确保 Elasticsearch 集群在中断期间至少有 2 个节点可用,从而维持集群的稳定性和查询性能。

⚠️ 注意:PDB 的配置不能过于宽松或严格。过于宽松可能导致服务中断,过于严格则可能阻碍正常的维护操作。建议根据实际业务需求定期评估和调整 PDB 配置。

6. 总结

Pod Disruption Budget 是 Kubernetes 实现高可用性的重要机制之一。它通过设置中断期间的最小可用 Pod 数量,确保应用在维护、升级、扩缩容等操作期间仍能正常运行。

关键点总结如下:

✅ PDB 只对自愿性中断生效
✅ 可通过 minAvailablemaxUnavailable 设置中断容忍度
✅ 需要与 Deployment、StatefulSet 等控制器配合使用
✅ 可通过 kubectl 查看和监控 PDB 状态
✅ 对有状态和无状态应用应区别配置
✅ 配置需根据业务需求动态调整

通过合理配置 PDB,你可以在保证系统稳定性的同时,实现灵活的运维操作。在 Kubernetes 的高可用架构中,PDB 是不可或缺的一环。


原始标题:What Is Pod Disruption Budget in Kubernetes