在不同網路安裝主叢集-遠端叢集
依照本指南在 cluster1
(主叢集)上安裝 Istio 控制平面,並設定 cluster2
(遠端叢集)以使用 cluster1
中的控制平面。叢集 cluster1
位於 network1
網路,而 cluster2
位於 network2
網路。這表示叢集邊界之間 Pod 沒有直接連線。
在繼續之前,請務必完成開始之前下的步驟。
在此組態中,叢集 cluster1
將觀察兩個叢集中 API 伺服器的端點。如此一來,控制平面就能為兩個叢集中的工作負載提供服務探索。
跨叢集邊界的工作負載服務會透過專用的東西向流量閘道間接進行通訊。每個叢集中的閘道必須可以從另一個叢集存取。
cluster2
中的服務將透過相同的東西向閘道連線到 cluster1
中的控制平面。
設定 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
在 cluster1
和 cluster2
中公開服務
由於叢集位於獨立的網路上,我們還需要將所有使用者服務 (*.local) 公開在兩個叢集中的東西向閘道上。雖然這些閘道在網際網路上是公開的,但它們背後的服務只能由具有信任 mTLS 憑證和工作負載 ID 的服務存取,就像它們位於同一網路上一樣。
$ kubectl --context="${CTX_CLUSTER1}" apply -n istio-system -f \
@samples/multicluster/expose-services.yaml@
恭喜! 您已成功在不同網路上的主叢集和遠端叢集之間安裝 Istio 網格!
後續步驟
您現在可以驗證安裝。
清理
在
cluster1
中解除安裝 Istio$ istioctl uninstall --context="${CTX_CLUSTER1}" -y --purge $ kubectl delete ns istio-system --context="${CTX_CLUSTER1}"
在
cluster2
中解除安裝 Istio$ istioctl uninstall --context="${CTX_CLUSTER2}" -y --purge $ kubectl delete ns istio-system --context="${CTX_CLUSTER2}"