在 Google Cloud 外部設定多叢集網格

多叢集 Cloud Service Mesh 可讓您連結非 Google Cloud 環境中的工作負載。這個架構提供跨叢集端點探索、統一流量轉送,以及一致的安全政策,適用於所有部署項目。詳情請參閱「Cloud Service Mesh 總覽」。

支援的平台包括 Google Distributed Cloud (僅限軟體) for VMware、Google Distributed Cloud (僅限軟體) for Bare Metal、GKE on Azure (已淘汰)、GKE on AWS (已淘汰),以及附加叢集,包括 Amazon EKS 叢集和 Microsoft AKS 叢集 (已淘汰)。雖然下列操作說明示範如何連結兩個叢集,但您可以擴充這項程序,將任意數量的叢集納入網格。

事前準備

本指南假設您已使用 asmcli install 安裝 Cloud Service Mesh。您需要 asmcli,以及 asmcli 下載到您在執行 asmcli install 時於 --output_dir 中指定的目錄的設定套件。如需設定,請按照「安裝依附元件工具並驗證叢集」中的步驟操作,完成下列事項:

您必須具備 kubeconfig 檔案的存取權,才能在網格中設定所有叢集。

設定環境變數和預留位置

安裝東西向閘道時,您需要下列環境變數。

  1. 為專案編號建立環境變數。在下列指令中,將 FLEET_PROJECT_ID 替換為機群主專案的專案 ID。

    export PROJECT_NUMBER=$(gcloud projects describe FLEET_PROJECT_ID \
    --format="value(projectNumber)")
    
  2. 為網格 ID 建立環境變數。

    export MESH_ID="proj-${PROJECT_NUMBER}"
    
  3. 按照 asmcli 要求的格式,為叢集名稱建立環境變數。

    export CLUSTER_1="cn-FLEET_PROJECT_ID-global-CLUSTER_NAME_1"
    export CLUSTER_2="cn-FLEET_PROJECT_ID-global-CLUSTER_NAME_2"
    
  4. 使用這個指令輸出內容中 NAME 欄下方的值,取得叢集的背景資訊名稱:

    kubectl config get-contexts
  5. 將環境變數設為叢集內容名稱,本指南後續許多步驟都會用到:

    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 叢集

Mesh CA 或 CA 服務

  1. 在 cluster1 中安裝專門處理東西向流量的閘道,並將流量導向 $CLUSTER_2。根據預設,這個閘道會在網際網路上公開。正式環境系統可能需要額外的存取限制 (例如防火牆規則),以防範外部攻擊。

    asm/istio/expansion/gen-eastwest-gateway.sh \
        --mesh ${MESH_ID}  \
        --cluster ${CLUSTER_1}  \
        --network default \
        --revision asm-1311-19 | \
        ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \
        install -y --set spec.values.global.pilotCertProvider=istiod -f -
    
  2. 在 $CLUSTER_2 中安裝專用於 $CLUSTER_1 東西向流量的閘道。

    asm/istio/expansion/gen-eastwest-gateway.sh \
        --mesh ${MESH_ID}  \
        --cluster ${CLUSTER_2}  \
        --network default \
        --revision asm-1311-19 | \
        ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \
        install -y --set spec.values.global.pilotCertProvider=istiod -f -
    

Istio CA

  1. 在 cluster1 中安裝專門處理東西向流量的閘道,並將流量導向 $CLUSTER_2。根據預設,這個閘道會在網際網路上公開。正式環境系統可能需要額外的存取限制 (例如防火牆規則),以防範外部攻擊。

    asm/istio/expansion/gen-eastwest-gateway.sh \
        --mesh ${MESH_ID}  \
        --cluster ${CLUSTER_1}  \
        --network default \
        --revision asm-1311-19 | \
        ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \
        install -y --set spec.values.global.pilotCertProvider=istiod -f -
    
  2. 在 $CLUSTER_2 中安裝專用於 $CLUSTER_1 東西向流量的閘道。

    asm/istio/expansion/gen-eastwest-gateway.sh \
        --mesh ${MESH_ID}  \
        --cluster ${CLUSTER_2}  \
        --network default \
        --revision asm-1311-19 | \
        ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \
        install -y --set spec.values.global.pilotCertProvider=istiod -f -
    

