系列目錄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