跨网络主-从架构的安装

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

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

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

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

    Primary and remote clusters on separate networks

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

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

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

    cluster1 设为主集群

    cluster1 创建 Istio 配置文件:

    1. $ cat <<EOF > cluster1.yaml
    2. apiVersion: install.istio.io/v1alpha1
    3. kind: IstioOperator
    4. spec:
    5. values:
    6. multiCluster:
    7. clusterName: cluster1
    8. network: network1
    9. EOF
    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

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

    开放 cluster1 中的服务

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

    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

    在配置从集群之前,我们必须先把 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 创建一个从集群配置:

    将此配置应用到 cluster2

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

    cluster2 安装东西向网关

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

    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

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

    Zip

    1. @samples/multicluster/expose-services.yaml@

    后续步骤

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