在不同網路上安裝多主控平面

依照本指南在 cluster1cluster2 上安裝 Istio 控制平面,使每個叢集都成為主要叢集。叢集 cluster1 位於 network1 網路上,而 cluster2 位於 network2 網路上。這表示跨越叢集邊界的 Pod 之間沒有直接連線。

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

在此配置中,cluster1cluster2 都會觀察每個叢集中的 API 伺服器以獲取端點。

跨叢集邊界的服務工作負載透過專用於東西向流量的專用閘道間接通信。每個叢集中的閘道必須可以從另一個叢集連線。

Multiple primary 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
EOF

將配置套用至 cluster1

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

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 中公開服務

由於叢集位於不同的網路上,我們需要在兩個叢集中的東西向閘道上公開所有服務 (*.local)。雖然此閘道在網際網路上公開,但只有具有信任的 mTLS 憑證和工作負載 ID 的服務才能存取其後面的服務,就像它們在同一個網路上一樣。

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

設定 cluster2 的預設網路

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

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

將 cluster2 設定為主控

cluster2 建立 Istio 配置

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

將配置套用至 cluster2

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

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

cluster2 中公開服務

如同我們在上面的 cluster1 中所做的那樣,透過東西向閘道公開服務。

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

啟用端點探索

cluster2 中安裝一個遠端密鑰,以提供對 cluster1 的 API 伺服器的存取權限。

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

cluster1 中安裝一個遠端密鑰,以提供對 cluster2 的 API 伺服器的存取權限。

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

恭喜! 您已成功在不同網路上的多個主叢集中安裝了 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}"
    
此資訊對您有幫助嗎?
您有任何改進建議嗎?

感謝您的回饋!