為叢集超額佈建節點容量
本頁面將引導您完成在 Kubernetes 叢集中設定節點超額佈建。節點超額佈建是一種主動保留叢集部分計算資源的策略。此保留有助於減少在擴展事件期間排程新 Pod 所需的時間,從而增強叢集對流量或工作負載需求突然激增的反應能力。
透過維護一些未使用的容量,您可以確保在建立新 Pod 時立即提供資源,防止它們在叢集擴展時進入擱置狀態。
開始之前
- 您需要有一個 Kubernetes 叢集,並且必須設定 kubectl 命令列工具以與您的叢集通訊。
- 您應該已經基本了解部署、Pod 優先順序和PriorityClasses。
- 您的叢集必須設定一個自動擴展器,以根據需求管理節點。
建立 PriorityClass
首先為預留位置 Pod 定義 PriorityClass。首先,建立具有負優先順序值的 PriorityClass,您稍後將其指派給預留位置 Pod。稍後,您將設定使用此 PriorityClass 的部署
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 並執行最小容器。當您將其新增至叢集時,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:
- labelSelector:
matchLabels:
app: placeholder
topologyKey: "kubernetes.io/hostname"
containers:
- name: pause
image: registry.k8s.io/pause:3.6
resources:
requests:
cpu: "50m"
memory: "512Mi"
limits:
memory: "512Mi"
為預留位置 Pod 選擇命名空間
您應該選取或建立一個命名空間,以放置預留位置 Pod。
建立預留位置部署
根據該 Manifest 建立一個 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 Manifest 檔案中的 resources
區段,以設定適當的請求和限制。您可以將該檔案下載到本機,然後使用您偏好的文字編輯器進行編輯。
您也可以使用 kubectl 編輯 Deployment
kubectl edit deployment capacity-reservation
例如,若要為 5 個預留位置 Pod 總共預留 0.5 個 CPU 和 1GiB 記憶體,請為單個預留位置 Pod 定義資源請求和限制如下
resources:
requests:
cpu: "100m"
memory: "200Mi"
limits:
cpu: "100m"
設定所需的副本計數
計算總預留資源
例如,若有 5 個副本,每個副本預留 0.1 個 CPU 和 200MiB 記憶體
總預留 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 在資源爭用時做出反應的一種機制。