返回文章列表

GKE叢集建立與管理最佳實務

本文介紹如何在 Google Kubernetes Engine(GKE)上建立和管理 Kubernetes 叢集,涵蓋 GCP CLI 安裝、叢集建立、工作負載佈署、服務組態、多可用區佈署策略以及成本考量等導向。文章將引導讀者逐步完成 GKE 叢集的設定,並提供最佳實務建議,以確保應用程式的高用性和效能。

Kubernetes 雲端服務

在 Google Kubernetes Engine(GKE)上佈署 Kubernetes 叢集,首先需安裝 GCP CLI,並透過 gcloud 命令列工具進行叢集建立與管理。透過 kubectl 可以佈署和管理應用程式工作負載,並組態服務型別,例如 ClusterIP 和 External Load Balancer,以控制應用程式的存取方式。GKE 提供了豐富的監控和管理功能,包括工作負載監控、日誌記錄、應用程式錯誤追蹤等,方便開發者快速診斷和解決問題。為了提高應用程式的高用性和容錯能力,建議採用跨多個可用區的佈署策略,並利用 GKE 的 Multi Cluster Ingress 功能實作跨區域佈署。最後,開發者還需考慮成本因素,並根據實際需求選擇合適的叢集規模和組態。

在Google Kubernetes Engine上建立Kubernetes叢集

安裝GCP命令列工具

要使用Google Kubernetes Engine(GKE),首先需要在本地機器上安裝Google Cloud Platform(GCP)命令列介面(CLI)。即使無法在本地安裝,也可以使用雲端的CLI。

在macOS上安裝

對於使用macOS的使用者,可以透過Homebrew來安裝GCP CLI。執行以下命令:

$ brew install --cask google-cloud-sdk

安裝完成後,可以透過以下命令檢查版本:

$ gcloud version

在Windows上安裝

在Windows上,可以使用Chocolatey或直接下載安裝程式來安裝GCP CLI。

使用Chocolatey安裝:

  1. 首先,需要安裝Chocolatey。在具有管理員許可權的PowerShell會話中執行:
$ Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
  1. 安裝GCP CLI:
$ choco install --ignore-checksum gcloudsdk

直接下載安裝程式:

  1. 從以下網址下載安裝程式:https://dl.google.com/dl/cloudsdk/channels/rapid/GoogleCloudSDKInstaller.exe
  2. 執行下載的安裝程式。

安裝完成後,在新的PowerShell視窗中執行:

$ gcloud version

在Linux上安裝

在Linux上,可以使用Google提供的全域安裝指令碼:

$ curl https://sdk.cloud.google.com | bash

指令碼會詢問一些問題,大多數情況下,回答「Yes」即可。安裝完成後,執行以下命令重新載入會話:

$ exec -l $SHELL

然後檢查GCP CLI版本:

$ gcloud version

使用Cloud Shell

除了在本地安裝GCP CLI外,還可以使用內建於Google Cloud Console的Google Cloud Shell。點選頂部選單右側的Shell圖示即可存取。

在Cloud Shell中,可以直接執行:

$ gcloud version

初始化GCP CLI

如果在本地安裝了GCP CLI,需要將其與GCP帳戶連結。執行以下命令:

$ gcloud init

此命令會進行網路診斷,然後提示登入。登入後,選擇要使用的雲端專案。

若需要切換專案,可以執行:

$ gcloud config set project PROJECT_ID

啟動第一個GKE叢集

組態完成後,即可啟動GKE叢集。執行啟動命令後,叢集需要幾分鐘時間來完全佈署。

內容解密:

此段落介紹瞭如何在不同的作業系統上安裝GCP CLI,並使用Cloud Shell作為替代方案。接著,說明瞭如何初始化GCP CLI並將其與GCP帳戶連結。最後,提到了啟動GKE叢集的步驟。這些步驟對於使用GKE進行Kubernetes叢集管理至關重要。

在 Google Kubernetes Engine 上建立與管理 Kubernetes 叢集

在啟動叢集之前,必須確保 container.googleapis.com 服務已啟用。執行以下命令以啟用該服務:

