在電商促銷(如雙 11)、突發新聞推播或熱門活動開跑時,系統流量常常會在幾分鐘內暴增數倍。
如果依靠維運人員半夜手動執行 kubectl scale deployment --replicas=10:
Horizontal Pod Autoscaler (HPA) 就是為了解決這個問題:根據即時的 CPU 使用率、記憶體或自訂指標,自動、即時地調整 Deployment 的 Pod 副本數量!
HPA 的運作依賴一個每 15 秒執行一次的控制循環(Control Loop):
[ Pods CPU/Memory 消耗 ]
│
▼
[ Metrics Server 採集數據 ]
│
▼
[ HPA Controller 比對目標閾值 ]
│
▼
[ 自動調整 Deployment replicas 數量 ]
期望副本數 = 向上取整 [ 當前副本數 × ( 當前指標數值 / 目標指標數值 ) ]
1 × (200% / 50%) = 4 個 Pod!HPA 需要透過 Metrics Server 來取得 CPU 與記憶體數據。在 Minikube 中只需一行指令啟用:
minikube addons enable metrics-server
驗證 Metrics Server 是否已就緒(可能需要等待 30 秒至 1 分鐘):
kubectl top nodes
如果能看到 Node 的 CPU 與 MEMORY 數據,代表指標採集正常!
極重要前提:要讓 HPA 能正常運作,Pod 容器內部**必須明確宣告
resources.requests.cpu**,否則 HPA 無法計算使用率百分比!
建立 hpa-demo-app.yaml(使用一個會進行密集計算的 PHP Apache 應用):
apiVersion: apps/v1
kind: Deployment
metadata:
name: php-apache
spec:
replicas: 1
selector:
matchLabels:
run: php-apache
template:
metadata:
labels:
run: php-apache
spec:
containers:
- name: php-apache
image: registry.k8s.io/hpa-example
ports:
- containerPort: 80
resources:
requests:
cpu: 200m
---
apiVersion: v1
kind: Service
metadata:
name: php-apache
spec:
ports:
- port: 80
selector:
run: php-apache
套用配置:
kubectl apply -f hpa-demo-app.yaml
我們設定 HPA 監控 php-apache:
kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=5
查看 HPA 當前狀態:
kubectl get hpa php-apache
輸出預期:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache 0%/50% 1 5 1 30s
另開一個獨立的終端機視窗,啟動一個壓力測試 Pod,向 php-apache 發送密集無窮迴圈請求:
kubectl run -i --tty load-generator --rm --image=busybox:1.28 --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://php-apache; done"
回到原本的終端機,持續監控 HPA 與 Pod 的變化:
kubectl get hpa php-apache -w
你會看到即時的變化過程:
TARGETS 的 CPU 使用率開始飆升(例如衝到 250%/50%)。REPLICAS 自動從 1 ➔ 4 ➔ 5。kubectl get pods,你會發現 Kubernetes 已經在幾秒內自動為你開好 5 個 Pod 一起分擔流量!在壓測終端機按下 Ctrl + C 終止請求。
回到監控視窗,CPU 使用率會迅速降回 0%。
今天我們實作了 Kubernetes 最強大的核心功能之一:
有了自動擴縮容之後,我們該如何統一收集成百上千個 Pod 產生的日誌?系統出問題時要去哪裡看視覺化圖表?
明天 Day 24,我們將學習全方位的可觀測性方案:「全方位可觀測性:Prometheus + Grafana 監控集群指標」!