安裝主要-遠端

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

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

在此設定中,叢集 cluster1 將觀察兩個叢集中用於端點的 API 伺服器。這樣一來,控制平面就能夠為兩個叢集中的工作負載提供服務探索。

服務工作負載跨叢集邊界直接(Pod 對 Pod)通訊。

cluster2 中的服務將透過專用於東西向流量的閘道連線到 cluster1 中的控制平面。

Primary and remote clusters on the same network
相同網路上的主要和遠端叢集

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 設定為遠端

儲存 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/network1
    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。

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

$ 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}"
    
此資訊是否有用?
您有任何改進建議嗎?

感謝您的意見反應!