kubernetes1.7新特性:PodDisruptionBudget控制器变化

背景概念

在Kubernetes中,为了保证业务不中断或业务SLA不降级,需要将应用进行集群化部署。通过PodDisruptionBudget控制器可以设置应用POD集群处于运行状态最低个数,也可以设置应用POD集群处于运行状态的最低百分比,这样可以保证在主动销毁应用POD的时候,不会一次性销毁太多的应用POD,从而保证业务不中断或业务SLA不降级。

在Kubernetes 1.5中,kubectl drain命令已经支持了PodDisruptionBudget控制器,在进行kubectl drain操作时会根据PodDisruptionBudget控制器判断应用POD集群数量,进而保证在业务不中断或业务SLA不降级的情况下进行应用POD销毁。

1.7新特性

我们先来看看1.7版本中Pod Disruption相关的几个核心结构体:

kubernetes1.7新特性:PodDisruptionBudget控制器变化

在Kubernetes 1.7中,在PodDisruptionBudgetSpec结构体中新增加了一个参数MaxUnavailable,通过这个参数可以设置最大不可用POD数,这是一个β特性。

可以看到,从版本1.7开始可以通过两个参数来配置PodDisruptionBudget:

1、  MinAvailable参数:表示最小可用POD数,表示应用POD集群处于运行状态的最小POD数量,或者是运行状态的POD数同总POD数的最小百分比。

2、  MaxUnavailable参数:表示最大不可用PO数,表示应用POD集群处于不可用状态的最大POD数,或者是不可用状态的POD数同总POD数的最大百分比。

这里需要注意的是,MinAvailable参数和MaxUnavailable参数是互斥的,也就是说如果使用了其中一个参数,那么就不能使用另外一个参数了。

比如当进行kubectl drain或者POD主动逃离的时候,kubernetes可以通过下面几种情况来判断是否允许:

1、  minAvailable设置成了数值5:应用POD集群中最少要有5个健康可用的POD,那么就可以进行操作。

2、  minAvailable设置成了百分数30%:应用POD集群中最少要有30%的健康可用POD,那么就可以进行操作。

3、  maxUnavailable设置成了数值5:应用POD集群中最多只能有5个不可用POD,才能进行操作。

4、  maxUnavailable设置成了百分数30%:应用POD集群中最多只能有30%个不可用POD,才能进行操作。

在极端的情况下,比如将maxUnavailable设置成0,或者设置成100%,那么就表示不能进行kubectl drain操作。同理将minAvailable设置成100%,或者设置成应用POD集群最大副本数,也表示不能进行kubectl drain操作。

这里面需要注意的是,使用PodDisruptionBudget控制器并不能保证任何情况下都对业务POD集群进行约束,PodDisruptionBudget控制器只能保证POD主动逃离的情况下业务不中断或者业务SLA不降级,例如在执行kubectldrain命令时。

新特性例子

1、下面的例子使用了minAvailable参数:

[html] view plain copy
  1. apiVersion: policy/v1beta1  
  2. kind: PodDisruptionBudget  
  3. metadata:  
  4.  name: zk-pdb  
  5. spec:  
  6.  minAvailable: 2  
  7.  selector:  
  8.    matchLabels:  
  9.      app: zookeeper  

2、下面的例子使用了maxUnavailable参数:

[html] view plain copy
  1. apiVersion: policy/v1beta1  
  2. kind: PodDisruptionBudget  
  3. metadata:  
  4.  name: zk-pdb  
  5. spec:  
  6.  maxUnavailable: 1  
  7.  selector:  
  8.    matchLabels:  
  9.      app: zookeeper  

当zk-pdb对象副本数是3的时候,上面这两个例子所表达的意思是一样的。

3、可以通过下面命令创建PodDisruptionBudget对象:

[html] view plain copy
  1. kubectl create -f mypdb.yaml  

对于PodDisruptionBudget对象,无法直接进行更新操作,只能通过删除和重新创建来完成对PodDisruptionBudget对象的更新。

4、可以通过下面命令查看PodDisruptionBudget对象的状态:

[html] view plain copy
  1. $ kubectl get poddisruptionbudgets  
  2. NAME     MIN-AVAILABLE   ALLOWED-DISRUPTIONS   AGE  
  3. zk-pdb   2               1                     7s  

5、可以通过下面命令查看PodDisruptionBudget对象的详细信息

[html] view plain copy
  1. $ kubectl get poddisruptionbudgets zk-pdb-o yaml  
  2. apiVersion: policy/v1beta1  
  3. kind: PodDisruptionBudget  
  4. metadata:  
  5.  name: zk-pdb  
  6. ...  
  7. status:  
  8.  currentHealthy: 3  
  9.  desiredHealthy: 3  
  10.  disruptedPods: null  
  11.  disruptionsAllowed: 1  
  12.  expectedPods: 3  
  13.  observedGeneration: 1