一、概念
PDB(PodDisruptionBudget):出现人为干扰操作时的Pod保护机制。
通过使用PDB,可以在集群出现某些干扰情况时对pod进行保护,从而避免不必要的服务中断或者服务降级。通常可对多副本工作负载进行保护,包括:Deployment、Replicaset、Statefulset、ReplicationController。
二、配置示例
bash
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: nginx-pdb
spec:
minAvailable: 2 # 最少可用 Pod 数,不能与maxunavailable同时配置
# maxUnavailable: 1 # 最多不可用 Pod 数,不能与maxunavailable同时配
selector:
matchLabels:
app: nginx
上面是示例中的关键字段解释:
- apiVersion:目前支持policy/v1beta1和policy/v1两个版本,policy/v1在k8sv1.22及以上版本可用。
- selector:标签选择器,表示关联的pod集合,通常与副本控制器的配置相同。
- minAvailabale:需要保证的最小pod数,可以设置为绝对值或百分比,设置为百分比时的算法为乘以副本数,并向上取整,不能与maxunavailable同时设置。
- maxUnavailable:允许不可用的最大pod数量,可以设置为绝对值或百分比,设置为百分比时的算法为乘以副本数,并向上取整,不能与minAvailabale同时设置。
三、干扰类型
PDB只能保护自愿干扰的情况
自愿干扰( Voluntary Disruptions ):人为操作干预pod状态,例如:
- 删除 Deployment 或其他管理 Pod 的控制器
- 更新了 Deployment 的 Pod 模板导致 Pod 重启
- 直接删除 Pod(例如,因为误操作)
- 排空(drain)节点进行修复或升级。
- 从集群中排空节点以缩小集群。
- 从节点中移除一个 Pod,以允许其他 Pod 使用该节点。
非自愿干扰( Involuntary Disruptions ):非人为干预的故障影响pod状态,例如:
- 节点下层物理机的硬件故障
- 集群管理员错误地删除虚拟机(实例)
- 云提供商或虚拟机管理程序中的故障导致的虚拟机消失
- 内核错误
- 节点由于集群网络隔离从集群中消失
- 由于节点资源不足导致 pod 被驱逐。