Mark Ku's Blog

什麼是水平擴展 ?

接續上一篇文章+了解如何部署Next js 應用程式到Google Kubernetes Engine,我們這篇來談談 Google Kubernetes Engine 水平擴容及縮容。  

如同在組織中,即使一個人能力再強,最多也只能持續高效工作約 16 小時,如果工作負載過重,這個人可能會無法承受,此時,則需要聘請更多的人來分擔工作,這就是一種橫向擴展的概念。

套用在技術領域中,無論一台伺服器的性能多麼強大,它的處理能力也有極限,當負載超過伺服器的能力時,單靠升級硬體(垂直擴展)可能不足以解決問題,此時就適合導入水平擴容的機制(Scaling Out)。

什麼是 Kubernetes Pods?

在 Kubernetes 中,Pods 是部署的最小單位,負責承載容器化應用程序及其運行環境。

哪些網頁應用適合進行水平擴展?

並非所有服務都適合水平擴展,適合的服務通常為無狀態服務,例如 Web API 或微服務架構,這些應用可以輕鬆分散負載。

如果服務涉及本地狀態(如資料庫或未經設計的 Session 網頁應用),可能會因一致性問題導致無法進行水平擴展,在這種情況下,可以考慮使用垂直擴展 (Vertical Pod Autoscaler, VPA),提升單一 Pod 的資源能力以承擔更高負載。

GKE 的優勢

Google Kubernetes Engine (GKE) 相較於自建 Kubernetes,提供了更方便的管理功能。例如,GKE 不需要額外安裝 metrics-server,即可直接監控容器的 CPU 和記憶體使用情況,大幅降低了初期設定的難度。

在設定水平擴容及縮容時,建立 Cluster 遇到的問題

上篇文章+提到,GKE 提供兩種叢集模式:

  • Standard Cluster:靈活度高,適合需要細節控制的使用者,但需自行管理資源與設定。
  • Autopilot Cluster:簡化管理,自動調整資源,適合專注於應用部署的使用者。

但實測發現,Standard Cluster 預設未啟用 Metrics,因此在執行 kubectl get hpa 時,無法取得 CPU 和記憶體的使用率,起初測試時,無法使用自動擴展功能。

Standard Cluster Settings
Standard Cluster Settings
kubectl get hpa in cloud shell
kubectl get hpa in cloud shell

首先,我們須需了解 Kubernetes 水平擴展所需要用到的指令

查詢容器應用的資源使用情況

以下指令可檢視節點或 Pod 的 CPU 和記憶體使用率:

kubectl top nodes
kubectl top pods

查詢水平擴展 (HPA) 狀態

kubectl get hpa

手動擴展容器

若需手動擴展容器,可使用以下指令:

kubectl scale deployment nextjs-blog-deployment --replicas=5
kubectl get pods

接著,我們必須設定 Deployment 自動水平擴展(容)功能

水平擴展有三種設定方式:透過 YAML 文件、指令操作或網頁介面(UI)。

1.使用 YAML 文件定義自動水平擴展

建立 YAML 檔並執行以下指令:

kubectl apply -f nextjs-blog-hpa.yaml

範例 YAML 檔案內容:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: nextjs-blog-hpa
  namespace: default
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nextjs-blog
  minReplicas: 1
  maxReplicas: 5
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50

說明:

  • scaleTargetRef:指定 HPA 監控的 Deployment。
  • minReplicas:最少保留 1 個 Pod。
  • maxReplicas:最大擴展至 5 個 Pod。
  • metrics:當 CPU 使用率超過 50% 時觸發擴展。

2. 使用指令設定自動水平擴展

kubectl autoscale deployment nextjs-blog-deployment --cpu-percent=50 --min=1 --max=5

3. 使用 GKE 網頁介面設定自動水平擴展

Set up HorizontalPodAutoscaler
Set up HorizontalPodAutoscaler

接著,我們來測試先前設定好水平擴展的設定

這次使用 Grafana 的壓測工具 K6

撰寫壓測腳本

