【云原生】Kubernetes PDB(Pod Disruption Budget)介绍与简单使用
目录
一、概述
Pod Disruption Budget (pod 中断 预算) 简称PDB
,含义其实是终止pod前通过 labelSelector 机制获取正常运行的pod数目的限制,目的是对自愿中断的保护措施,主动驱逐Pod。Kubernetes version >= 1.7
才支持PodDisruptionBudget
。
官方文档:https://kubernetes.io/zh-cn/docs/tasks/run-application/configure-pdb/
完整版 k8s 内置资源结构图:
二、PDB 应用场景
- 节点维护或升级时 ( kubectl drain )
- 对应用的自动缩容操作(autoscaling down)
【温馨提示】如果 Node 状态处于 not ready,PDB 是不会生效,因为 PDB 只能针对自愿中断生效。
1)自愿中断和非自愿中断场景
Pod 不会消失,直到有人(人类或控制器)将其销毁,或者当出现不可避免的硬件或系统软件错误。
1、非自愿性中断场景
常见的非自愿性中断场景,例如:
- 后端节点物理机的硬件故障
- 集群管理员错误地删除虚拟机(实例)
- 云提供商或管理程序故障使虚拟机消失
- 内核恐慌(kernel panic)
- 节点由于集群网络分区而从集群中消失
- 由于节点资源不足而将容器逐出
2、自愿性中断场景
常见的自愿性中断场景,例如:
包括由应用程序所有者发起的操作和由集群管理员发起的操作。
- 删除管理该 pod 的 Deployment 或其他控制器。
- 更新了 Deployment 的 pod 模板导致 pod 重启。
- 直接删除 pod。
- 排空(drain)节点进行修复或升级。
- 从集群中排空节点以缩小集群(了解集群自动调节)。
- 从节点中移除一个 pod,以允许其他 pod 使用该节点。
2)PDB 关键参数和注意事项
.spec.selector
——用于指定其所作用的 Pod 集合(pod label),该字段为必需字段。.spec.minAvailable
——表示驱逐后仍须保证可用的 Pod 数量。即使因此影响到 Pod 驱逐 (即该条件在和 Pod 驱逐发生冲突时优先保证)。 minAvailable 值可以是pod数量或者百分比。.spec.maxUnavailable
——表示发生自愿中断的过程中,要保证最大不可用的pod数量或者百分比。
如果上面配置只能用来应用内置的
Deployment
、RS
、RC
、StatefulSet
、StatefulSet
的Pods,推荐优先使用.spec.maxUnavailable
。如果你使用了例如Operator
的其他控制器,那么设置时就要注意以下两点:
- 只能配置
.spec.minAvailable
,不能使用 maxUnavailable; .spec.minAvailable
只能为整型值,不能是百分比。
【注意事项】
- 同一个 PDB Object 中不能同时定义
.spec.minAvailable
和.spec.maxUnavailable
。 - 如果即没有设置
.spec.minAvailable
也没有设置.spec.maxUnavailable
的话,那么会默认设置.spec.minAvailable
为1
- 前面提到,应用滚动更新时Pod的
delete
和unavailable
虽然也属于自愿中断,但是实际上滚动更新有自己的策略控制(marSurge
和maxUnavailable
),因此PDB不会干预这个过程。 - PDB 只能保证自愿中断时的副本数,比如 evict pod过程中刚好满足
.spec.minAvailable
或.spec.maxUnavailable
,这时某个本来正常的Pod突然因为Node Down(非自愿中断)挂了,那么这个时候实际Pods数就比PDB中要求的少了,因此PDB不是万能的。
三、示例演示
1)使用 minAvailable 的PDB 示例
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: zk-pdb
spec:
minAvailable: 2
selector:
matchLabels:
app: zookeeper
2)使用 maxUnavailable 的 PDB 示例
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: zk-pdb
spec:
maxUnavailable: 1
selector:
matchLabels:
app: zookeeper
Kubernetes PDB 的介绍就先到这里了,其实PDB的使用场景不是很多,有疑问的小伙伴欢迎给我留言哦,后续会持续更新【云原生和大数据】相关的文章,请小伙伴耐心等待哦~