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. 也歡迎您到書局選購支持,透過豐富的案例來重新檢視自己的職涯