安裝主要-遠端
依照本指南在 cluster1
(主要叢集)上安裝 Istio 控制平面,並設定 cluster2
(遠端叢集)使用 cluster1
中的控制平面。這兩個叢集都位於 network1
網路上,這表示兩個叢集中的 Pod 之間有直接連線。
在繼續之前,請務必完成開始之前下的步驟。
在此設定中,叢集 cluster1
將觀察兩個叢集中用於端點的 API 伺服器。這樣一來,控制平面就能夠為兩個叢集中的工作負載提供服務探索。
服務工作負載跨叢集邊界直接(Pod 對 Pod)通訊。
cluster2
中的服務將透過專用於東西向流量的閘道連線到 cluster1
中的控制平面。
將 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 網格!
下一步
您現在可以驗證安裝。
清理
在
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}"