在不同網路安裝主叢集-遠端叢集

依照本指南在 cluster1主叢集)上安裝 Istio 控制平面,並設定 cluster2遠端叢集)以使用 cluster1 中的控制平面。叢集 cluster1 位於 network1 網路,而 cluster2 位於 network2 網路。這表示叢集邊界之間 Pod 沒有直接連線。

在繼續之前,請務必完成開始之前下的步驟。

在此組態中,叢集 cluster1 將觀察兩個叢集中 API 伺服器的端點。如此一來,控制平面就能為兩個叢集中的工作負載提供服務探索。

跨叢集邊界的工作負載服務會透過專用的東西向流量閘道間接進行通訊。每個叢集中的閘道必須可以從另一個叢集存取。

cluster2 中的服務將透過相同的東西向閘道連線到 cluster1 中的控制平面。

Primary and remote clusters on separate networks
位於獨立網路上的主叢集和遠端叢集

設定 cluster1 的預設網路

如果已建立 istio-system 命名空間,我們需要在其中設定叢集的網路

$ kubectl --context="${CTX_CLUSTER1}" get namespace istio-system && \
  kubectl --context="${CTX_CLUSTER1}" label namespace istio-system topology.istio.io/network=network1

cluster1 設定為主叢集

cluster1 建立 Istio 設定

$ cat <<EOF > cluster1.yaml
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  values:
    global:
      meshID: mesh1
      multiCluster:
        clusterName: cluster1
      network: network1
      externalIstiod: true
EOF

將設定套用至 cluster1

$ istioctl install --context="${CTX_CLUSTER1}" -f cluster1.yaml

請注意,values.global.externalIstiod 已設定為 true。這使得安裝在 cluster1 上的控制平面也能作為其他遠端叢集的外部控制平面。啟用此功能後,istiod 將嘗試取得領導權鎖定,並管理將附加到它的適當註解遠端叢集(在本例中為 cluster2)。

cluster1 中安裝東西向閘道

cluster1 中安裝專用於東西向流量的閘道。預設情況下,此閘道將在網際網路上公開。生產系統可能需要額外的存取限制(例如,透過防火牆規則)以防止外部攻擊。請洽詢您的雲端供應商以瞭解有哪些選項可用。

壓縮
$ @samples/multicluster/gen-eastwest-gateway.sh@ \
    --network network1 | \
    istioctl --context="${CTX_CLUSTER1}" install -y -f -

等待為東西向閘道指派外部 IP 位址

$ kubectl --context="${CTX_CLUSTER1}" get svc istio-eastwestgateway -n istio-system
NAME                    TYPE           CLUSTER-IP    EXTERNAL-IP    PORT(S)   AGE
istio-eastwestgateway   LoadBalancer   10.80.6.124   34.75.71.237   ...       51s

cluster1 中公開控制平面

在我們可以在 cluster2 上安裝之前,我們需要先公開 cluster1 中的控制平面,以便 cluster2 中的服務能夠存取服務探索

壓縮
$ kubectl apply --context="${CTX_CLUSTER1}" -n istio-system -f \
    @samples/multicluster/expose-istiod.yaml@

設定 cluster2 的控制平面叢集

我們需要透過註解 istio-system 命名空間來識別應管理 cluster2 的外部控制平面叢集

$ kubectl --context="${CTX_CLUSTER2}" create namespace istio-system
$ kubectl --context="${CTX_CLUSTER2}" annotate namespace istio-system topology.istio.io/controlPlaneClusters=cluster1

topology.istio.io/controlPlaneClusters 命名空間註解設定為 cluster1,會指示在 cluster1 上的相同命名空間(在本例中為 istio-system)中執行的 istiod 在將 cluster2 附加為遠端叢集時管理 cluster2

設定 cluster2 的預設網路

透過將標籤新增至 istio-system 命名空間來設定 cluster2 的網路

$ kubectl --context="${CTX_CLUSTER2}" label namespace istio-system topology.istio.io/network=network2

cluster2 設定為遠端叢集

儲存 cluster1 東西向閘道的位址。

$ export DISCOVERY_ADDRESS=$(kubectl \
    --context="${CTX_CLUSTER1}" \
    -n istio-system get svc istio-eastwestgateway \
    -o jsonpath='{.status.loadBalancer.ingress[0].ip}')

現在在 cluster2 上建立遠端組態。

$ cat <<EOF > cluster2.yaml
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  profile: remote
  values:
    istiodRemote:
      injectionPath: /inject/cluster/cluster2/net/network2
    global:
      remotePilotAddress: ${DISCOVERY_ADDRESS}
EOF

將設定套用至 cluster2

$ istioctl install --context="${CTX_CLUSTER2}" -f cluster2.yaml

cluster2 作為 cluster1 的遠端叢集附加

若要將遠端叢集附加至其控制平面,我們授與 cluster1 中的控制平面存取 cluster2 中 API 伺服器的權限。這將執行下列動作

  • 啟用控制平面以驗證在 cluster2 中執行之工作負載的連線要求。若沒有 API 伺服器存取權,控制平面將拒絕這些要求。

  • 啟用探索在 cluster2 中執行的服務端點。

因為它已包含在 topology.istio.io/controlPlaneClusters 命名空間註解中,所以 cluster1 上的控制平面也會

  • 修補 cluster2 中 Webhook 的憑證。

  • 啟動命名空間控制器,它會在 cluster2 的命名空間中寫入 configmap。

若要提供 API 伺服器對 cluster2 的存取權,我們會產生一個遠端密碼並將其套用至 cluster1

$ istioctl create-remote-secret \
    --context="${CTX_CLUSTER2}" \
    --name=cluster2 | \
    kubectl apply -f - --context="${CTX_CLUSTER1}"

cluster2 中安裝東西向閘道

如同我們在上面對 cluster1 所做的那樣,在 cluster2 中安裝專用於東西向流量並公開使用者服務的閘道。

壓縮
$ @samples/multicluster/gen-eastwest-gateway.sh@ \
    --network network2 | \
    istioctl --context="${CTX_CLUSTER2}" install -y -f -

等待為東西向閘道指派外部 IP 位址

$ kubectl --context="${CTX_CLUSTER2}" get svc istio-eastwestgateway -n istio-system
NAME                    TYPE           CLUSTER-IP    EXTERNAL-IP    PORT(S)   AGE
istio-eastwestgateway   LoadBalancer   10.0.12.121   34.122.91.98   ...       51s

cluster1cluster2 中公開服務

由於叢集位於獨立的網路上,我們還需要將所有使用者服務 (*.local) 公開在兩個叢集中的東西向閘道上。雖然這些閘道在網際網路上是公開的,但它們背後的服務只能由具有信任 mTLS 憑證和工作負載 ID 的服務存取,就像它們位於同一網路上一樣。

壓縮
$ kubectl --context="${CTX_CLUSTER1}" apply -n istio-system -f \
    @samples/multicluster/expose-services.yaml@

恭喜! 您已成功在不同網路上的主叢集和遠端叢集之間安裝 Istio 網格!

後續步驟

您現在可以驗證安裝

清理

  1. cluster1 中解除安裝 Istio

    $ istioctl uninstall --context="${CTX_CLUSTER1}" -y --purge
    $ kubectl delete ns istio-system --context="${CTX_CLUSTER1}"
    
  2. cluster2 中解除安裝 Istio

    $ istioctl uninstall --context="${CTX_CLUSTER2}" -y --purge
    $ kubectl delete ns istio-system --context="${CTX_CLUSTER2}"
    
這項資訊對您有幫助嗎?
您是否有任何改進建議?

感謝您的回饋!