本教學課程說明如何使用多叢集 Ingress 升級多叢集 Google Kubernetes Engine (GKE) 環境。本教學課程是使用多叢集 Ingress 升級多叢集 GKE 文件的後續內容,該文件更詳細地說明瞭相關程序、架構和術語。建議您先閱讀概念文件,再開始本教學課程。
如要詳細比較多叢集 Ingress (MCI)、多叢集閘道 (MCG) 和負載平衡器與獨立網路端點群組 (LB 和獨立 NEG),請參閱為 GKE 選擇多叢集負載平衡 API。
本文適用對象為負責維護 GKE 叢集車隊的管理員。 Google Cloud
建議您自動升級 GKE 叢集。自動升級是全代管功能,可根據Google Cloud決定的發布時間表,自動更新叢集 (控制層和節點)。這項作業不需要操作人員介入。不過,如果您想進一步掌控叢集的升級方式和時間,本教學課程將逐步說明如何升級多個叢集,讓應用程式在所有叢集上執行。接著,它會使用多叢集 Ingress 逐一排空叢集,然後再升級。
架構
本教學課程使用下列架構。共有三個叢集:兩個叢集 (blue 和 green) 是相同的叢集,部署的應用程式也相同,另一個叢集 (ingress-config) 則是控制層叢集,用於設定多叢集 Ingress。在本教學課程中,您將範例應用程式部署至兩個應用程式叢集 (blue 和 green 叢集)。

