博客 / 詳情

返回

k8s~Kubernetes PDB

在Kubernetes(k8s)中,PodDisruptionBudget(PDB)是一種資源對象,用於限制在自願中斷(voluntary disruptions)期間同時終止的Pod數量,從而保障應用的可用性。以下是詳細説明:


我們為Deployment配置了PDB(PodDisruptionBudget),目的是在自願中斷(如節點維護、升級)時,保證一定數量的Pod副本可用。但是,PDB並不影響非自願中斷(如節點故障、資源不足導致的驅逐)。因此,測試PDB功能是否生效,我們需要模擬自願中斷的場景。

PodDisruptionBudget 的作用

  1. 核心目標

    • 確保在主動運維操作(如節點排水、集羣升級、自動縮容等)時,應用始終有指定數量的Pod保持運行。
    • 防止因同時終止過多Pod導致服務不可用。
  2. 適用場景

    • 節點維護(kubectl drain
    • 集羣自動擴縮容(如Cluster Autoscaler)
    • 控制器(如Deployment)的滾動更新不適用(PDB僅針對非控制器觸發的終止)。
  3. 關鍵字段 spec.minAvailable

    • 定義:指定必須保持可用的Pod的最小數量(或百分比)。
    • 示例
      spec:
        minAvailable: 2  # 絕對數值
        # 或
        minAvailable: "50%"  # 百分比形式
      
    • 行為:當用户或系統嘗試終止Pod時,Kubernetes會確保至少minAvailable個Pod處於運行狀態。如果違反此約束,操作會被拒絕。
  4. 其他相關字段

    • maxUnavailable(與minAvailable二選一):允許不可用的Pod的最大數量(或百分比)。
      spec:
        maxUnavailable: 1  # 最多允許1個Pod不可用
      

使用注意事項

  1. 選擇器(Selector)
    PDB通過selector匹配Pod,需確保與目標Pod的標籤一致:
    selector:
      matchLabels:
        app: my-app
    

注意:deployment中的選擇器也是這個,它們是一個的,上面的my-app並不是deployment的name

spec:
   selector:
     matchLabels:
       app: my-app
  1. 與控制器協作

    • PDB不控制Pod的創建/刪除,需配合Deployment、StatefulSet等使用。
    • 例如:設置minAvailable: 1確保Deployment的Pod至少有一個始終可用。
  2. 資源衝突

    • minAvailable值過大(如超過副本數),可能導致節點無法排水(需手動調整)。
  3. 非自願中斷

    • 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的核心字段,直接定義應用的高可用底線。
  • 適用性:適合有狀態服務或對可用性敏感的無狀態服務。
  • 平衡:需根據業務需求在“可維護性”和“可用性”之間權衡(如設置過高可能導致維護困難)。
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.