在 Kubernetes 中,搶佔(Preemption)是一個關鍵功能,確保高優先級的工作負載即使在集群資源受限的情況下,也能獲得所需的資源。透過搶佔,排程器可以驅逐低優先級的 Pod,為高優先級的 Pod 騰出空間,從而優化資源分配並確保關鍵服務的優先執行。在這篇文章中,我們將使用 kube-scheduler-simulator
來測試和探索搶佔機制。這是一個強大的工具,可以讓你在本地開發環境中複製和測試排程行為。透過一系列測試,我們將模擬真實場景,包括擴展節點以及觀察搶佔的行為,讓你更深入了解這個重要的 Kubernetes 排程機制。
擴展 Node → 10
佈署 backend x 40
佈署 low-priority-class and low-priority-pod x 12
觀察 LPP Pending
模擬 clusterautoscaler:擴展 Node -> 13
觀察 LPP 佈署在 Proactive Node
模擬 HPA:擴展 backend 40 → 52
觀察 Backend 搶佔 LPP
我們會設定 Node 可以分配 32Gi 記憶體,Pause 以及 Backend Pod 設定需要 8Gi,所以一個 Node 可以佈署四個 Pod。
如果上一個測試的資源還沒有清空,可以在 kube-scheduler-simulator 按 Reset\
一樣先進入容器
docker exec -it simulator-cluster sh
kwokctl scale node --replicas 10 --param '.allocatable.memory="32Gi"'
kwokctl kubectl apply -f - <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: backend
spec:
replicas: 40
selector:
matchLabels:
app: backend
template:
metadata:
labels:
app: backend
spec:
containers:
- name: backend-container
image: nginx:latest # Replace with your desired image
ports:
- containerPort: 80
resources:
requests:
memory: 8Gi
EOF
kwokctl kubectl apply -f - <<EOF
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
name: low-priority
value: -1
EOF
kwokctl kubectl apply -f - <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: pause
spec:
replicas: 12
selector:
matchLabels:
app: pause
template:
metadata:
labels:
app: pause
spec:
priorityClassName: low-priority
containers:
- name: pause-container
image: registry.k8s.io/pause:latest
ports:
- containerPort: 80
resources:
requests:
memory: 8Gi
EOF
kwokctl scale node --replicas 13 --param '.allocatable.memory="32Gi"'
kwokctl kubectl scale deploy/backend --replicas=52
LPP 被驅逐,Backend 佈署到 Proactive Node
kwokctl kubectl get deploy
透過這一系列的測試,我們展示了 Kubernetes 在資源受限時如何處理 Pod 的排程與搶佔。kube-scheduler-simulator
在一個可控的環境中有效地模擬了這些行為,展示了高優先級 Pod 如何搶佔低優先級 Pod,確保關鍵工作負載得到排程。這些測試強調了搶佔如何提升資源效率並確保服務可用性,尤其是在工作負載不斷波動的動態集群中。透過理解 Kubernetes 的搶佔機制,你可以更好地優化集群資源分配,提升部署的可靠性。
為了簡化文章,所以我們只提到用一個 Pause Pod 去擴充 Proactive Node,但是如果你的服務分級有做好,像是關鍵服務以及報表服務這樣的分類,是可以讓關鍵服務搶佔報表服務的資源,這樣可以提高資源利用率,但是這跟業務有關,也需要改 Code,所以交由讀者自行思考。
排程雖然決定了 Pod 的去向,但是 Pod Lifecycle 是運行的最後一里路,關於 Pod Lifecyle,kwok 也提供 stage 來模擬,例如拉取 image 的時間,或是可以設定 delay 到 timeout 之類的細微設定。
kwok 以及 kss 都可以連到 real cluster,但是我沒有用過,所以有興趣的可以研究看看。