在 Kubernetes
中,为了保证业务不中断或业务SLA不降级,需要将应用进行集群化部署。通过PodDisruptionBudget
控制器可以设置应用POD集群处于运行状态最低个数,也可以设置应用POD集群处于运行状态的最低百分比,这样可以保证在主动销毁应用POD的时候,不会一次性销毁太多的应用POD,从而保证业务不中断或业务SLA不降级。
Pod Disruption Budget
(pod 中断 预算) 简称PDB
,含义其实是终止pod前通过 labelSelector
机制获取正常运行的pod
数目的限制,目的是对自愿中断
的保护措施。
Kubernetes version >= 1.7 才支持
PodDisruptionBudget
注意:如果 Node 状态处于
not ready
,PDB 是不会生效,因为 PDB 只能针对自愿中断
生效,什么叫自愿中断
下文介绍。
Pod 不会消失,直到有人(人类或控制器)将其销毁,或者当出现不可避免的硬件或系统软件错误。
我们把这些不可避免的情况称为应用的非自愿性中断
。例如:
除资源不足的情况外,大多数用户应该都熟悉以下这些情况;它们不是特定于 Kubernetes 的。
我们称这些情况为自愿中断
。包括由应用程序所有者发起的操作和由集群管理员发起的操作。典型的应用程序所有者操作包括:
集群管理员操作包括:
这些操作可能由集群管理员直接执行,也可能由集群管理员或集群托管提供商自动执行。
.spec.minAvailable
:表示发生自愿中断
的过程中,要保证至少可用的Pods数或者比例.spec.maxUnavailable
:表示发生自愿中断
的过程中,要保证最大不可用的Pods数或者比例上面配置只能用来对应 Deployment
,RS
,RC
,StatefulSet
的Pods,推荐优先使用 .spec.maxUnavailable
。
注意
:
.spec.minAvailable
和 .spec.maxUnavailable
。delete
和unavailable
虽然也属于自愿中断
,但是实际上滚动更新有自己的策略控制(marSurge
和 maxUnavailable
),因此PDB不会干预这个过程。自愿中断
时的副本数,比如 evict pod
过程中刚好满足 .spec.minAvailable
或 .spec.maxUnavailable
,这时某个本来正常的Pod突然因为Node Down
(非自愿中断)挂了,那么这个时候实际Pods数就比PDB中要求的少了,因此PDB不是万能的!使用上,如果设置 .spec.minAvailable
为 100%
或者 .spec.maxUnavailable
为 0%
,意味着会完全阻止 evict pods
的过程( Deployment
和StatefulSet
的滚动更新除外
)。
apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
name: nginx-pdb
namespace: default
spec:
minAvailable: 2
selector:
matchLabels:
app: nginx
maxUnavailable
参数:
apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
name: nginx-pdb
namespace: default
spec:
maxUnavailable: 30%
selector:
matchLabels:
app: nginx