iT邦幫忙

2024 iThome 鐵人賽

DAY 21
0
Kubernetes

Think Again Kubernetes系列 第 21

利用 kube-scheduler-simulator 測試 Preemption

  • 分享至 

  • xImage
  •  

Day 21 利用 kube-scheduler-simulator 測試 Preemption

在 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

Context:

我們會設定 Node 可以分配 32Gi 記憶體,Pause 以及 Backend Pod 設定需要 8Gi,所以一個 Node 可以佈署四個 Pod。

如果上一個測試的資源還沒有清空,可以在 kube-scheduler-simulator 按 Reset\

一樣先進入容器

docker exec -it simulator-cluster sh

擴展 Node → 10

kwokctl scale node --replicas 10 --param '.allocatable.memory="32Gi"'

https://ithelp.ithome.com.tw/upload/images/20240930/20169135gWixB2lxkU.png

佈署 backend x 40

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

https://ithelp.ithome.com.tw/upload/images/20240930/20169135Hp1R2luDB2.png

佈署 low-priority-class and low-priority-pod x 12

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

觀察 LPP Pending

https://ithelp.ithome.com.tw/upload/images/20240930/20169135y0JSansBPd.png

擴展 Node -> 13

kwokctl scale node --replicas 13 --param '.allocatable.memory="32Gi"'

觀察 LPP 佈署在 Proactive Node

https://ithelp.ithome.com.tw/upload/images/20240930/20169135ibvTimdQtF.png

擴展 backend 40 → 52

kwokctl kubectl scale deploy/backend --replicas=52

觀察 Backend 搶佔 LPP

LPP 被驅逐,Backend 佈署到 Proactive Node

https://ithelp.ithome.com.tw/upload/images/20240930/20169135SWAp0i77yl.png

Backend 成功搶佔 LPP 的資源

kwokctl kubectl get deploy

https://ithelp.ithome.com.tw/upload/images/20240930/201691351kh2WiVJVr.png

結束

結論:

透過這一系列的測試,我們展示了 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,但是我沒有用過,所以有興趣的可以研究看看。


上一篇
Kubernetes Pattern: Proactive Node
下一篇
初探 Eviction 以及深入 API-initiated Eviction
系列文
Think Again Kubernetes31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言