跨网络多主架构的安装

按照本指南,在 cluster1cluster2 两个集群上,安装 Istio 控制平面, 且将两者均设置为主集群(primary cluster)。 集群 cluster1network1 网络上,而集群 cluster2network2 网络上。 这意味着这些跨集群边界的 Pod 之间,网络不能直接连通。

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

在此配置中,cluster1cluster2 均监测两个集群 API Server 的服务端点。

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

跨网络的多主集群
跨网络的多主集群

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

Zip
$ @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 中的服务

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

Zip
$ 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

将 cluster2 设为主集群

cluster2 创建 Istio 配置文件:

$ cat <<EOF > cluster2.yaml
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  values:
    global:
      meshID: mesh1
      multiCluster:
        clusterName: cluster2
      network: network2
EOF

将配置文件应用到 cluster2

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

cluster2 安装东西向网关

仿照上面 cluster1 的操作,在 cluster2 安装专用于东西向流量的网关。

Zip
$ @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 的操作,通过东西向网关开放服务。

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

启用端点发现

cluster2 中安装一个提供 cluster1 API Server 访问权限的远程 Secret。

$ istioctl create-remote-secret \
  --context="${CTX_CLUSTER1}" \
  --name=cluster1 | \
  kubectl apply -f - --context="${CTX_CLUSTER2}"

cluster1 中安装一个提供 cluster2 API Server 访问权限的远程 Secret。

$ istioctl create-remote-secret \
  --context="${CTX_CLUSTER2}" \
  --name=cluster2 | \
  kubectl apply -f - --context="${CTX_CLUSTER1}"

恭喜! 您在跨网络多主架构的集群上,成功的安装了 Istio 网格。

后续步骤

现在,您可以验证此次安装

清理

  1. 卸载 cluster1 中的 Istio:

    $ istioctl uninstall --context="${CTX_CLUSTER1}" -y --purge
    $ kubectl delete ns istio-system --context="${CTX_CLUSTER1}"
    
  2. 卸载 cluster2 中的 Istio:

    $ istioctl uninstall --context="${CTX_CLUSTER2}" -y --purge
    $ kubectl delete ns istio-system --context="${CTX_CLUSTER2}"
    
这些信息有用吗?
您是否有更多建议和改进意见?

感谢您的反馈!