在Kubernetes(k8s)中,PodDisruptionBudget(PDB)是一種資源對象,用於限制在自願中斷(voluntary disruptions)期間同時終止的Pod數量,從而保障應用的可用性。以下是詳細説明:
我們為Deployment配置了PDB(PodDisruptionBudget),目的是在自願中斷(如節點維護、升級)時,保證一定數量的Pod副本可用。但是,PDB並不影響非自願中斷(如節點故障、資源不足導致的驅逐)。因此,測試PDB功能是否生效,我們需要模擬自願中斷的場景。
PodDisruptionBudget 的作用
-
核心目標
- 確保在主動運維操作(如節點排水、集羣升級、自動縮容等)時,應用始終有指定數量的Pod保持運行。
- 防止因同時終止過多Pod導致服務不可用。
-
適用場景
- 節點維護(
kubectl drain) - 集羣自動擴縮容(如Cluster Autoscaler)
- 控制器(如Deployment)的滾動更新不適用(PDB僅針對非控制器觸發的終止)。
- 節點維護(
-
關鍵字段
spec.minAvailable- 定義:指定必須保持可用的Pod的最小數量(或百分比)。
- 示例:
spec: minAvailable: 2 # 絕對數值 # 或 minAvailable: "50%" # 百分比形式 - 行為:當用户或系統嘗試終止Pod時,Kubernetes會確保至少
minAvailable個Pod處於運行狀態。如果違反此約束,操作會被拒絕。
-
其他相關字段
maxUnavailable(與minAvailable二選一):允許不可用的Pod的最大數量(或百分比)。spec: maxUnavailable: 1 # 最多允許1個Pod不可用
使用注意事項
- 選擇器(Selector)
PDB通過selector匹配Pod,需確保與目標Pod的標籤一致:selector: matchLabels: app: my-app
注意:deployment中的選擇器也是這個,它們是一個的,上面的my-app並不是deployment的name
spec:
selector:
matchLabels:
app: my-app
-
與控制器協作
- PDB不控制Pod的創建/刪除,需配合Deployment、StatefulSet等使用。
- 例如:設置
minAvailable: 1確保Deployment的Pod至少有一個始終可用。
-
資源衝突
- 若
minAvailable值過大(如超過副本數),可能導致節點無法排水(需手動調整)。
- 若
-
非自願中斷
- PDB僅對自願中斷生效(如節點排水)。硬件故障、OOM Kill等非自願中斷不受PDB約束。
示例配置
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: my-app-pdb
spec:
minAvailable: "50%" # 至少50%的Pod保持可用
selector:
matchLabels:
app: hello
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-deployment
spec:
replicas: 3
selector:
matchLabels:
deployment: hello # ← 查找標籤為deployment=hello的Pod
template:
metadata:
labels:
deployment: hello # ← 創建Pod時給它打上deployment=hello標籤
spec:
containers:
- name: nginx
image: nginx:1.14.2
總結
minAvailable:是PDB的核心字段,直接定義應用的高可用底線。- 適用性:適合有狀態服務或對可用性敏感的無狀態服務。
- 平衡:需根據業務需求在“可維護性”和“可用性”之間權衡(如設置過高可能導致維護困難)。