1. 程式人生 > >kubernetes1.7 新特性:PodDisruptionBudget控制器變化_Kubernetes中文社群

kubernetes1.7 新特性:PodDisruptionBudget控制器變化_Kubernetes中文社群

背景概念

在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相關的幾個核心結構體:

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引數:

apiVersion: policy/v1beta1  

kind: PodDisruptionBudget  

metadata:  

 name: zk-pdb  

spec:  

 minAvailable: 2  

 selector:  

   matchLabels:  

     app: zookeeper

2、下面的例子使用了maxUnavailable引數:

apiVersion: policy/v1beta1  

kind: PodDisruptionBudget  

metadata:  

 name: zk-pdb  

spec:  

 maxUnavailable: 1  

 selector:  

   matchLabels:  

     app: zookeeper

當zk-pdb物件副本數是3的時候,上面這兩個例子所表達的意思是一樣的。

3、可以通過下面命令建立PodDisruptionBudget物件:

kubectl create -f mypdb.yaml

對於PodDisruptionBudget物件,無法直接進行更新操作,只能通過刪除和重新建立來完成對PodDisruptionBudget物件的更新。

4、可以通過下面命令檢視PodDisruptionBudget物件的狀態:

$ kubectl get poddisruptionbudgets  

NAME     MIN-AVAILABLE   ALLOWED-DISRUPTIONS   AGE  

zk-pdb   2               1                     7s

5、可以通過下面命令檢視PodDisruptionBudget物件的詳細資訊

$ kubectl get poddisruptionbudgets zk-pdb-o yaml  

apiVersion: policy/v1beta1  

kind: PodDisruptionBudget  

metadata:  

 name: zk-pdb  

...  

status:  

 currentHealthy: 3  

 desiredHealthy: 3  

 disruptedPods: null  

 disruptionsAllowed: 1  

 expectedPods: 3  

 observedGeneration: 1