設定環境
在 Cloud Shell 中複製存放區,取得本教學課程的檔案:
cd ${HOME} git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples建立
WORKDIR目錄:cd kubernetes-engine-samples/networking/gke-multicluster-upgrade-mci/ export WORKDIR=`pwd`
建立 GKE 叢集並向 Hub 註冊
在本節中,您將建立三個 GKE 叢集,並向 GKE Hub 註冊。
建立 GKE 叢集
在 Cloud Shell 中建立三個 GKE 叢集:
gcloud container clusters create ingress-config --location us-west1-a \ --release-channel=None --no-enable-autoupgrade --num-nodes=4 \ --enable-ip-alias --workload-pool=${PROJECT}.svc.id.goog --quiet --async gcloud container clusters create blue --location us-west1-b --num-nodes=3 \ --release-channel=None --no-enable-autoupgrade --enable-ip-alias \ --workload-pool=${PROJECT}.svc.id.goog --quiet --async gcloud container clusters create green --location us-west1-c --num-nodes=3 \ --release-channel=None --no-enable-autoupgrade --enable-ip-alias \ --workload-pool=${PROJECT}.svc.id.goog --quiet在本教學課程中,您會在單一區域的三個不同區域中建立叢集:
us-west1-a、us-west1-b和us-west1-c。如要進一步瞭解地區和區域,請參閱地理位置與地區。稍候幾分鐘,直到所有叢集建立成功,然後確認叢集正在執行:
gcloud container clusters list輸出結果會與下列內容相似:
NAME: ingress-config LOCATION: us-west1-a MASTER_VERSION: 1.22.8-gke.202 MASTER_IP: 35.233.186.135 MACHINE_TYPE: e2-medium NODE_VERSION: 1.22.8-gke.202 NUM_NODES: 4 STATUS: RUNNING NAME: blue LOCATION: us-west1-b MASTER_VERSION: 1.22.8-gke.202 MASTER_IP: 34.82.35.222 MACHINE_TYPE: e2-medium NODE_VERSION: 1.22.8-gke.202 NUM_NODES: 3 STATUS: RUNNING NAME: green LOCATION: us-west1-c MASTER_VERSION: 1.22.8-gke.202 MASTER_IP: 35.185.204.26 MACHINE_TYPE: e2-medium NODE_VERSION: 1.22.8-gke.202 NUM_NODES: 3 STATUS: RUNNING建立
kubeconfig檔案,並連線至所有叢集,以在kubeconfig檔案中產生相關項目:touch gke-upgrade-kubeconfig export KUBECONFIG=gke-upgrade-kubeconfig gcloud container clusters get-credentials ingress-config \ --location us-west1-a --project ${PROJECT} gcloud container clusters get-credentials blue --location us-west1-b \ --project ${PROJECT} gcloud container clusters get-credentials green --location us-west1-c \ --project ${PROJECT}您可以使用
kubeconfig檔案為每個叢集建立使用者和背景資訊,藉此為叢集建立驗證。建立kubeconfig檔案後,您就可以快速切換不同叢集的背景資訊。確認
kubeconfig檔案中有三個叢集:kubectl config view -ojson | jq -r '.clusters[].name'輸出內容如下:
gke_gke-multicluster-upgrades_us-west1-a_ingress-config gke_gke-multicluster-upgrades_us-west1-b_blue gke_gke-multicluster-upgrades_us-west1-c_green取得三個叢集的內容,以供日後使用:
export INGRESS_CONFIG_CLUSTER=$(kubectl config view -ojson | jq \ -r '.clusters[].name' | grep ingress-config) export BLUE_CLUSTER=$(kubectl config view -ojson | jq \ -r '.clusters[].name' | grep blue) export GREEN_CLUSTER=$(kubectl config view -ojson | jq \ -r '.clusters[].name' | grep green) echo -e "${INGRESS_CONFIG_CLUSTER}\n${BLUE_CLUSTER}\n${GREEN_CLUSTER}"輸出內容如下:
gke_gke-multicluster-upgrades_us-west1-a_ingress-config gke_gke-multicluster-upgrades_us-west1-b_blue gke_gke-multicluster-upgrades_us-west1-c_green
將 GKE 叢集註冊至機群
將叢集註冊至機群後,您就能在混合式環境中運作 Kubernetes 叢集。註冊至機群的叢集可以使用多叢集 Ingress 等進階 GKE 功能。如要將 GKE 叢集註冊至車隊,您可以直接使用 Google Cloud服務帳戶,也可以使用建議的 GKE 適用的工作負載身分聯盟方法,讓 GKE 叢集中的 Kubernetes 服務帳戶做為 Identity and Access Management 服務帳戶。
將這三個叢集註冊為機群:
gcloud container fleet memberships register ingress-config \ --gke-cluster=us-west1-a/ingress-config \ --enable-workload-identity gcloud container fleet memberships register blue \ --gke-cluster=us-west1-b/blue \ --enable-workload-identity gcloud container fleet memberships register green \ --gke-cluster=us-west1-c/green \ --enable-workload-identity確認叢集已註冊:
gcloud container fleet memberships list輸出結果會與下列內容相似:
NAME: blue EXTERNAL_ID: 401b4f08-8246-4f97-a6d8-cf1b78c2a91d NAME: green EXTERNAL_ID: 8041c36a-9d42-40c8-a67f-54fcfd84956e NAME: ingress-config EXTERNAL_ID: 65ac48fe-5043-42db-8b1e-944754a0d725透過 Hub 啟用
multiclusteringress功能,將ingress-config叢集設為多叢集 Ingress 的設定叢集:gcloud container fleet ingress enable --config-membership=ingress-config上述指令會將
MulticlusterIngress和MulticlusterServiceCRD (自訂資源定義) 新增至ingress-config叢集。這個指令需要幾分鐘才能完成。請稍候片刻,再進行下一個步驟。確認
ingress-cluster叢集已成功設定 Multi Cluster Ingress:watch gcloud container fleet ingress describe等待輸出結果與下列內容相似:
createTime: '2022-07-05T10:21:40.383536315Z' membershipStates: projects/662189189487/locations/global/memberships/blue: state: code: OK updateTime: '2022-07-08T10:59:44.230329189Z' projects/662189189487/locations/global/memberships/green: state: code: OK updateTime: '2022-07-08T10:59:44.230329950Z' projects/662189189487/locations/global/memberships/ingress-config: state: code: OK updateTime: '2022-07-08T10:59:44.230328520Z' name: projects/gke-multicluster-upgrades/locations/global/features/multiclusteringress resourceState: state: ACTIVE spec: multiclusteringress: configMembership: projects/gke-multicluster-upgrades/locations/global/memberships/ingress-config state: state: code: OK description: Ready to use updateTime: '2022-07-08T10:57:33.303543609Z' updateTime: '2022-07-08T10:59:45.247576318Z'如要結束
watch指令,請按 Control+C。
將範例應用程式部署至藍色和綠色叢集
在 Cloud Shell 中,將範例
whereami應用程式部署至blue和green叢集:kubectl --context ${BLUE_CLUSTER} apply -f ${WORKDIR}/application-manifests kubectl --context ${GREEN_CLUSTER} apply -f ${WORKDIR}/application-manifests請稍候幾分鐘,確認
blue和green叢集中的所有 Pod 狀態皆為Running:kubectl --context ${BLUE_CLUSTER} get pods kubectl --context ${GREEN_CLUSTER} get pods輸出結果會與下列內容相似:
NAME READY STATUS RESTARTS AGE whereami-deployment-756c7dc74c-zsmr6 1/1 Running 0 74s NAME READY STATUS RESTARTS AGE whereami-deployment-756c7dc74c-sndz7 1/1 Running 0 68s.
設定多叢集 Ingress
在本節中,您將建立多叢集 Ingress,將流量傳送至 blue 和 green 叢集上執行的應用程式。您可以使用 Cloud Load Balancing 建立負載平衡器,並將 blue 和 green 叢集中的 whereami 應用程式做為後端。如要建立負載平衡器,您需要兩個資源:MultiClusterIngress 和一或多個 MultiClusterServices。MultiClusterIngress 和 MultiClusterService 物件是多叢集類似項目,適用於單一叢集環境中現有的 Kubernetes Ingress 和 Service 資源。
在 Cloud Shell 中,將
MulticlusterIngress資源部署至ingress-config叢集:kubectl --context ${INGRESS_CONFIG_CLUSTER} apply -f ${WORKDIR}/multicluster-manifests/mci.yaml輸出內容如下:
multiclusteringress.networking.gke.io/whereami-mci created將
MulticlusterService資源部署至ingress-config叢集:kubectl --context ${INGRESS_CONFIG_CLUSTER} apply -f ${WORKDIR}/multicluster-manifests/mcs-blue-green.yaml輸出內容如下:
multiclusterservice.networking.gke.io/whereami-mcs created如要比較這兩項資源,請按照下列步驟操作:
檢查
MulticlusterIngress資源:kubectl --context ${INGRESS_CONFIG_CLUSTER} get multiclusteringress -o yaml輸出內容包含下列項目:
spec: template: spec: backend: serviceName: whereami-mcs servicePort: 8080MulticlusterIngress資源與 Kubernetes Ingress 資源類似,但serviceName規格會指向MulticlusterService資源。檢查
MulticlusterService資源:kubectl --context ${INGRESS_CONFIG_CLUSTER} get multiclusterservice -o yaml輸出內容包含下列項目:
spec: clusters: - link: us-west1-b/blue - link: us-west1-c/green template: spec: ports: - name: web port: 8080 protocol: TCP targetPort: 8080 selector: app: whereamiMulticlusterService資源與 Kubernetes Service 資源類似,但具有clusters規格。clusters值是已註冊的叢集清單,其中會建立MulticlusterService資源。確認
MulticlusterIngress資源是否已建立負載平衡器,且後端服務指向MulticlusterService資源:watch kubectl --context ${INGRESS_CONFIG_CLUSTER} \ get multiclusteringress -o jsonpath="{.items[].status.VIP}"最多可能需要 10 分鐘。等待輸出內容與下列內容類似:
34.107.246.9如要結束
watch指令,請按下Control+C鍵。
在 Cloud Shell 中,取得 Cloud Load Balancing VIP:
export GCLB_VIP=$(kubectl --context ${INGRESS_CONFIG_CLUSTER} \ get multiclusteringress -o json | jq -r '.items[].status.VIP') \ && echo ${GCLB_VIP}輸出結果會與下列內容相似:
34.107.246.9使用
curl存取負載平衡器和已部署的應用程式:curl ${GCLB_VIP}輸出結果會與下列內容相似:
{ "cluster_name": "green", "host_header": "34.107.246.9", "pod_name": "whereami-deployment-756c7dc74c-sndz7", "pod_name_emoji": "😇", "project_id": "gke-multicluster-upgrades", "timestamp": "2022-07-08T14:26:07", "zone": "us-west1-c" }重複執行
curl指令。請注意,系統會在部署至兩個叢集 (blue和green) 的whereami應用程式之間,平衡負載要求。
設定負載產生器
在本節中,您將設定 loadgenerator 服務,產生傳送至 Cloud Load Balancing VIP 的用戶端流量。首先,流量會傳送至 blue 和 green 叢集,因為 MulticlusterService 資源已設定為將流量傳送至這兩個叢集。稍後,您會設定 MulticlusterService 資源,將流量傳送至單一叢集。
設定
loadgenerator資訊清單,將用戶端流量傳送至 Cloud Load Balancing:TEMPLATE=loadgen-manifests/loadgenerator.yaml.templ && envsubst < ${TEMPLATE} > ${TEMPLATE%.*}在
ingress-config叢集中部署loadgenerator:kubectl --context ${INGRESS_CONFIG_CLUSTER} apply -f ${WORKDIR}/loadgen-manifests確認
ingress-config叢集中的loadgeneratorPod 狀態皆為Running:kubectl --context ${INGRESS_CONFIG_CLUSTER} get pods輸出結果會與下列內容相似:
NAME READY STATUS RESTARTS AGE loadgenerator-5498cbcb86-hqscp 1/1 Running 0 53s loadgenerator-5498cbcb86-m2z2z 1/1 Running 0 53s loadgenerator-5498cbcb86-p56qb 1/1 Running 0 53s如果任何 Pod 的狀態不是
Running,請稍候幾分鐘,然後再次執行指令。
監控流量
在本節中,您將使用Google Cloud 控制台監控 whereami 應用程式的流量。
在上一節中,您設定了 loadgenerator 部署作業,透過存取 Cloud Load Balancing VIP 中的 whereami 應用程式,模擬用戶端流量。您可以透過Google Cloud 控制台監控這些指標。請先設定監控功能,以便在排空叢集以進行升級時監控叢集 (詳見下一節)。
建立資訊主頁,顯示抵達多叢集 Ingress 的流量:
export DASH_ID=$(gcloud monitoring dashboards create \ --config-from-file=dashboards/cloud-ops-dashboard.json \ --format=json | jq -r ".name" | awk -F '/' '{print $4}')輸出結果會與下列內容相似:
Created [721b6c83-8f9b-409b-a009-9fdf3afb82f8]您可以在Google Cloud 主控台中查看 Cloud Load Balancing 的指標。產生網址:
echo "https://console.cloud.google.com/monitoring/dashboards/builder/${DASH_ID}/?project=${PROJECT}&timeDomain=1h"輸出結果會與下列內容相似:
https://console.cloud.google.com/monitoring/dashboards/builder/721b6c83-8f9b-409b-a009-9fdf3afb82f8/?project=gke-multicluster-upgrades&timeDomain=1h"在瀏覽器中前往上一個指令產生的網址。
範例應用程式的流量會從負載產生器傳送至
blue和green叢集 (以叢集所在的兩個區域表示)。時間軸指標圖表會顯示前往兩個後端的流量。滑鼠懸停在k8s1-值上時,會顯示兩個前端MulticlusterServices的網路端點群組 (NEG) 正在blue和green叢集中執行。
排空並升級 blue 叢集
在本節中,您將排空 blue 叢集。排空叢集是指將叢集從負載平衡集區中移除。排空 blue 叢集後,所有傳送至應用程式的用戶端流量都會前往 green 叢集。如要監控這個程序,請參閱上一節的說明。排空叢集後,即可升級。升級完成後,即可將其放回負載平衡集區。重複這些步驟,即可升級其他叢集 (本教學課程未顯示)。
如要排空 blue 叢集,請更新 ingress-cluster 叢集中的 MulticlusterService 資源,並從 clusters 規格中移除 blue 叢集。
排空藍色叢集
在 Cloud Shell 中,更新
ingress-config叢集中的MulticlusterService資源:kubectl --context ${INGRESS_CONFIG_CLUSTER} \ apply -f ${WORKDIR}/multicluster-manifests/mcs-green.yaml確認
clusters規格中只有green叢集:kubectl --context ${INGRESS_CONFIG_CLUSTER} get multiclusterservice \ -o json | jq '.items[].spec.clusters'輸出內容如下:
[ { "link": "us-west1-c/green" } ]clusters規格中只列出green叢集,因此只有green叢集位於負載平衡集區中。您可以在Google Cloud 主控台中查看 Cloud Load Balancing 指標。產生網址:
echo "https://console.cloud.google.com/monitoring/dashboards/builder/${DASH_ID}/?project=${PROJECT}&timeDomain=1h"在瀏覽器中前往上一個指令產生的網址。
圖表顯示只有
green叢集收到流量。
升級 blue 叢集
blue 叢集不再接收任何用戶端流量,現在可以升級叢集 (控制層和節點)。
在 Cloud Shell 中,取得叢集的目前版本:
gcloud container clusters list輸出結果會與下列內容相似:
NAME: ingress-config LOCATION: us-west1-a MASTER_VERSION: 1.22.8-gke.202 MASTER_IP: 35.233.186.135 MACHINE_TYPE: e2-medium NODE_VERSION: 1.22.8-gke.202 NUM_NODES: 4 STATUS: RUNNING NAME: blue LOCATION: us-west1-b MASTER_VERSION: 1.22.8-gke.202 MASTER_IP: 34.82.35.222 MACHINE_TYPE: e2-medium NODE_VERSION: 1.22.8-gke.202 NUM_NODES: 3 STATUS: RUNNING NAME: green LOCATION: us-west1-c MASTER_VERSION: 1.22.8-gke.202 MASTER_IP: 35.185.204.26 MACHINE_TYPE: e2-medium NODE_VERSION: 1.22.8-gke.202 NUM_NODES: 3 STATUS: RUNNING叢集版本可能因完成本教學課程的時間而異。
取得區域中可用的
MasterVersions版本清單:gcloud container get-server-config --location us-west1-b --format=json | jq \ '.validMasterVersions[0:20]'輸出結果會與下列內容相似:
[ "1.24.1-gke.1400", "1.23.7-gke.1400", "1.23.6-gke.2200", "1.23.6-gke.1700", "1.23.6-gke.1501", "1.23.6-gke.1500", "1.23.5-gke.2400", "1.23.5-gke.1503", "1.23.5-gke.1501", "1.22.10-gke.600", "1.22.9-gke.2000", "1.22.9-gke.1500", "1.22.9-gke.1300", "1.22.8-gke.2200", "1.22.8-gke.202", "1.22.8-gke.201", "1.22.8-gke.200", "1.21.13-gke.900", "1.21.12-gke.2200", "1.21.12-gke.1700" ]取得區域中可用的
NodeVersions版本清單:gcloud container get-server-config --location us-west1-b --format=json | jq \ '.validNodeVersions[0:20]'輸出結果會與下列內容相似:
[ "1.24.1-gke.1400", "1.23.7-gke.1400", "1.23.6-gke.2200", "1.23.6-gke.1700", "1.23.6-gke.1501", "1.23.6-gke.1500", "1.23.5-gke.2400", "1.23.5-gke.1503", "1.23.5-gke.1501", "1.22.10-gke.600", "1.22.9-gke.2000", "1.22.9-gke.1500", "1.22.9-gke.1300", "1.22.8-gke.2200", "1.22.8-gke.202", "1.22.8-gke.201", "1.22.8-gke.200", "1.22.7-gke.1500", "1.22.7-gke.1300", "1.22.7-gke.900" ]為
MasterVersions和NodeVersions清單中的MasterVersion和NodeVersion版本設定環境變數,且該版本高於blue叢集的目前版本,例如:export UPGRADE_VERSION="1.22.10-gke.600"本教學課程使用
。1.22.10-gke.600版本。叢集版本可能有所不同,具體取決於您完成本教學課程時可用的版本。如要進一步瞭解升級,請參閱升級叢集和節點集區。升級
blue叢集的control plane節點:gcloud container clusters upgrade blue \ --location us-west1-b --master --cluster-version ${UPGRADE_VERSION}如要確認升級,請按
Y。此程序需要幾分鐘才能完成。請等待升級完成再繼續操作。
更新完成後,輸出內容如下:
Updated [https://container.googleapis.com/v1/projects/gke-multicluster-upgrades/zones/us-west1-b/clusters/blue].升級
blue叢集中的節點:gcloud container clusters upgrade blue \ --location=us-west1-b --node-pool=default-pool \ --cluster-version ${UPGRADE_VERSION}按下
Y即可確認更新。此程序需要幾分鐘才能完成。請等待節點升級完成再繼續操作。
升級完成後,輸出內容如下:
Upgrading blue... Done with 3 out of 3 nodes (100.0%): 3 succeeded...done. Updated [https://container.googleapis.com/v1/projects/gke-multicluster-upgrades/zones/us-west1-b/clusters/blue].確認
blue叢集已升級:gcloud container clusters list輸出結果會與下列內容相似:
NAME: ingress-config LOCATION: us-west1-a MASTER_VERSION: 1.22.8-gke.202 MASTER_IP: 35.233.186.135 MACHINE_TYPE: e2-medium NODE_VERSION: 1.22.8-gke.202 NUM_NODES: 4 STATUS: RUNNING NAME: blue LOCATION: us-west1-b MASTER_VERSION: 1.22.10-gke.600 MASTER_IP: 34.82.35.222 MACHINE_TYPE: e2-medium NODE_VERSION: 1.22.10-gke.600 NUM_NODES: 3 STATUS: RUNNING NAME: green LOCATION: us-west1-c MASTER_VERSION: 1.22.8-gke.202 MASTER_IP: 35.185.204.26 MACHINE_TYPE: e2-medium NODE_VERSION: 1.22.8-gke.202 NUM_NODES: 3 STATUS: RUNNING
將 blue 叢集加回負載平衡集區
在本節中,您會將 blue 叢集加回負載平衡集區。
在 Cloud Shell 中,確認應用程式部署作業在
blue叢集上執行,然後再將其加回負載平衡集區:kubectl --context ${BLUE_CLUSTER} get pods輸出結果會與下列內容相似:
NAME READY STATUS RESTARTS AGE whereami-deployment-756c7dc74c-xdnb6 1/1 Running 0 17m更新
MutliclusterService資源,將blue叢集加回負載平衡集區:kubectl --context ${INGRESS_CONFIG_CLUSTER} apply \ -f ${WORKDIR}/multicluster-manifests/mcs-blue-green.yaml確認叢集規格中同時有
blue和green叢集:kubectl --context ${INGRESS_CONFIG_CLUSTER} get multiclusterservice \ -o json | jq '.items[].spec.clusters'輸出內容如下:
[ { "link": "us-west1-b/blue" }, { "link": "us-west1-c/green" } ]blue和green叢集現在位於clusters規格中。您可以在Google Cloud 控制台中查看 Cloud Load Balancing 指標。產生網址:
echo "https://console.cloud.google.com/monitoring/dashboards/builder/${DASH_ID}/?project=${PROJECT}&timeDomain=1h"在瀏覽器中前往上一個指令產生的網址。
圖表顯示藍色和綠色叢集都透過負載平衡器,接收來自負載產生器的流量。
恭喜!您已使用多叢集 Ingress,在多叢集架構中成功升級 GKE 叢集。
如要升級
green叢集,請重複執行排空並升級藍色叢集的程序,並將所有blue替換為green。