Azure、AWS 和附加

Mesh CA

  1. 在 cluster1 中安裝專門處理東西向流量的閘道,並將流量導向 $CLUSTER_2。根據預設,這個閘道會在網際網路上公開。正式環境系統可能需要額外的存取限制 (例如防火牆規則),以防範外部攻擊。

    asm/istio/expansion/gen-eastwest-gateway.sh \
        --mesh ${MESH_ID}  \
        --cluster ${CLUSTER_1}  \
        --network default \
        --revision asm-1311-19 | \
        ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \
        install -y --set spec.values.global.pilotCertProvider=istiod -f -
    
  2. 在 $CLUSTER_2 中安裝專用於 $CLUSTER_1 東西向流量的閘道。

    asm/istio/expansion/gen-eastwest-gateway.sh \
        --mesh ${MESH_ID}  \
        --cluster ${CLUSTER_2}  \
        --network default \
        --revision asm-1311-19 | \
        ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \
        install -y --set spec.values.global.pilotCertProvider=istiod -f -
    

Istio CA

  1. 在 cluster1 中安裝專用於東西向流量至 $CLUSTER_2 的閘道。根據預設,這個閘道會在網際網路上公開。正式環境系統可能需要額外的存取限制 (例如防火牆規則),以防範外部攻擊。

    asm/istio/expansion/gen-eastwest-gateway.sh \
        --mesh ${MESH_ID}  \
        --cluster ${CLUSTER_1}  \
        --network default \
        --revision asm-1311-19 | \
        ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \
        install -y --set spec.values.global.pilotCertProvider=istiod -f -
    
  2. 在 $CLUSTER_2 中安裝專用於 $CLUSTER_1 東西向流量的閘道。

    asm/istio/expansion/gen-eastwest-gateway.sh \
        --mesh ${MESH_ID}  \
        --cluster ${CLUSTER_2}  \
        --network default \
        --revision asm-1311-19 | \
        ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \
        install -y --set spec.values.global.pilotCertProvider=istiod -f -
    

公開服務

由於叢集位於不同網路,您必須在兩個叢集的東西向閘道上公開所有服務 (*.local)。雖然這個閘道在網際網路上公開,但只有具備受信任 mTLS 憑證和工作負載 ID 的服務,才能存取閘道後方的服務,就像這些服務位於同一個網路一樣。

  1. 透過 CLUSTER_NAME_1 的東西向閘道公開服務。

    kubectl --kubeconfig=PATH_TO_KUBECONFIG_1 apply -n istio-system -f \
        asm/istio/expansion/expose-services.yaml
    
  2. 透過 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 服務部署至多叢集環境,以驗證跨叢集負載平衡功能是否正常運作。

啟用加入邊車容器功能

  1. 在每個叢集中建立範例命名空間。

    for CTX in ${CTX_1} ${CTX_2}
    do
        kubectl create --context=${CTX} namespace sample
    done
    
  2. 在建立的命名空間啟用加入邊車容器功能。

    建議做法:執行下列指令,將預設插入標籤套用至命名空間:

    for CTX in ${CTX_1} ${CTX_2}
    do
        kubectl label --context=${CTX} namespace sample \
            istio.io/rev- istio-injection=enabled --overwrite
    done
    

    建議您使用預設插入,但我們也支援修訂版本插入: 請按照下列操作說明:

    1. 使用下列指令,找出 istiod 的修訂版本標籤:

      kubectl get deploy -n istio-system -l app=istiod -o \
          jsonpath={.items[*].metadata.labels.'istio\.io\/rev'}'{"\n"}'
      
    2. 將修訂版本標籤套用至命名空間。在下列指令中,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 第 1 版和第 2 版部署至各個叢集

  1. 將 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
  2. 使用下列指令,確認 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 服務

  1. 將 Sleep 服務部署至兩個叢集。這個 Pod 會產生人工網路流量,用於示範:

    for CTX in ${CTX_1} ${CTX_2}
    do
        kubectl apply --context=${CTX} \
            -f ${SAMPLES_DIR}/samples/sleep/sleep.yaml -n sample
    done
    
  2. 等待各叢集中的 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 交替回覆:

  1. 呼叫 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
    ...
  2. 再次呼叫 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}