1. 什么是自愿中断?
在 Kubernetes 中,中断分为两种:
自愿中断(Voluntary Disruptions):由用户或管理员主动触发的操作,例如:
- 升级或维护节点(Node Drain)。
- 手动删除 Pod。
- 更新 Deployment 或 StatefulSet 的 Pod 模板(触发滚动更新)。
非自愿中断(Involuntary Disruptions):由系统故障或意外事件引起的,例如:
- 节点硬件故障。
- 网络分区。
- 内核崩溃。
PDB 主要用于管理自愿中断,确保在中断过程中应用的高可用性。
2. PDB 的作用
PDB 的核心作用是:
- 限制同时中断的 Pod 数量,确保在自愿中断期间,应用仍然能够保持一定数量的可用 Pod。
- 防止因中断操作导致的服务不可用或性能下降。
例如:
- 如果你有一个包含 10 个 Pod 的 Deployment,设置 PDB 可以确保在节点升级时,最多只有 2 个 Pod 被终止,剩下的 8 个 Pod 仍然可以提供服务。
3. PDB 的关键参数
PDB 有两个关键参数,用于定义中断的容忍度:
minAvailable
:指定在中断期间,必须保持的最小可用 Pod 数量。- 例如:
minAvailable: 3
表示在任何时候,至少有 3 个 Pod 必须是可用的。
- 例如:
maxUnavailable
:指定在中断期间,最多允许多少个 Pod 不可用。- 例如:
maxUnavailable: 1
表示在任何时候,最多只能有 1 个 Pod 不可用。
- 例如:
注意:minAvailable
和 maxUnavailable
是互斥的,只能设置其中一个。
4. PDB 的工作原理
当 Kubernetes 进行自愿中断操作时(例如节点 Drain 或滚动更新),它会检查相关的 PDB 规则:
- 如果中断操作会导致 Pod 数量低于
minAvailable
或超过maxUnavailable
,则中断操作会被阻止。 - 只有当中断操作符合 PDB 规则时,才会继续执行。
例如:
- 假设你有一个 Deployment,包含 5 个 Pod,并且设置了
maxUnavailable: 1
。 - 当你触发滚动更新时,Kubernetes 会确保在任何时候,最多只有 1 个 Pod 被终止,剩下的 4 个 Pod 仍然可以提供服务。
5. PDB 的适用场景
PDB 特别适用于以下场景:
- 有状态服务:例如数据库(如 MySQL、PostgreSQL)或消息队列(如 Kafka、RabbitMQ),需要确保在中断期间仍然有足够的副本提供服务。
- 高可用服务:例如 Web 服务或 API 服务,需要确保在中断期间不会导致服务不可用。
- 滚动更新:在更新应用时,确保服务的可用性不受影响。
6. PDB 的示例
以下是一个 PDB 的 YAML 示例:
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: my-app-pdb
namespace: default
spec:
minAvailable: 2 # 确保至少有 2 个 Pod 可用
selector:
matchLabels:
app: my-app # 选择需要保护的 Pod
或者使用 maxUnavailable
:
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: my-app-pdb
namespace: default
spec:
maxUnavailable: 1 # 最多允许 1 个 Pod 不可用
selector:
matchLabels:
app: my-app # 选择需要保护的 Pod
7. PDB 的注意事项
- 仅对自愿中断有效:PDB 只能管理自愿中断(如节点 Drain、滚动更新),无法防止非自愿中断(如节点故障)。
- 需要合理设置参数:如果
minAvailable
或maxUnavailable
设置过于严格,可能会导致中断操作无法执行。 - 与 HPA 结合使用:如果应用使用了 Horizontal Pod Autoscaler(HPA),需要确保 PDB 的设置与 HPA 的伸缩策略兼容。
8. PDB 的实际应用
假设你有一个包含 3 个 Pod 的 Deployment,并且希望确保在节点升级时,至少有两个 Pod 可用。你可以创建一个 PDB:
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: my-app-pdb
namespace: default
spec:
minAvailable: 2
selector:
matchLabels:
app: my-app
当管理员执行节点 Drain 操作时,Kubernetes 会确保最多只有一个 Pod 被终止,剩下的两个 Pod 仍然可以提供服务。
总结
PodDisruptionBudget(PDB) 是 Kubernetes 中用于管理自愿中断的重要机制,通过设置 minAvailable
或 maxUnavailable
,可以确保在中断操作期间,应用的高可用性不受影响。理解并合理使用 PDB,可以帮助你在 Kubernetes 集群中更好地管理应用的稳定性和可用性。