$ gcloud services enable container.googleapis.com

接下來,需要安裝一個外掛,以便使用 kubectl 對叢集進行身份驗證。執行以下命令:

$ gcloud components install gke-gcloud-auth-plugin

啟用服務和外掛後,建立一個名為 myfirstgkecluster 的雙節點叢集,該叢集將託管在美國中部地區的單一區域。命令如下:

$ gcloud container clusters create myfirstgkecluster --num-nodes=2 --zone=us-central1-a

大約五分鐘後,您應該會看到類別似以下的輸出:

內容解密:

此命令的輸出表示叢集建立的進度與結果,包含節點數量、叢集名稱及所在區域等資訊。

檢視叢集資訊

叢集啟動後,您可以按照輸出中的 URL 在 Google Cloud Console 中檢視,如下所示:

佈署工作負載並與叢集互動

當我們執行 $ gcloud container clusters create myfirstgkecluster --num-nodes=2 --zone=us-central1-a 命令建立叢集時,輸出中包含以下行:

kubeconfig entry generated for myfirstgkecluster.

這表示已下載並組態所有必要資訊,以便將本地 kubectl 連線到新佈署的 GKE 叢集。

執行以下命令確認:

$ kubectl get nodes

輸出應顯示兩個節點,字首為 gke

內容解密:

此命令用於檢查目前 kubectl 所連線的節點狀態,確認是否成功連線到 GKE 叢集。

組態本地客戶端

如果需要組態 kubectl 以連線到叢集,請執行以下命令以下載憑證並組態 kubectl

$ gcloud container clusters get-credentials myfirstgkecluster --zone=us-central1-a

您可以使用以下命令列出目前的上下文:

$ kubectl config current-context
$ kubectl config get-contexts -o name

然後,使用以下命令切換到所需的上下文:

$ kubectl config use-context CONTEXT_NAME

內容解密:

這些命令用於管理 kubectl 的組態,確保正確連線到目標叢集。

啟動範例工作負載

我們將啟動 PHP/Redis Guestbook 範例。首先,建立 Redis Leader 佈署和服務:

$ kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/kubernetes-engine-samples/main/quickstarts/guestbook/redis-leader-deployment.yaml
$ kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/kubernetes-engine-samples/main/quickstarts/guestbook/redis-leader-service.yaml

然後,建立 Redis Follower 佈署和服務:

$ kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/kubernetes-engine-samples/main/quickstarts/guestbook/redis-follower-deployment.yaml
$ kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/kubernetes-engine-samples/main/quickstarts/guestbook/redis-follower-service.yaml

最後,建立前端佈署和服務:

$ kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/kubernetes-engine-samples/main/quickstarts/guestbook/frontend-deployment.yaml
$ kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/kubernetes-engine-samples/main/quickstarts/guestbook/frontend-service.yaml

執行以下命令以取得前端服務的資訊:

$ kubectl get service frontend

輸出應包含一個外部 IP 地址。

內容解密:

這些命令用於佈署 Guestbook 應用程式的各個元件,包括 Redis Leader、Redis Follower 和前端服務。

探索 Google Cloud Console

在 Google Cloud Console 中,您可以檢視工作負載的相關資訊。點選左側選單中的「Workloads」連結,即可檢視佈署的詳細資訊。

內容解密:

此步驟展示瞭如何使用 Google Cloud Console 檢視和管理已佈署的工作負載。

Kubernetes Clusters on Google Kubernetes Engine(GKE)深度解析

Google Kubernetes Engine(GKE)為使用者提供了一個強大且可擴充套件的容器化應用程式管理平台。在GKE中,您可以輕鬆佈署、管理和擴充套件容器化應用程式。本文將探討GKE的各項功能及其操作細節。

工作負載(Workloads)管理與監控

