為叢集過度供應節點容量
此頁面指導你如何在 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
注意
某些自動擴縮器,特別是 Karpenter,在考慮節點擴縮時將首選親和性規則視為硬性規則。如果你使用 Karpenter 或其他使用相同啟發式演算法的節點自動擴縮器,你在此處設定的副本數量也決定了叢集的最小節點數量。下一步
- 瞭解有關 PriorityClasses 及其如何影響 Pod 排程的更多資訊。
- 探索節點自動擴縮,以根據工作負載需求動態調整叢集大小。
- 瞭解 Pod 搶佔,這是 Kubernetes 處理資源爭用的關鍵機制。同一頁面還介紹了與佔位 Pod 方法不太相關的“驅逐”,但它也是 Kubernetes 在資源爭用時做出反應的機制。