在 Google Cloud 外部設定多叢集網格
Google Cloud 詳情請參閱「Cloud Service Mesh 總覽」一文。本指南說明如何為下列平台設定多叢集網格:
- 適用於 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 檔案。
GKE 叢集
網格 CA 或 CA 服務
在 cluster1 中安裝專用於東西向流量的閘道
$CLUSTER_2
。根據預設,這個閘道會在網際網路上公開。為防範外部攻擊,生產系統可能需要額外的存取限制,例如防火牆規則。asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_1} \ --network default \ --revision asm-1264-1 | \ ./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-1264-1 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
Istio CA
在 cluster1 中安裝專用於東西向流量的閘道
$CLUSTER_2
。根據預設,這個閘道會在網際網路上公開。為防範外部攻擊,生產系統可能需要額外的存取限制,例如防火牆規則。asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_1} \ --network default \ --revision asm-1264-1 | \ ./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-1264-1 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
Azure、AWS 和已附加
Mesh CA
在 cluster1 中安裝專用於東西向流量的閘道
$CLUSTER_2
。根據預設,這個閘道會在網際網路上公開。為防範外部攻擊,生產系統可能需要額外的存取限制,例如防火牆規則。asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_1} \ --network default \ --revision asm-1264-1 | \ ./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-1264-1 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
Istio CA
在 cluster1 中安裝專用於東西向流量的閘道
$CLUSTER_2
。根據預設,這個閘道會在網際網路上公開。為防範外部攻擊,生產系統可能需要額外的存取限制,例如防火牆規則。asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_1} \ --network default \ --revision asm-1264-1 | \ ./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-1264-1 | \ ./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
服務部署至多叢集環境,以驗證跨叢集負載平衡是否正常運作。
啟用 Sidecar 注入功能
在每個叢集中建立範例命名空間。
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 服務
將
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}