使用 PodDisruptionBudgets

了解 PodDisruptionBudgets

请参阅 Kubernetes 官方文档:为您的原生应用指定中断预算

PodDisruptionBudget(PDB)允许您在 Pod 因升级或 Kubernetes 节点上的例行维护等原因需要重新调度时,限制对原生应用造成的中断。

作为集群管理员或原生应用所有者,您可以为每个原生应用创建一个 PodDisruptionBudget。PDB 会限制复制型原生应用中因自愿中断而同时宕机的 Pod 数量。例如,基于仲裁的应用希望确保运行中的副本数量绝不会低于维持仲裁所需的数量。Web 前端可能希望确保提供负载服务的副本数量绝不会低于总数的某个百分比。

通过使用 PodDisruptionBudgets,您可以

  • 确保高可用性:在节点维护、集群升级或其他自愿中断期间,保持最少数量的可用副本。
  • 控制中断影响:通过指定 minAvailablemaxUnavailable,精确定义原生应用可以容忍多少中断。
  • 安全地清空节点:在执行 kubectl drain 等操作期间,系统会遵守 PDB,并等待直到可以在不违反中断预算的情况下安全驱逐 Pod。

工作原理

  1. 您使用标签选择器定义一个 PodDisruptionBudget 资源,以针对一组特定的 Pod。
  2. 您指定 minAvailable(必须保持可用的 Pod 的最小数量或百分比)或 maxUnavailable(可以同时不可用的 Pod 的最大数量或百分比)。
  3. 当发生自愿中断(例如为进行 OS 升级而清空节点)时,eviction API 会检查 PDB。如果驱逐 Pod 会违反预算,则会阻止或延迟驱逐,直到有足够数量的 Pod 重新变为可用。

创建 PodDisruptionBudgets

使用 CLI 创建 PDB

前提条件

  • 确保您已配置 kubectl 并已连接到集群。
  • 您必须有一个运行多个副本的原生应用(例如 Deployment 或 StatefulSet)。

YAML 文件示例

# example-pdb.yaml
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: nginx-pdb
spec:
  minAvailable: 2 # Alternatively, you can use maxUnavailable: 1
  selector:
    matchLabels:
      app: nginx

通过 YAML 创建 PDB

# Step 1: Create the PodDisruptionBudget
kubectl apply -f example-pdb.yaml

# Step 2: Verify the PDB status
kubectl get pdb nginx-pdb

输出将显示允许的中断数、最小可用数以及当前健康的 Pod 数。

使用 CLI 管理 PDB

查看 PDB

  • 列出命名空间中的所有 PDB:

    kubectl get poddisruptionbudgets
  • 获取某个特定 PDB 的详细信息:

    kubectl describe poddisruptionbudget <pdb-name>

更新 PDB

您可以通过编辑配置来更新 PDB。例如,要更改 minAvailable

kubectl edit poddisruptionbudget <pdb-name>

修改 minAvailablemaxUnavailable 字段,然后保存并退出。

删除 PDB

如果您不再需要使用 PDB 保护工作负载,可以安全地将其删除:

kubectl delete poddisruptionbudget <pdb-name>

删除 PDB 不会影响实际运行中的原生应用,它只会移除用于节点维护和驱逐过程的中断预算约束。

何时使用 PodDisruptionBudget

在以下情况下,您应考虑使用 PDB:

  • 您的原生应用需要严格的最小副本数来处理流量或维持仲裁(例如 ZooKeeper、Elasticsearch)。
  • 您在一个集群上运行工作负载,而集群管理员经常执行节点升级或扩缩操作。
  • 您希望在诸如节点清空之类的自愿中断期间确保零停机。

PDB 不适用于非自愿中断(例如节点硬件故障、kernel panic),因为这些中断无法由 Kubernetes 延迟或阻止。