為叢集過度供應節點容量

此頁面指導你如何在 Kubernetes 叢集中配置節點超量供應。節點超量供應是一種主動保留叢集部分計算資源的策略。此保留有助於在擴縮事件期間縮短排程新 Pod 的時間,從而增強叢集對流量或工作負載需求突然增加的響應能力。

透過維持一些未使用的容量,可以確保在新 Pod 建立時立即獲得資源,從而防止它們在叢集擴縮期間進入 Pending(等待)狀態。

準備工作

  • 你需要擁有一個 Kubernetes 叢集,並且 kubectl 命令列工具已配置為與你的叢集通訊。
  • 你應該已經對 Deployment、Pod 優先順序PriorityClass 有了基本的瞭解。
  • 你的叢集必須配置有基於需求管理節點的自動擴縮器

建立 PriorityClass

首先為佔位 Pod 定義一個 PriorityClass。首先,建立一個具有負優先順序值的 PriorityClass,你將很快將其分配給佔位 Pod。稍後,你將設定一個使用此 PriorityClass 的 Deployment。

apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: placeholder # these Pods represent placeholder capacity
value: -1000
globalDefault: false
description: "Negative priority for placeholder pods to enable overprovisioning."

然後建立 PriorityClass

kubectl apply -f https://k8s.io/examples/priorityclass/low-priority-class.yaml

接下來你將定義一個使用負優先順序 PriorityClass 並執行最小容器的 Deployment。當你將其新增到叢集時,Kubernetes 將執行這些佔位 Pod 以預留容量。每當出現容量短缺時,控制平面將選擇其中一個佔位 Pod 作為第一個搶佔候選者。

執行請求節點容量的 Pod

檢視示例清單

apiVersion: apps/v1
kind: Deployment
metadata:
  name: capacity-reservation
  # You should decide what namespace to deploy this into
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: capacity-placeholder
  template:
    metadata:
      labels:
        app.kubernetes.io/name: capacity-placeholder
      annotations:
        kubernetes.io/description: "Capacity reservation"
    spec:
      priorityClassName: placeholder
      affinity: # Try to place these overhead Pods on different nodes
                # if possible
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 100
            podAffinityTerm:
              labelSelector:
                matchLabels:
                  app.kubernetes.io/name: capacity-placeholder
              topologyKey: topology.kubernetes.io/hostname
      containers:
      - name: pause
        image: registry.k8s.io/pause:3.6
        resources:
          requests:
            cpu: "50m"
            memory: "512Mi"
          limits:
            memory: "512Mi"

為佔位 Pod 選擇一個名稱空間

你應該選擇或建立一個名稱空間,供佔位 Pod 使用。

建立佔位 Deployment

基於該清單建立 Deployment

# Change the namespace name "example"
kubectl --namespace example apply -f https://k8s.io/examples/deployments/deployment-with-capacity-reservation.yaml

調整佔位資源請求

配置佔位 Pod 的資源請求和限制,以定義你希望維持的超量供應資源量。此預留確保為新 Pod 保留特定量的 CPU 和記憶體。

要編輯 Deployment,請修改 Deployment 清單檔案中的 resources 節以設定適當的請求和限制。你可以將該檔案下載到本地,然後使用你喜歡的文字編輯器進行編輯。

你還可以使用 kubectl 編輯 Deployment

kubectl edit deployment capacity-reservation

例如,要為 5 個佔位 Pod 總共預留 0.5 CPU 和 1GiB 記憶體,請按如下方式定義單個佔位 Pod 的資源請求和限制:

  resources:
    requests:
      cpu: "100m"
      memory: "200Mi"
    limits:
      cpu: "100m"

設定所需的副本數量

計算總預留資源

例如,如果每個副本預留 0.1 CPU 和 200MiB 記憶體,總共有 5 個副本:
總預留 CPU:5 × 0.1 = 0.5(在 Pod 規約中,你將寫入數量 500m
總預留記憶體:5 × 200MiB = 1GiB(在 Pod 規約中,你將寫入 1 Gi

要擴縮 Deployment,請根據叢集大小和預期工作負載調整副本數量

kubectl scale deployment capacity-reservation --replicas=5

驗證擴縮

kubectl get deployment capacity-reservation

輸出應反映更新後的副本數量

NAME                   READY   UP-TO-DATE   AVAILABLE   AGE
capacity-reservation   5/5     5            5           2m

下一步

  • 瞭解有關 PriorityClasses 及其如何影響 Pod 排程的更多資訊。
  • 探索節點自動擴縮,以根據工作負載需求動態調整叢集大小。
  • 瞭解 Pod 搶佔,這是 Kubernetes 處理資源爭用的關鍵機制。同一頁面還介紹了與佔位 Pod 方法不太相關的“驅逐”,但它也是 Kubernetes 在資源爭用時做出反應的機制。
上次修改時間為太平洋標準時間 2024 年 11 月 18 日下午 5:22:調整節點容量超量供應任務 (d34ee98252)