安装主-远程集群
按照本指南在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
中安装一个专用于东西向流量的网关。默认情况下,此网关将在 Internet 上公开。生产系统可能需要额外的访问限制(例如,通过防火墙规则)来防止外部攻击。请咨询您的云供应商以了解可用的选项。
$ @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}"