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