以下是範例腳本:

import http from 'k6/http';
import { check, sleep } from 'k6';

export const options = {
  stages: [
    { duration: '30s', target: 3000 },  // 負載測試從 0 個虛擬使用者增加到 20 個,並持續30 秒 
    { duration: '1m30s', target: 3000 }, 3000 // 維持 3000 個虛擬使用者持續 1 分 30 秒
    { duration: '20s', target: 0 },
  ]
};
// options 第一階段模擬快速增加負載,第二階段保持穩定負載,第三階段緩慢減少負載。
export default function () {
  const res = http.get('http://your-domain/');
  check(res, { 'status was 200': (r) => r.status == 200 });
  sleep(1);

K6 Docker 版本,不需要額外安裝,直接執行就好 (--rm 會在壓測完成後刪除容器*)

// Windows 腳本
cat script.js | docker run --rm -i grafana/k6 run -

並同時在 Google Cloud Shell 執行下面指令, Watch指令每兩秒印出即時的cpu 消耗,就能夠驗證自動水平擴展的功能是不是有成功設定。

 watch -n 2 'date && kubectl get hpa'

最後,測試結果

當容器 CPU 使用率瞬間達到 102% 時,可能因使用率飆升的過快,容器尚未完全啟動。 test restul 1 當 CPU 使用率到 150% 時,系統自動擴展至 3 個 Pods 分擔負載。 test restul 2 當 CPU 使用率達到 超過200% 時,系統自動擴展至當初設置的 5 個 Pods 分擔負載。 test restul 3 當 CPU 使用率下降後,Pods 會回到設定的最小 Pod 數量。 test restul 4

心得

使用 GKE 真是太酷了!它的彈性和便利性讓我完全不需要在地端配置繁瑣的基礎設施,回想從過去的基礎設施管理(Infra)一路走到現在成為軟體工程師,這些累積的經驗竟然讓我在學習雲技術和 Kubernetes 時變得更加輕鬆。

參考資料

作者

Mark Ku

擁有 10+ 年經驗的資深軟體工程師,現為 AI 應用 Builder,專注於大型平台架構與簡化複雜系統設計,從電商系統到訂閱與收費平台,結合 AI Agent、AI 整合與自動化開發,打造高效率且可持續演進的產品技術基礎。閱讀更多

覺得這篇有幫助?

作者做的免費工具、每日 Podcast 與電子報,都在這裡。

Mark Ku · 本文採用 CC BY 4.0 授權,轉載請註明作者並附上原文連結。

留言

訂閱電子報

訂閱後即時收到新文章通知,不錯過任何技術分享。

提交即表示同意接收電子報,隨時可

熱門文章

View all
Mark Ku
··597

Oracle Cloud 永久免費方案 Linux 主機及固定 IP :0 元打造雲端解決方案

Oracle Cloud 永久免費方案 Linux 主機及固定 IP :0 元打造雲端解決方案
Mark Ku
··469

告別 Postman 收費陷阱!開源 Git 原生 API 測試神器 Bruno 實戰指南

告別 Postman 收費陷阱!開源 Git 原生 API 測試神器 Bruno 實戰指南
Mark Ku
··327

一款免費開源類似於 Notion 類知識庫系統 — Outline Wiki 佈署與備份全攻略

一款免費開源類似於 Notion 類知識庫系統 — Outline Wiki 佈署與備份全攻略
Mark Ku
··239

打造高效 API 管理平台:從 0 開始部署 Kong Gateway - Part 1

打造高效 API 管理平台:從 0 開始部署 Kong Gateway - Part 1
Mark Ku
··233

訓練自己的 AI 語音:硬體門檻、開源模型比較與 LoRA 微調

訓練自己的 AI 語音:硬體門檻、開源模型比較與 LoRA 微調
Mark Ku
··220

在 Ubuntu 上設置 Samba 來共享資料夾,讓 Windows 11 用戶可以存取

在 Ubuntu 上設置 Samba 來共享資料夾,讓 Windows 11 用戶可以存取