前一篇我們給每個 Pod 設定了「吃多少資源」的上限與底線。
但實際世界是動態的:
流量不會永遠平穩,有時深夜幾乎沒人查詢,有時白天全公司都在打「search」。
所以今天,我們要讓 Kubernetes 根據 CPU 負載自動調整副本數(replicas)。
目標是做到:「流量變大就自動長胖,變小就自動瘦身。」,也就是 HPA 自動擴縮(Horizontal Pod Autoscaler)
HPA 會依據 Metrics API 取得 CPU 使用率,所以第一步要檢查 metrics-server:
kubectl get deployment metrics-server -n kube-system
如果沒有,安裝官方版本:
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
確認運作:
kubectl top nodes
kubectl top pods
如果這兩個指令能正常輸出,就表示 metrics-server OK
接著我們為 cloud-native-search
建立自動擴縮設定。
# k8s/hpa.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: search-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: search-deploy
minReplicas: 2
maxReplicas: 6
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 60 # 當平均 CPU 超過 60% 就擴張
部署它:
kubectl apply -f k8s/hpa.yaml
查看狀態:
kubectl get hpa
預期輸出:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
search-hpa Deployment/search-deploy 10%/60% 2 6 2 10s
我們要驗證 HPA 是否真的會動。
用 hey
在叢集裡開一個暫時的壓測 Pod:
kubectl run hey --rm -it --image=rakyll/hey --restart=Never -- \
-z 60s -c 10 "http://search-svc/search?q=python"
同時開另一個視窗監控:
kubectl get hpa -w
幾十秒後你會看到:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
search-hpa Deployment/search-deploy 85%/60% 2 6 4 1m
HPA 檢測到平均 CPU 超過 60%,自動把副本數從 2 ➜ 4!
等流量降下來,又會自動縮回。
kubectl top
觀察整體動態kubectl top pods -l app=search
你會看到新 Pod 被建立,CPU 平均分散。
這就是 Kubernetes 的自癒 + 彈性伸縮能力。
HPA 透過 controller loop 定期抓取 metrics:
K8s 使用控制理論的方式(PID control-like loop)進行漸進調整,
確保不會震盪(例如一直擴又一直縮)。
概念 | 功能 | 關聯任務 |
---|---|---|
Metrics Server | 提供 CPU / Memory 監控 | 前置條件 |
HPA | 根據資源自動調整 replicas | 部署調度 |
hey | 模擬流量 | 驗證觸發 |
Requests / Limits | 提供 CPU 基準 | 與 Day 26 相輔相成 |
可以這樣理解:
Day 26 是「給 Pod 預算」
Day 27 則是「讓 K8s 自動調整薪水」