在GKE控制檯中,「工作負載」部分提供了詳細的應用程式佈署資訊。以下標籤頁讓您可以深入瞭解佈署狀態:

  • OVERVIEW:提供所選工作負載的整體概覽,包括CPU、記憶體和磁碟使用率等關鍵指標。
  • DETAILS:列出環境和工作負載的詳細資訊,如建立時間、註解、標籤、副本資訊、更新策略和Pod資訊等。
  • OBSERVABILITY:提供工作負載基礎設施的各項指標資料,便於監控和調優。
  • REVISION HISTORY:記錄所有工作負載的修訂歷史,對於頻繁更新的佈署特別有用。
  • EVENTS:列出所有與工作負載相關的事件,如擴縮減、Pod可用性和錯誤資訊,協助故障排除。
  • LOGS:提供所有執行中容器的日誌記錄,並支援搜尋功能。
  • APP ERRORS:顯示應用程式錯誤資訊。
  • YAML:允許匯出完整的佈署組態YAML檔案。

這些資訊對於管理和監控GKE叢集中的所有佈署至關重要。

閘道器、服務和入口(Gateways, Services and Ingress)組態

「閘道器、服務和入口」部分列出了跨GKE叢集的所有服務。預設顯示GATEWAYS標籤頁,但通常需要切換到SERVICES標籤頁以檢視已佈署的服務。

服務型別與負載平衡組態

在GKE中,服務可以組態為不同的型別,例如:

  • ClusterIP:僅在叢集內可存取,如redis-leaderredis-follower服務。
  • External Load Balancer:具有公網IP地址,可從外部存取,如frontend服務。

當建立具有外部負載平衡的服務時,Kubernetes排程器會自動與Google Cloud API互動,建立負載平衡器並將流量導向叢集節點。

點選特定服務可檢視詳細資訊,包括:

  • 總覽(OVERVIEW)
  • 詳細資訊(DETAILS),包含負載平衡器資源連結
  • 事件(EVENTS)
  • 日誌(LOGS)
  • 應用程式錯誤(APP ERRORS)
  • YAML組態匯出

其他GKE功能特性

GKE提供多項功能以簡化叢集管理和應用程式佈署:

  • 叢集管理:建立和管理GKE叢集。
  • 應用程式佈署:檢視從Marketplace佈署的應用程式。
  • Secrets和ConfigMaps管理:安全地管理和儲存敏感資訊和組態資料。
  • 儲存管理:檢視和管理持久化儲存請求及儲存類別。
  • 物件瀏覽器:提供Kubernetes和GCP API的資源總覽。

此外,GKE還整合了多項Google Cloud原生服務,例如:

  • GKE備份:為GKE託管的工作負載和應用程式提供備份功能。
  • 網路功能最佳化器:允許GKE工作負載與其他GCP資源建立私有網路連線。
  • Marketplace:提供預封裝的應用程式,以便在GKE叢集中佈署。

GKE Enterprise版本

GKE Enterprise版本提供了更多企業級功能,如託管服務網格、安全、合規性和根據角色的存取控制(RBAC)。這些功能對於大型組織和受監管行業至關重要,但需額外付費。

刪除叢集與資源清理

完成測試後,您可以執行以下命令刪除叢集及其相關資源:

$ kubectl delete service frontend
$ gcloud container clusters delete myfirstgkecluster --zone=us-central1-a

請耐心等待叢集刪除完成,並檢查Google Cloud控制檯以確保沒有遺留資源,以避免不必要的費用。

關於叢集節點與可用區

在建立GKE叢集時,您需要了解區域(Region)和可用區(Zone)的概念。可用區是區域內部的一個獨立位置,用於實作高用性和容災。選擇適當的區域和可用區對於確保應用程式的穩定性和效能至關重要。

在 Google Kubernetes Engine 上佈署 Kubernetes 叢集

區域與可用區的佈署策略

在 Google Kubernetes Engine(GKE)中,區域(Region)是由多個可用區(Availability Zone)組成,這些可用區之間具有低延遲的網路連線,能夠實作高用性和容錯能力。可用區可視為同一區域內的不同資料中心,它們擁有獨立的網路和電源供應,確保即使某個可用區發生故障,跨多個可用區佈署的工作負載仍能正常運作。

