上一節我們講到了由於一些人為的或者不可避免的原因,pod可能會中斷,而使用Pod Disruption Budget
可以最大限度地保證在pod中斷髮生時叢集仍然保持能夠接受的狀態.
一句話,PDB能夠限制同時中斷的pod的數量,以保證叢集的高可用性.
使用PodDisruptionBudget來保護叢集
1) 確定你想要使用PodDisruptionBudget (PDB)
來保護的叢集
2) 考慮叢集如何影響中斷
3) 使用yaml檔案建立PDB定義
4) 使用yaml檔案建立PDB物件
確定想要保護的應用物件
最常見的要保護的物件是是以下kubernetes內建的controller建立的應用物件之一:
- Deployment
- ReplicationController
- ReplicaSet
- StatefulSet
考慮叢集如何響應中斷
決定在短時間內有多少個例項可能會被宕掉(由於自願中斷,前面一節我們講到過何為自願中斷,非自願中斷不被PDB控制)
- 無狀態的前端
關注點:服務能力不能減少超過10%
解決方案: 使用一個包含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定義中,只能指定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
建立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