iT邦幫忙

2025 iThome 鐵人賽

DAY 27
0

前一篇我們給每個 Pod 設定了「吃多少資源」的上限與底線。
但實際世界是動態的:
流量不會永遠平穩,有時深夜幾乎沒人查詢,有時白天全公司都在打「search」。

所以今天,我們要讓 Kubernetes 根據 CPU 負載自動調整副本數(replicas)
目標是做到:「流量變大就自動長胖,變小就自動瘦身。」,也就是 HPA 自動擴縮(Horizontal Pod Autoscaler)


Step 1 — 確保 Metrics Server 就位

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


Step 2 — 建立 HPA YAML

接著我們為 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

Step 3 — 模擬高流量壓力測試

我們要驗證 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!
等流量降下來,又會自動縮回。


Step 4 — 用 kubectl top 觀察整體動態

kubectl top pods -l app=search

你會看到新 Pod 被建立,CPU 平均分散。
這就是 Kubernetes 的自癒 + 彈性伸縮能力。


HPA 背後的機制

HPA 透過 controller loop 定期抓取 metrics:

  1. 計算平均 CPU 利用率(對所有 replicas 取平均)。
  2. 對比設定的 target utilization(這裡是 60%)。
  3. 若高於目標,增加 replicas;若低於目標,減少。

K8s 使用控制理論的方式(PID control-like loop)進行漸進調整,
確保不會震盪(例如一直擴又一直縮)。


小結

概念 功能 關聯任務
Metrics Server 提供 CPU / Memory 監控 前置條件
HPA 根據資源自動調整 replicas 部署調度
hey 模擬流量 驗證觸發
Requests / Limits 提供 CPU 基準 與 Day 26 相輔相成

可以這樣理解:

Day 26 是「給 Pod 預算」
Day 27 則是「讓 K8s 自動調整薪水」


上一篇
Day 26 - 資源治理:讓每個 Pod 吃得剛剛好
系列文
用 Golang + Elasticsearch + Kubernetes 打造雲原生搜尋服務27
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言