理解 Google Kubernetes Engine (GKE)
Google Kubernetes Engine (GKE) 是 Google Cloud 提供的託管式 Kubernetes 服務。Kubernetes 本身是由 Google 開源的容器編排工具,而 GKE 則讓你在雲端執行 Kubernetes 變得極其簡單。對於 Associate Cloud Engineer (ACE) 來說,GKE 是公認最難且比重最高的章節之一,因為它涉及了容器化、叢集管理、自動縮放以及複雜的網路配置。
GKE 負責管理控制平面 (Control Plane),你只需要關注工作節點 (Nodes) 和你的應用程式 (Pods)。
白話文解釋
1. 貨櫃碼頭自動化 (快遞類比)
- 容器 (Container):標準化的貨櫃。裡面裝著你的程式碼和所有依賴環境。
- Pod: 搬運貨櫃的小推車。它是 Kubernetes 中最小的調度單位,一個 Pod 通常裝一個容器。
- 節點 (Node):碼頭上的大卡車(VM)。一個卡車可以裝多個小推車(Pods)。
- GKE (調度員):自動化調度系統。它負責看哪台卡車還有空間,就把貨櫃分派過去。如果貨太多,它會自動叫更多卡車過來(自動縮放 Autoscaling)。
2. 連鎖餐廳管理 (廚房類比)
- Autopilot 模式:就像加盟連鎖店。你只管出菜單(程式碼),Google 負責管理廚房設備、排班和擴建。你按菜量付費。
- Standard 模式:就像自己開餐廳。你可以挑選烤箱型號(機器類型)、決定廚師人數。你有更大的控制權,但也更累。
3. 公共汽車系統 (交通號誌類比)
- 叢集 (Cluster): 整個公車系統。
- 服務 (Service): 公車站牌。乘客(外部流量)不需要知道哪台公車(Pod)在跑,只需要去站牌等車,系統會自動把乘客送往可用的公車。
Autopilot 與 Standard 叢集模式
這是 GKE 最基礎也最重要的選擇。
Autopilot (全託管)
Autopilot 是 Google 的推薦模式。在 Autopilot 中,Google 管理整個叢集的基礎架構,包括節點和節點池。你不需要配置機器類型或縮放規則,Google 會根據你的 Pod 資源請求 (Resource Requests) 自動優化。 Source ↗
- 計費:按 Pod 使用的資源(CPU/RAM/儲存空間)計費。
- 運維:幾乎零運維,Google 負責節點升級與修復。
Standard (自管節點)
- 計費:按底層 VM 執行個體(節點)計費,不論 Pod 是否填滿。
- 控制權:你可以自定義節點的機器類型、GPU、甚至透過 SSH 進入節點。適合需要深度調優的場景。
部署與縮放 GKE 叢集
建立叢集
使用 gcloud 可以快速建立叢集。
# 建立 Autopilot 叢集
gcloud container clusters create-auto my-cluster --region us-central1
# 建立 Standard 叢集
gcloud container clusters create my-standard-cluster --zone us-central1-a
縮放機制 (Scaling Mechanisms)
- 水平 Pod 自動擴展器 (Horizontal Pod Autoscaler, HPA): 根據 CPU 使用率自動增加 Pod 數量。
- 垂直 Pod 自動擴展器 (Vertical Pod Autoscaler, VPA): 根據負載自動調整 Pod 的 CPU/RAM 請求大小。
- 叢集自動擴展器 (Cluster Autoscaler, CA): 當 Pod 太多、節點塞不下時,自動增加底層 VM 數量。
在 Standard 模式下,你需要手動啟用叢集自動擴展器 (Cluster Autoscaler);而在 Autopilot 下,這一切都是自動的。 Source ↗
配置節點池 (Node Pools)
節點池 (Node Pools) 是叢集內具有相同配置的一組節點。
節點池 (Node Pool) 允許你在同一個叢集中擁有不同類型的機器。例如,一個池用 C2 機器處理密集計算,另一個池用 E2 處理一般 Web 流量。 Source ↗
- 污點與容忍度 (Taints & Tolerations): 確保特定 Pod 只跑在特定的節點池上(例如需要 GPU 的 Pod 跑在 GPU 池)。
GKE 網路與服務類型
這是讓外部使用者存取應用程式的關鍵。
服務類型 (Service Types)
- ClusterIP (預設): 僅供叢集內部存取。
- NodePort: 在每個節點的 IP 上開啟一個固定連接埠。
- LoadBalancer: ::important 這會自動在 Google Cloud 建立一個外部負載平衡器 (External Cloud Load Balancer),並分配一個外部 IP。這是對外提供服務的最常用方式。 Source ↗ ::
Ingress
Ingress 是管理外部存取叢集內服務的 API 物件,通常提供 HTTP/HTTPS 路由功能。它相當於一個更高級、支援網址路徑分發的負載平衡器。
透過 kubectl 管理 GKE 操作
一旦叢集建立好,你就需要用 kubectl 來操作。
# 獲取叢集憑證
gcloud container clusters get-credentials my-cluster --region us-central1
# 查看所有節點
kubectl get nodes
# 部署一個應用程式
kubectl create deployment hello-server --image=gcr.io/google-samples/hello-app:1.0
# 將應用程式公開給網路
kubectl expose deployment hello-server --type=LoadBalancer --port 80 --target-port 8080
熟記指令:gcloud container clusters get-credentials [NAME] --region [REGION]——這是讓 kubectl 能與特定 GKE 叢集對話的唯一方式,會把叢集 endpoint 與認證資訊寫入 kubeconfig。ACE 考試常出這個指令做填空。
Source ↗
GKE 維護與升級
- 發佈管道 (Release Channels): 選擇穩定版 (Stable)、常規版 (Regular) 或快速版 (Rapid)。
- 維護時間窗 (Maintenance Windows): 設定系統自動升級的時間段,避免影響高峰業務。
考試陷阱:當升級節點時,GKE 會逐一排空 (Drain) 節點上的 Pod 並重新建立。確保你的 Pod 有足夠的副本數且設定了 Pod 中斷預算 (Pod Disruption Budgets, PDB),以保證服務不中斷。 Source ↗
GKE 的最佳實務
- 優先使用 Autopilot:除非有強烈理由需要控制節點。
- 使用命名空間 (Namespaces):在邏輯上隔離不同的團隊或環境。
- 設定資源限制 (Resource Limits):防止某個 Pod 耗盡節點所有資源造成記憶體不足 (OOM Killed)。
- 啟用 Workload Identity:這讓 Pod 能以安全的方式存取其他 GCP 服務(如 Cloud Storage),而不需要在容器內儲存金鑰。
當 ACE 情境題問到 Pod 該如何在不使用 JSON service account key 的情況下存取 Cloud Storage 或 BigQuery 時,正解是 Workload Identity——把 Kubernetes ServiceAccount 綁定到 Google ServiceAccount。不要選「把 JSON key 掛載成 Secret」或「直接用節點的預設 service account」,這兩種做法都被標記為反模式。 Source ↗
ACE 的常見 GKE 情境
- 情境:你的應用程式在促銷期間流量暴增。
- 解決方案:確保啟用了 HPA(擴展 Pod)和叢集自動擴展器 CA(擴展節點)。
- 情境:你需要執行一個有狀態的資料庫。
- 解決方案:使用 StatefulSets 而非 Deployments,並配合永久磁碟區聲明 (Persistent Volume Claims, PVC)。
常見問題 (FAQ)
問:Autopilot 模式下可以透過 SSH 進入節點嗎? 答:不行。Autopilot 鎖定了節點存取權,以確保安全與穩定。
問:Pod 和 Container 有什麼區別? 答:Container 是打包後的程式碼,Pod 是 Kubernetes 執行的最小單位,一個 Pod 可以包含一個或多個 Container(共享網路和儲存)。
問:什麼是區域叢集 (Regional Cluster)? 答:區域叢集會將控制平面和節點分佈在一個區域的三個可用區內,提供比可用區叢集 (Zonal Cluster) 更高的可用性。
你無法將 Zonal Cluster 就地升級為 Regional Cluster——這是 ACE 考試直接會測的點。如果情境要求 99.99% 控制平面可用性,正解永遠是「建立一個新的 Regional Cluster 並把工作負載遷移過去」,絕對不是「升級現有的 Zonal Cluster」。 Source ↗
問:我可以在 GKE 中執行 Windows 容器嗎? 答:可以,GKE 支援 Windows Server 節點池。
問:什麼是 kubectl?
答:這是與 Kubernetes API 通訊的命令列工具,不限於 GKE,適用於所有 K8s 叢集。
ACE 總結清單
- 理解 Autopilot 與 Standard 的權責劃分。
- 知道
LoadBalancer服務類型會觸發建立 GCP 負載平衡器。 - 掌握 HPA, VPA, CA 三種縮放機制的用途。
- 熟記
gcloud container clusters get-credentials指令。 - 理解節點升級期間的可用性保障。