kubernetes之PDB

系列目錄

上一節我們講到了由于一些人為的或者不可避免的原因,pod可能會中斷,而使用Pod Disruption Budget可以最大限度地保證在pod中斷發生時集群仍然保持能夠接受的狀態.

一句話,PDB能夠限制同時中斷的pod的數量,以保證集群的高可用性.

確定想要?;さ撓τ枚韻?/h2>

最常見的要?;さ畝韻笫鞘且韻耴ubernetes內置的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定義中,只能指定minAvailablemaxUnavailable其一.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
posted @ 2019-06-07 08:40 周國通 閱讀(...) 評論(...) 編輯 收藏