跨网络主-从架构的安装
按照本指南,在 cluster1
主集群(primary cluster) 安装 Istio 控制平面,
并配置 cluster2
从集群(remote cluster)指向 cluster1
的控制平面。
集群 cluster1
在 network1
网络上,而集群 cluster22
在 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
EOF
将配置文件应用到 cluster1
:
$ istioctl install --context="${CTX_CLUSTER1}" -f cluster1.yaml
在 cluster1
安装东西向网关
在 cluster1
安装专用的东西向流量网关。
默认情况下,此网关将被公开到互联网上。
生产系统可能需要额外的访问限制(即:通过防火墙规则)来防止外部攻击。
咨询你的云服务商,了解可用的选择。
$ @samples/multicluster/gen-eastwest-gateway.sh@ \
--mesh mesh1 --cluster cluster1 --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}" -f \
@samples/multicluster/expose-istiod.yaml@
开放 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
配置 API 服务器到 cluster2
的访问
在配置从集群之前,我们必须先把 cluster2
API 服务器的访问权限赋予 cluster1
控制平面。
这将执行以下操作:
开启控制平面的身份认证功能,以验证
cluster2
中工作负载的连接请求。如果没有 API 服务器的访问权限,控制平面将会拒绝该请求。在
cluster2
中开启服务发现的服务端点。
要提供到 cluster2
API 服务器的访问,我们要生成一个远程 secret,并把它应用到 cluster1
。
$ istioctl x create-remote-secret \
--context="${CTX_CLUSTER2}" \
--name=cluster2 | \
kubectl apply -f - --context="${CTX_CLUSTER1}"
将 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:
global:
meshID: mesh1
multiCluster:
clusterName: cluster2
network: network2
remotePilotAddress: ${DISCOVERY_ADDRESS}
EOF
将此配置应用到 cluster2
:
$ istioctl install --context="${CTX_CLUSTER2}" -f cluster2.yaml
在 cluster2
安装东西向网关
仿照上面 cluster1
的操作,在 cluster2
中安装专用于东西向流量的网关,并且开放用户服务。
$ @samples/multicluster/gen-eastwest-gateway.sh@ \
--mesh mesh1 --cluster cluster2 --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@
恭喜! 你在跨网络、主-从架构的集群上,成功的安装了 Istio 网格。
后续步骤
现在,你可以验证此次安装.