在 Google Cloud 外部設定多叢集網格
本指南說明如何為下列平台設定多叢集網格:
- 適用於 VMware 的 Google Distributed Cloud (僅限軟體)
- 適用於裸機的 Google Distributed Cloud (僅限軟體)
- GKE on Azure
- GKE on AWS
- 已連接的叢集,包括 Amazon EKS 叢集和 Microsoft AKS 叢集
本指南說明如何設定兩個叢集,但您可以擴充這個程序,將任意數量的叢集納入網格。
事前準備
本指南假設您已使用 asmcli install
安裝 Cloud Service Mesh。您需要 asmcli
,以及 asmcli
下載至您在執行 asmcli install
時在 --output_dir
中指定的目錄的設定套件。如果需要設定,請按照「安裝依附工具並驗證叢集」中的步驟:
您需要存取在網格中設定的所有叢集的 kubeconfig 檔案。
設定環境變數和預留位置
安裝東西向閘道時,您需要下列環境變數。
建立專案編號的環境變數。在下列指令中,將 FLEET_PROJECT_ID 替換為車隊主機專案的專案 ID。
export PROJECT_NUMBER=$(gcloud projects describe FLEET_PROJECT_ID \ --format="value(projectNumber)")
建立網格 ID 的環境變數。
export MESH_ID="proj-${PROJECT_NUMBER}"
以
asmcli
所需的格式建立叢集名稱的環境變數。export CLUSTER_1="cn-FLEET_PROJECT_ID-global-CLUSTER_NAME_1" export CLUSTER_2="cn-FLEET_PROJECT_ID-global-CLUSTER_NAME_2"
使用這項指令輸出內容中
NAME
欄下的值,取得叢集的內容名稱:kubectl config get-contexts
將環境變數設為叢集內容名稱,本指南稍後的許多步驟都會使用這些名稱:
export CTX_1=CLUSTER1_CONTEXT_NAME export CTX_2=CLUSTER2_CONTEXT_NAME
安裝東西向閘道
在下列指令中:
將
CLUSTER_NAME_1
和CLUSTER_NAME_2
替換為叢集名稱。將
PATH_TO_KUBECONFIG_1
和PATH_TO_KUBECONFIG_2
替換為叢集的 kubeconfig 檔案。
Anthos 叢集
Mesh CA 或 CA 服務
在叢集 1 中安裝專門用於東西向流量的閘道,以連線至
$CLUSTER_2
。根據預設,這個閘道會在網際網路上公開。實際運作系統可能需要額外的存取限制 (例如防火牆規則),以防範外部攻擊。asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_1} \ --network default \ --revision asm-1252-3 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
在
$CLUSTER_2
中安裝專門用於$CLUSTER_1
的東西向流量閘道。asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_2} \ --network default \ --revision asm-1252-3 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
Istio CA
在叢集 1 中安裝專門用於東西向流量的閘道,以連線至
$CLUSTER_2
。根據預設,這個閘道會在網際網路上公開。實際運作系統可能需要額外的存取限制 (例如防火牆規則),以防範外部攻擊。asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_1} \ --network default \ --revision asm-1252-3 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
在
$CLUSTER_2
中安裝專門用於$CLUSTER_1
的東西向流量閘道。asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_2} \ --network default \ --revision asm-1252-3 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
Azure、AWS 和已附加
Mesh CA
在叢集 1 中安裝專門用於東西向流量的閘道,以連線至
$CLUSTER_2
。根據預設,這個閘道會在網際網路上公開。實際運作系統可能需要額外的存取限制 (例如防火牆規則),以防範外部攻擊。asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_1} \ --network default \ --revision asm-1252-3 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
在
$CLUSTER_2
中安裝專門用於$CLUSTER_1
的東西向流量閘道。asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_2} \ --network default \ --revision asm-1252-3 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
Istio CA
在叢集 1 中安裝專門用於東西向流量的閘道,以連線至
$CLUSTER_2
。根據預設,這個閘道會在網際網路上公開。實際運作系統可能需要額外的存取限制 (例如防火牆規則),以防範外部攻擊。asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_1} \ --network default \ --revision asm-1252-3 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
在
$CLUSTER_2
中安裝專門用於$CLUSTER_1
的東西向流量閘道。asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_2} \ --network default \ --revision asm-1252-3 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
公開服務
由於叢集位於不同的網路中,您需要在兩個叢集的東西向閘道上公開所有服務 (*.local
)。雖然這個閘道在網際網路上是公開的,但只有具備可信任的 mTLS 憑證和工作負載 ID 的服務,才能存取其後方的服務,就像這些服務位於同一個網路中一樣。
透過東西向閘道公開
CLUSTER_NAME_1
的服務。kubectl --kubeconfig=PATH_TO_KUBECONFIG_1 apply -n istio-system -f \ asm/istio/expansion/expose-services.yaml
透過東西向閘道公開
CLUSTER_NAME_2
的服務。kubectl --kubeconfig=PATH_TO_KUBECONFIG_2 apply -n istio-system -f \ asm/istio/expansion/expose-services.yaml
啟用端點探索功能
執行 asmcli create-mesh
指令,啟用端點探索功能。這個範例只會顯示兩個叢集,但您可以執行指令,在其他叢集中啟用端點探索功能,但須遵守 GKE Hub 服務限制。
./asmcli create-mesh \
FLEET_PROJECT_ID \
PATH_TO_KUBECONFIG_1 \
PATH_TO_KUBECONFIG_2
驗證多叢集連線
本節說明如何將範例 HelloWorld
和 Sleep
服務部署至多叢集環境,以驗證跨叢集負載平衡功能是否正常運作。
啟用補充物注入功能
在每個叢集中建立範例命名空間。
for CTX in ${CTX_1} ${CTX_2} do kubectl create --context=${CTX} namespace sample done
在建立的命名空間中啟用補充資訊植入功能。
建議做法:執行下列指令,將預設注入標籤套用至命名空間:
for CTX in ${CTX_1} ${CTX_2} do kubectl label --context=${CTX} namespace sample \ istio.io/rev- istio-injection=enabled --overwrite done
建議您使用預設插入方式,但系統也支援以修訂版本為基礎的插入方式: 請按照下列操作說明操作:
使用下列指令,找出
istiod
上的修訂版本標籤:kubectl get deploy -n istio-system -l app=istiod -o \ jsonpath={.items[*].metadata.labels.'istio\.io\/rev'}'{"\n"}'
將修訂標籤套用至命名空間。在下列指令中,
REVISION_LABEL
是您在上一個步驟中記下的istiod
修訂版本標籤值。for CTX in ${CTX_1} ${CTX_2} do kubectl label --context=${CTX} namespace sample \ istio-injection- istio.io/rev=REVISION_LABEL --overwrite done
安裝 HelloWorld 服務
在兩個叢集中建立 HelloWorld 服務:
kubectl create --context=${CTX_1} \ -f ${SAMPLES_DIR}/samples/helloworld/helloworld.yaml \ -l service=helloworld -n sample
kubectl create --context=${CTX_2} \ -f ${SAMPLES_DIR}/samples/helloworld/helloworld.yaml \ -l service=helloworld -n sample
將 HelloWorld v1 和 v2 部署至每個叢集
將
HelloWorld v1
部署至CLUSTER_1
,並將v2
部署至CLUSTER_2
,以利日後驗證跨叢集負載平衡:kubectl create --context=${CTX_1} \ -f ${SAMPLES_DIR}/samples/helloworld/helloworld.yaml \ -l version=v1 -n sample
kubectl create --context=${CTX_2} \ -f ${SAMPLES_DIR}/samples/helloworld/helloworld.yaml \ -l version=v2 -n sample
請使用下列指令確認
HelloWorld v1
和v2
是否正在執行。確認輸出結果是否類似下列內容:kubectl get pod --context=${CTX_1} -n sample
NAME READY STATUS RESTARTS AGE helloworld-v1-86f77cd7bd-cpxhv 2/2 Running 0 40s
kubectl get pod --context=${CTX_2} -n sample
NAME READY STATUS RESTARTS AGE helloworld-v2-758dd55874-6x4t8 2/2 Running 0 40s
部署睡眠資料服務
將
Sleep
服務部署至兩個叢集。這個 Pod 會產生人工網路流量,以供示範:for CTX in ${CTX_1} ${CTX_2} do kubectl apply --context=${CTX} \ -f ${SAMPLES_DIR}/samples/sleep/sleep.yaml -n sample done
等待
Sleep
服務在各個叢集中啟動。確認輸出結果是否類似下列內容:kubectl get pod --context=${CTX_1} -n sample -l app=sleep
NAME READY STATUS RESTARTS AGE sleep-754684654f-n6bzf 2/2 Running 0 5s
kubectl get pod --context=${CTX_2} -n sample -l app=sleep
NAME READY STATUS RESTARTS AGE sleep-754684654f-dzl9j 2/2 Running 0 5s
驗證跨叢集負載平衡
請多次呼叫 HelloWorld
服務,並查看輸出內容,確認 v1 和 v2 的回覆交替:
呼叫
HelloWorld
服務:kubectl exec --context="${CTX_1}" -n sample -c sleep \ "$(kubectl get pod --context="${CTX_1}" -n sample -l \ app=sleep -o jsonpath='{.items[0].metadata.name}')" \ -- /bin/sh -c 'for i in $(seq 1 20); do curl -sS helloworld.sample:5000/hello; done'
輸出結果會與下列內容相似:
Hello version: v2, instance: helloworld-v2-758dd55874-6x4t8 Hello version: v1, instance: helloworld-v1-86f77cd7bd-cpxhv ...
再次呼叫
HelloWorld
服務:kubectl exec --context="${CTX_2}" -n sample -c sleep \ "$(kubectl get pod --context="${CTX_2}" -n sample -l \ app=sleep -o jsonpath='{.items[0].metadata.name}')" \ -- /bin/sh -c 'for i in $(seq 1 20); do curl -sS helloworld.sample:5000/hello; done'
輸出結果會與下列內容相似:
Hello version: v2, instance: helloworld-v2-758dd55874-6x4t8 Hello version: v1, instance: helloworld-v1-86f77cd7bd-cpxhv ...
恭喜!您已驗證負載平衡的多叢集 Cloud Service Mesh!
清除所用資源
完成負載平衡驗證後,請從叢集中移除 HelloWorld
和 Sleep
服務。
kubectl delete ns sample --context ${CTX_1} kubectl delete ns sample --context ${CTX_2}