Mark Ku's Blog
首頁 關於我
從地端到雲端:從設定到壓測:一步步實現 Google Kubernetes Engine 水平擴容及縮容
Cloud
從地端到雲端:從設定到壓測:一步步實現 Google Kubernetes Engine 水平擴容及縮容
Mark Ku
Mark Ku
November 14, 2024
1 min

什麼是水平擴展 ?

接續上一篇文章了解如何部署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
test restul 1
當 CPU 使用率到 150% 時,系統自動擴展至 3 個 Pods 分擔負載。
test restul 2
test restul 2
當 CPU 使用率達到 超過200% 時,系統自動擴展至當初設置的 5 個 Pods 分擔負載。
test restul 3
test restul 3
當 CPU 使用率下降後,Pods 會回到設定的最小 Pod 數量。
test restul 4
test restul 4

心得

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

參考資料


Tags

Mark Ku

Mark Ku

Software Developer

9年以上豐富網站開發經驗,開發過各種網站,電子商務、平台網站、直播系統、POS系統、SEO 優化、金流串接、AI 串接,Infra 出身,帶過幾次團隊,也加入過大團隊一起開發。

Expertise

前端(React)
後端(C#)
網路管理
DevOps
溝通
領導

Social Media

facebook github website

Related Posts

從地端到雲端:使用 Google Kubernetes Engine 部署你的Next.js 容器應用
從地端到雲端:使用 Google Kubernetes Engine 部署你的Next.js 容器應用
November 12, 2024
1 min

Quick Links

關於我

Social Media