K8s · 工作負載 · 第 14 課 · · 7min read

kubectl scale 擴縮容實戰:流量大了怎麼辦?

流量翻倍要擴容、半夜沒人要縮容。Deployment 一個 scale 指令搞定,不用重啟、不用停機。這篇實測 3 → 5 → 2 的全流程。

#Kubernetes #scale #擴縮容 #Deployment
章節目錄 · 12

平常 3 個 Pod 夠用,週年慶流量 10 倍怎麼辦?

上一篇講了 Deployment 怎麼維持副本數。這篇要回答更實用的問題:流量暴增的時候怎麼擴 Pod?流量退了又怎麼縮回來?

電商網站平常每秒一千個請求,三個 Pod 處理綽綽有餘。週年慶預估十倍流量 — 一秒一萬個請求。三個 Pod 撐爆,回應時間從 100ms 飆到 5 秒,使用者直接關掉,營收腰斬。

解法:加 Pod。三個不夠就加到十個,回應時間就回來了。

一行指令搞定

kubectl scale deployment my-nginx --replicas=10

就這樣。Deployment 副本數從 3 變 10,K8s 自動建 7 個新 Pod,Scheduler 還會把它們分散到不同的 Node,讓每台機器負擔均衡。

背後機制:4 個架構元件接力

我們把第四堂的架構知識串起來看:

你打 kubectl scale
   ↓
API Server 把 replicas: 3 改成 10、寫進 etcd
   ↓
Controller Manager 監控到差異(期望 10、實際 3,差 7 個)
   ↓
Scheduler 看各 Node 資源、決定哪 7 個 Pod 放哪台
   ↓
各 Node 上的 kubelet 拉 Image、啟動容器

跟「建一個 Pod」的流程一模一樣,只是這次一口氣建 7 個。架構沒變、量變了。

縮容也是一行指令

週年慶結束,流量退回正常:

kubectl scale deployment my-nginx --replicas=3

K8s 會砍掉多的 7 個 Pod。砍哪 7 個?K8s 有自己的策略(考慮 Pod 啟動時間、Node 負載等等),你不用管細節。

如果你的叢集跑在雲端,多餘的 Pod 佔著運算資源是要花錢的。所以縮容跟擴容一樣重要。

水平擴縮容 vs 垂直擴縮容

方式做法K8s 對應
水平擴縮容(Horizontal)加減副本數量,每副本規格不變kubectl scale / HPA
垂直擴縮容(Vertical)加大單個 Pod 的 CPU / 記憶體requests / limits
比喻:餐廳生意太好,水平擴容是多請幾個廚師,垂直擴容是給廚師更大的鍋。一台機器的 CPU 有上限、不能無限加,所以生產環境最常用水平擴縮容

對照 Docker:跨機器分散是 K8s 獨有

# Docker Compose 也能擴
docker compose up --scale web=10
# 但 10 個容器全擠在同一台機器上 ❌

K8s 的 scale 是跨 Node 的,Pod 自動分散到不同機器,每台都出一份力。這是本質的差異。

實作:在 k3s 多節點看分散

# 建 Deployment
kubectl create deployment my-nginx --image=nginx --replicas=3

# 看 Pod 跑在哪個 Node
kubectl get pods -o wide
# NAME ... NODE
# my-nginx-xxx-aaa ... k3s-master
# my-nginx-xxx-bbb ... k3s-worker1
# my-nginx-xxx-ccc ... k3s-master

Pod 自動分散在兩個 Node 上。

擴到 10:

kubectl scale deployment my-nginx --replicas=10
kubectl get pods -o wide
# 10 個 Pod 自動分散到兩個 Node

縮回 3:

kubectl scale deployment my-nginx --replicas=3
kubectl get pods
# 7 個 Pod 變成 Terminating,最後剩 3 個
⚠️ scale 的對象是 Deployment,不是 Pod。Pod 沒有副本概念。

觀察 Pod 即時變化

開兩個終端:

# 終端 1:持續觀察
kubectl get pods --watch

# 終端 2:快速連打(每次間隔幾秒)
kubectl scale deployment my-nginx --replicas=5
kubectl scale deployment my-nginx --replicas=8
kubectl scale deployment my-nginx --replicas=10
kubectl scale deployment my-nginx --replicas=3

終端 1 你會看到 Pod 快速增加、快速減少。這就是第七堂 HPA 自動擴縮 幫你做的事:流量大自動加、流量小自動砍,連 scale 指令都不用打。

scale 0 = 暫停服務

kubectl scale deployment my-nginx --replicas=0
kubectl get deploy
# READY: 0/0   ← Pod 全砍但 Deployment 還在

kubectl scale deployment my-nginx --replicas=3
kubectl get pods # Pod 又回來了

維護某個服務時很有用:暫停不用刪 Deployment,留著之後再起來。

看擴縮容歷史

kubectl describe deployment my-nginx | grep -A 20 Events
# Events 區塊會記錄每次 scale:
# Scaled up replica set my-nginx-xxx to 5
# Scaled down replica set my-nginx-xxx to 1

排查問題時非常有用。

重點整理

  • 擴縮容一行指令:kubectl scale deployment xxx --replicas=N
  • scale 的對象是 Deployment 不是 Pod
  • 背後流程跟建單一 Pod 一模一樣,只是量變
  • K8s 的 scale 是跨 Node 的(Docker Compose 做不到)
  • 水平擴縮容(加副本)比垂直擴縮容(加 CPU / 記憶體)常用
  • scale 0 暫停服務不刪 Deployment
  • describe 的 Events 看擴縮容歷史

下一步

副本數會調了,但版本要更新時怎麼辦?v1 換 v2 時不能停服務。下一篇講滾動更新與回滾:零停機部署,逐步替換的精髓。