在不同网络上安装 Primary-Remote

请遵循本指南在cluster1主集群)上安装Istio控制平面,并配置cluster2远程集群)以使用cluster1中的控制平面。集群cluster1位于network1网络上,而cluster2位于network2网络上。这意味着跨集群边界的Pod之间没有直接连接。

在继续之前,请确保已完成开始之前下的步骤。

在此配置中,集群cluster1将观察两个集群中的API服务器以获取端点。通过这种方式,控制平面将能够为两个集群中的工作负载提供服务发现。

跨集群边界的服务工作负载通过专用的东西向流量网关间接通信。每个集群中的网关必须能够从另一个集群访问。

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

Primary and remote clusters on separate networks
位于不同网络上的主集群和远程集群

设置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
      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设置默认网络

通过向istio-system命名空间添加标签来设置cluster2的网络

$ kubectl --context="${CTX_CLUSTER2}" label namespace istio-system topology.istio.io/network=network2

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/network2
    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中Webhooks中的证书。

  • 启动命名空间控制器,该控制器在cluster2中的命名空间中写入配置映射。

要为cluster2提供API服务器访问权限,我们生成一个远程密钥并将其应用于cluster1

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

cluster2中安装东西向网关

与上面在cluster1中所做的一样,在cluster2中安装一个专用于东西向流量的网关并暴露用户服务。

压缩
$ @samples/multicluster/gen-eastwest-gateway.sh@ \
    --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

cluster1cluster2中暴露服务

由于集群位于不同的网络上,我们还需要在两个集群中的东西向网关上暴露所有用户服务(*.local)。虽然这些网关在互联网上是公开的,但它们后面的服务只能由具有受信任的mTLS证书和工作负载ID的服务访问,就像它们在同一个网络上一样。

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

恭喜!您已成功在不同网络上的主集群和远程集群之间安装了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}"
    
此信息是否有用?
您是否有任何改进建议?

感谢您的反馈!