系列目录html
上一节咱们讲到了因为一些人为的或者不可避免的缘由,pod可能会中断,而使用Pod Disruption Budget
能够最大限度地保证在pod中断发生时集群仍然保持可以接受的状态.前端
一句话,PDB可以限制同时中断的pod的数量,以保证集群的高可用性.api
1) 肯定你想要使用PodDisruptionBudget (PDB)
来保护的集群bash
2) 考虑集群如何影响中断app
3) 使用yaml文件建立PDB定义code
4) 使用yaml文件建立PDB对象htm
最多见的要保护的对象是是如下kubernetes内置的controller建立的应用对象之一:对象
决定在短期内有多少个实例可能会被宕掉(因为自愿中断,前面一节咱们讲到过何为自愿中断,非自愿中断不被PDB控制)blog
关注点:服务能力不能减小超过10%get
解决方案: 使用一个包含minAvailable 90%
值的PDB
关注点:不要在不知情状况下中断
可能的解决方案1:不使用PDB,容易偶尔的宕机
可能的解决方案2:使用PDB,设置maxUnavailable=0
.当集群管理员想要终止pod的时候,他须要联系你,而后删除掉PDB以准备应对中断,而后从新建立.(若是maxUnavailable=0则不能进行自愿中断操做)
关注点:运行的实例数不能低于法定数量
可能的解决方案1:把maxUnavailable to 1(根据不一样集群要求不一样,能够设置为不一样的值)
可能的解决方案2:把minAvailable设置为法定数量.
一个PDB有三个字段:
1) 一个label选择器.spec.selector
,用来指定要选择的pod集合,此为必选项
2) .spec.minAvailable
,在pod被驱离的状况下,必须保证的最小可用的pod数量.minAvailable
能够是一个绝对数值或者一个百分数
3) .spec.maxUnavailable
(kubernetes 1.7之后版本),在发生驱离的状况下,最大的不可用副本的数量,值能够是绝对数值或者一个百分比.
在一个PDB定义中,只能指定minAvailable
或maxUnavailable
其一.maxUnavailable
中能用于有控制器控制的pod的驱离.
maxUnavailable 值为 0% (或 0),或者minAvailable值为100%(或者与replicas的值相等)则会彻底阻止pod驱离.
如下示例的PDB会选择labels值包含app: zookeeper
的pod
minAvailable
的示例apiVersion: policy/v1beta1 kind: PodDisruptionBudget metadata: name: zk-pdb spec: minAvailable: 2 selector: matchLabels: app: zookeeper
maxUnavailable
的示例apiVersion: policy/v1beta1 kind: PodDisruptionBudget metadata: name: zk-pdb spec: maxUnavailable: 1 selector: matchLabels: app: zookeeper
例如以上zk-pdb
对象选择了一个pod数量为3的有状态集合,上面两种定义意义彻底相同,推荐使用maxUnavailable
你可使用kubectl apply -f xxx.yaml
来建立一个PDB对象
PDB对象不能被更新,你只可以删除它而后从新建立.
使用kubectl来检测pdb是否被建立.
假设没有pod匹配app: zookeeper
,你将会看到以下信息
kubectl get poddisruptionbudgets
NAME MIN-AVAILABLE ALLOWED-DISRUPTIONS AGE zk-pdb 2 0 7s
若是有匹配的pod(好比说3个),则你看到的信息将相似以下
kubectl get poddisruptionbudgets
NAME MIN-AVAILABLE ALLOWED-DISRUPTIONS AGE zk-pdb 2 1 7s
ALLOWED-DISRUPTIONS
值不为0意味着中断控制器已经发现pod,计算了匹配的pod数量,而后更新了PDB的状态
你可使用如下命令获取更多PDB的状态信息
kubectl get poddisruptionbudgets zk-pdb -o yaml
apiVersion: policy/v1beta1 kind: PodDisruptionBudget metadata: creationTimestamp: 2017-08-28T02:38:26Z generation: 1 name: zk-pdb ... status: currentHealthy: 3 desiredHealthy: 3 disruptedPods: null disruptionsAllowed: 1 expectedPods: 3 observedGeneration: 1