kubernetes之PDB

系列目录html

上一节咱们讲到了因为一些人为的或者不可避免的缘由,pod可能会中断,而使用Pod Disruption Budget能够最大限度地保证在pod中断发生时集群仍然保持可以接受的状态.前端

一句话,PDB可以限制同时中断的pod的数量,以保证集群的高可用性.api

使用PodDisruptionBudget来保护集群

1) 肯定你想要使用PodDisruptionBudget (PDB)来保护的集群bash

2) 考虑集群如何影响中断app

3) 使用yaml文件建立PDB定义code

4) 使用yaml文件建立PDB对象htm

肯定想要保护的应用对象

最多见的要保护的对象是是如下kubernetes内置的controller建立的应用对象之一:对象

  • Deployment
  • ReplicationController
  • ReplicaSet
  • StatefulSet

考虑集群如何响应中断

决定在短期内有多少个实例可能会被宕掉(因为自愿中断,前面一节咱们讲到过何为自愿中断,非自愿中断不被PDB控制)blog

  • 无状态的前端

关注点:服务能力不能减小超过10%get

解决方案: 使用一个包含minAvailable 90%值的PDB

  • 单实例有状态应用

关注点:不要在不知情状况下中断

可能的解决方案1:不使用PDB,容易偶尔的宕机

可能的解决方案2:使用PDB,设置maxUnavailable=0.当集群管理员想要终止pod的时候,他须要联系你,而后删除掉PDB以准备应对中断,而后从新建立.(若是maxUnavailable=0则不能进行自愿中断操做)

  • 多实例有状态应用,例如zookeeper,etcd,consul等

关注点:运行的实例数不能低于法定数量

可能的解决方案1:把maxUnavailable to 1(根据不一样集群要求不一样,能够设置为不一样的值)
可能的解决方案2:把minAvailable设置为法定数量.

指定一个PodDisruptionBudget

一个PDB有三个字段:

1) 一个label选择器.spec.selector,用来指定要选择的pod集合,此为必选项

2) .spec.minAvailable,在pod被驱离的状况下,必须保证的最小可用的pod数量.minAvailable能够是一个绝对数值或者一个百分数

3) .spec.maxUnavailable(kubernetes 1.7之后版本),在发生驱离的状况下,最大的不可用副本的数量,值能够是绝对数值或者一个百分比.

在一个PDB定义中,只能指定minAvailablemaxUnavailable其一.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

建立PDB对象

你可使用kubectl apply -f xxx.yaml来建立一个PDB对象

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
相关文章
相关标签/搜索