不過,需要注意的是,並非所有機器型別都在區域內的所有可用區中可用。因此,在佈署工作負載之前,務必確認目標區域內的可用區是否支援所需的機器型別。Google 的最佳實踐建議在單一區域內盡可能多地佈署可用區,以獲得最佳效能和高用性。

跨區域佈署與多叢集入口

雖然在單一區域內跨多個可用區佈署工作負載能夠提升高用性,但 GKE 也支援跨多個區域佈署工作負載。這可以透過 Multi Cluster Ingress 實作,但需要考慮不同區域之間的延遲增加,尤其是在共用服務(如資料函式庫)時。更多關於 Multi Cluster Ingress 的資訊,請參閱本章末尾的延伸閱讀部分。

建立跨多個可用區的 GKE 叢集

首先,我們來檢視建立測試叢集時使用的命令:

$ gcloud container clusters create myfirstgkecluster --num-nodes=2 --zone=us-central1-a

這個命令會在單一可用區(us-central1-a)中建立一個包含兩個節點的叢集。若要將叢集佈署在多個可用區中,可以使用 --region 引數取代 --zone

$ gcloud container clusters create myfirstgkecluster --num-nodes=2 --region=us-central1

執行 kubectl get nodes 後,可以看到類別似以下的輸出:

Figure 15.14: Viewing the nodes running in a region

預設情況下,使用 --region 引數會在三個可用區中佈署叢集節點,因此這裡總共有六個節點。可以透過 --node-locations 引數來指定特定的可用區:

$ gcloud container clusters create myfirstgkecluster --num-nodes=2 --region=us-central1 --node-locations us-central1-a,us-central1-b,us-central1-c,us-central1-f

內容解密:

  • --num-nodes=2 指定每個可用區中的節點數量。
  • --region=us-central1 指定叢集佈署的區域。
  • --node-locations 用於指定叢集應佈署的可用區。

若要更新現有的叢集並新增可用區,可以執行以下命令:

$ gcloud container clusters update myfirstgkecluster --min-nodes=2 --region=us-central1 --node-locations us-central1-a,us-central1-b,us-central1-c,us-central1-f

再次執行 kubectl get nodes,可以看到叢集現在跨四個可用區執行:

Figure 15.15: Our cluster now running across four availability zones

內容解密:

  • update 命令用於更新現有的 GKE 叢集。
  • --min-nodes=2 確保每個可用區至少有兩個節點。
  • 更新後的叢集具備更高的冗餘性和可用性。

刪除跨區域叢集

刪除使用 --region 引數建立的叢集時,應使用以下命令:

$ gcloud container clusters delete myfirstgkecluster --region=us-central1

內容解密:

  • 刪除叢集時需指定正確的區域,以確保刪除正確的資源。

成本考量

在本章撰寫時,一個簡單的雙節點叢集每月的費用約為 $55,而擴充套件到八個節點後,每月費用約為 $347。有關詳細的成本資訊,請參考 Google Cloud Pricing Calculator(請參閱本章末尾的延伸閱讀)。

圖表說明:跨區域佈署架構圖

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title GKE叢集建立與管理最佳實務

package "Kubernetes Cluster" {
    package "Control Plane" {
        component [API Server] as api
        component [Controller Manager] as cm
        component [Scheduler] as sched
        database [etcd] as etcd
    }

    package "Worker Nodes" {
        component [Kubelet] as kubelet
        component [Kube-proxy] as proxy
        package "Pods" {
            component [Container 1] as c1
            component [Container 2] as c2
        }
    }
}

api --> etcd : 儲存狀態
api --> cm : 控制迴圈
api --> sched : 調度決策
api --> kubelet : 指令下達
kubelet --> c1
kubelet --> c2
proxy --> c1 : 網路代理
proxy --> c2

note right of api
  核心 API 入口
  所有操作經由此處
end note

@enduml

此圖示展示了 GKE 叢集如何跨多個可用區進行佈署,以實作高用性和容錯能力。使用者請求被分配到不同的節點上,確保系統的穩定執行。