跨网络主-从架构的安装

按照本指南,在 cluster1 主集群(primary cluster) 安装 Istio 控制平面, 并配置 cluster2 从集群(remote cluster)指向 cluster1 的控制平面。 集群 cluster1network1 网络上,而集群 cluster2network2 网络上。 所以跨集群边界的 Pod 之间,网络不能直接连通。

继续安装之前,请确保完成了准备工作中的步骤。

在此配置中,集群 cluster1 将监测两个集群 API Server 的服务端点。 以这种方式,控制平面就能为两个集群中的工作负载提供服务发现。

跨集群边界的服务负载,通过专用的东西向流量网关,以间接的方式通讯。 每个集群中的网关必须可以从其他集群访问。

cluster2 中的服务将通过相同的的东西向网关访问 cluster1 控制平面。

Primary and remote clusters on separate networks

Primary and remote clusters on separate networks

目前,从集群配置文档在从集群中安装 Istio 服务器,该服务器用来为集群中的工作负载注入 CA 和 webhook。 但是,服务发现会被指向主集群的控制平面。

后续版本将完全消除在从集群中安装 Istiod 的需求。请保持关注!

cluster1 设置缺省网络

创建命名空间 istio-system 之后,我们需要设置集群的网络:

  1. $ kubectl --context="${CTX_CLUSTER1}" get namespace istio-system && \
  2. kubectl --context="${CTX_CLUSTER1}" label namespace istio-system topology.istio.io/network=network1

cluster1 设为主集群

cluster1 创建 Istio 配置文件:

  1. $ cat <<EOF > cluster1.yaml
  2. apiVersion: install.istio.io/v1alpha1
  3. kind: IstioOperator
  4. spec:
  5. values:
  6. global:
  7. meshID: mesh1
  8. multiCluster:
  9. clusterName: cluster1
  10. network: network1
  11. EOF

将配置文件应用到 cluster1

  1. $ istioctl install --context="${CTX_CLUSTER1}" -f cluster1.yaml

cluster1 安装东西向网关

cluster1 安装专用的东西向流量网关。 默认情况下,此网关将被公开到互联网上。 生产系统可能需要额外的访问限制(即:通过防火墙规则)来防止外部攻击。 咨询你的云服务商,了解可用的选择。

Zip

  1. $ @samples/multicluster/gen-eastwest-gateway.sh@ \
  2. --mesh mesh1 --cluster cluster1 --network network1 | \
  3. istioctl --context="${CTX_CLUSTER1}" install -y -f -

如果随着版本修正已经安装控制面板,在 gen-eastwest-gateway.sh 命令中添加 --revision rev 标志。

等待东西向网关获取外部 IP 地址

  1. $ kubectl --context="${CTX_CLUSTER1}" get svc istio-eastwestgateway -n istio-system
  2. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  3. istio-eastwestgateway LoadBalancer 10.80.6.124 34.75.71.237 ... 51s

开放 cluster1 控制平面

安装 cluster2 之前,我们需要先开放 cluster1 的控制平面,以便 cluster2 中的服务能访问服务发现。

Zip

  1. $ kubectl apply --context="${CTX_CLUSTER1}" -f \
  2. @samples/multicluster/expose-istiod.yaml@

开放 cluster1 中的服务

因为集群位于不同的网络,我们需要开放两个集群的东西向网关上的所有用户服务(*.local)。 虽然此网关被公开到互联网,但它背后的服务只能被拥有可信 mTLS 证书和工作负载 ID 的服务访问, 就像它们处于同一个网络一样。

Zip

  1. $ kubectl --context="${CTX_CLUSTER1}" apply -n istio-system -f \
  2. @samples/multicluster/expose-services.yaml@

cluster2 设置缺省网络

命名空间 istio-system 创建之后,我们需要设置集群的网络:

  1. $ kubectl --context="${CTX_CLUSTER2}" get namespace istio-system && \
  2. kubectl --context="${CTX_CLUSTER2}" label namespace istio-system topology.istio.io/network=network2

启用 API Server 访问 cluster2 配置

在配置从集群之前,我们必须先把 cluster2 API Server 的访问权限赋予 cluster1 控制平面。 这将执行以下操作:

  • 开启控制平面的身份认证功能,以验证 cluster2 中工作负载的连接请求。如果没有 API Server 的访问权限,控制平面将会拒绝该请求。

  • cluster2 的服务端点开启服务发现。

为了能够访问 cluster2 API Server,我们要生成一个远程 Secret,并把它应用到 cluster1

  1. $ istioctl x create-remote-secret \
  2. --context="${CTX_CLUSTER2}" \
  3. --name=cluster2 | \
  4. kubectl apply -f - --context="${CTX_CLUSTER1}"

cluster2 设为从集群

保存 cluster1 东西向网关的地址。

  1. $ export DISCOVERY_ADDRESS=$(kubectl \
  2. --context="${CTX_CLUSTER1}" \
  3. -n istio-system get svc istio-eastwestgateway \
  4. -o jsonpath='{.status.loadBalancer.ingress[0].ip}')

现在,为 cluster2 创建一个从集群配置:

  1. $ cat <<EOF > cluster2.yaml
  2. apiVersion: install.istio.io/v1alpha1
  3. kind: IstioOperator
  4. spec:
  5. profile: remote
  6. values:
  7. global:
  8. meshID: mesh1
  9. multiCluster:
  10. clusterName: cluster2
  11. network: network2
  12. remotePilotAddress: ${DISCOVERY_ADDRESS}
  13. EOF

将此配置应用到 cluster2

  1. $ istioctl install --context="${CTX_CLUSTER2}" -f cluster2.yaml

cluster2 安装东西向网关

仿照上面 cluster1 的操作,在 cluster2 中安装专用于东西向流量的网关,并且开放用户服务。

Zip

  1. $ @samples/multicluster/gen-eastwest-gateway.sh@ \
  2. --mesh mesh1 --cluster cluster2 --network network2 | \
  3. istioctl --context="${CTX_CLUSTER2}" install -y -f -

等待东西向网关获取外部 IP 地址:

  1. $ kubectl --context="${CTX_CLUSTER2}" get svc istio-eastwestgateway -n istio-system
  2. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  3. istio-eastwestgateway LoadBalancer 10.0.12.121 34.122.91.98 ... 51s

开放 cluster2 中的服务

仿照上面 cluster1 的操作,通过东西向网关开放服务。

Zip

  1. $ kubectl --context="${CTX_CLUSTER2}" apply -n istio-system -f \
  2. @samples/multicluster/expose-services.yaml@

恭喜! 你在跨网络、主-从架构的集群上,成功的安装了 Istio 网格。

后续步骤

现在,你可以验证此次安装.