模擬 K8s Auto Scaling(可在 Local 端測試)

林鼎淵
Dean Lin
Published in
6 min readJan 21, 2022

--

K8s 最吸引人的其中一個功能應該就是用 Auto Scaling 來應付高併發(High concurrency)情境,今天就用一個水平自動擴展(HPA)的範例來讓大家了解他的實際運作模式。

文章大綱一、撰寫 Auto Scaling 的 yaml 檔
➤ HorizontalPodAutoscaler(水平自動擴展)參數說明
➤ 建立「nodetest-k8s-auto.yaml」來做 Auto Scaling 測試
二、調整 Service、Deployment 參數並加入 yaml 檔
➤ 調整 Service 參數
➤ 調整 Deployment 參數
➤ 將 Service、Deployment 設定合併到 nodetest-k8s-auto.yaml 中
三、部署&測試 pod 是否會依據流量的增加自動擴展
➤ 開啟流量監控、部署 K8s
➤ 取得 Deployment 的外部 ip,然後瘋狂存取來測試 Auto Scaling
➤ 瘋狂存取後後,確認 maxReplicas 設定是否生效
➤ 關閉存取後,確認 minReplicas 設定是否生效
➤ 測試完成後將建立的 K8s 服務刪除、關閉 minikube

如果讀者尚未在本機安裝 K8s 環境,可以先閱讀:「帶你將 Node.js Web App 給 Docker 化,並用 Kubernetes 部署的超簡單範例」來設定基礎環境喔!

一、撰寫 Auto Scaling 的 yaml 檔

你也可以直接去筆者的 github,直接將專案 Clone 到本機來做測試。

➤ HorizontalPodAutoscaler(水平自動擴展)參數說明

  • scaleTargetRef:填寫你想要針對哪個 ReplicaSet 或 Deployment 或 Replication Controller 來做 Scaling。
  • minReplicas、maxReplicas:Pod 擴展範圍。
  • targetCPUUtilizationPercentage:Auto Scaling 是根據 CPU 用量來做擴展,判定的依據為 Deployment resources 的 requests 設定值(如果沒填寫基本上就不會動 XD)。

➤ 建立「nodetest-k8s-auto.yaml」來做 Auto Scaling 測試

二、調整 Service、Deployment 參數並加入 yaml 檔

這裡的 Service、Deployment 都是從先前這篇文章改良過來的喔。

Docker image 可以 pull 筆者的範例,或是使用自己的都可以。

➤ 調整 Service 參數

  • nodePort:這裡建議指定一個 port,如果沒有設定的話,最後對外 ip 的 port 為隨機產生。

➤ 調整 Deployment 參數

  • resources 的 requests:如果 cpu 設定為 100m,而 targetCPUUtilizationPercentage 設定為 10;當 Pod 的 CPU 使用率為 1m(100m x 10%) 的時候就要進行 Auto Scaling。
  • replicas:特別設定為 1 方便觀察,原則上他的值要跟 minReplicas 相同。

➤ 將 Service、Deployment 設定合併到 nodetest-k8s-auto.yaml 中

三、部署&測試 pod 是否會依據流量的增加自動擴展

➤ 開啟流量監控、部署 K8s

# 將 minikube 監控流量的 addons 打開
minikube addons enable metrics-server

# 部署剛剛建立的 nodetest-k8s-auto.yaml
kubectl apply -f nodetest-k8s-auto.yaml

# 查看 Auto Scaler 狀態
kubectl get hpa

一開始 TARGETS 會顯示 <unknown>,這是因為還在判斷流量,過一陣子就會顯示百分比了

➤ 取得 Deployment 的外部 ip,然後瘋狂存取來測試 Auto Scaling

# 取得 Deployment 的外部 ip(此時會看到 port 與設定的 nodePort 相同)
minikube service node-app-service --url

# 開始瘋狂存取剛剛輸出的 url 來確認 pod 是否會自動成長
while true
do curl <Deployment 的外部 ip>
done

➤ 瘋狂存取後後,確認 maxReplicas 設定是否生效

看 REPLICAS 這個欄位是否會依據流量的增加自動擴展到設定的 maxReplicas。

➤ 關閉存取後,確認 minReplicas 設定是否生效

將上面的存取 Deployment 外部 ip 的 while 迴圈關掉後,pod 會自動減少到設定的 minReplicas。

➤ 測試完成後將建立的 K8s 服務刪除、關閉 minikube

kubectl delete -f nodetest-k8s-auto.yaml# 如果沒關閉的話,你會發現電腦燙燙的,CPU 居高不下
minikube delete

以上就是模擬 K8s Auto Scaling 的測試方法啦!希望讀者可以透過文章了解這個技術的應用~

▶︎ 如果這篇文章有幫助到你1. 可以點擊下方「Follow」來追蹤我~
2. 可以對文章拍手讓我知道 👏🏻
你們的追蹤與鼓勵是我繼續寫作的動力 🙏🏼▶︎ 如果你對工程師的職涯感到迷茫1. 也許我在iT邦幫忙發表的系列文可以給你不一樣的觀點 💡
2. 也歡迎您到書局選購支持,透過豐富的案例來重新檢視自己的職涯

--

--

林鼎淵
Dean Lin

職涯中培育過多名工程師,🧰 目前在外商公司擔任 Software Specialist |✍️ 我專注寫 (1)最新技術 (2)團隊合作 (3)工程師職涯的文章,出版過 5 本專業書籍|👏🏻 如果對這些主題感興趣,歡迎點擊「Follow」來關注我~