×

关于多集群网格拓扑

在多集群网格拓扑中,您可以在多个 OpenShift Container Platform 集群中安装和管理单个 Istio 网格,从而实现服务之间的通信和服务发现。两个因素决定了多集群网格拓扑:控制平面拓扑和网络拓扑。每种拓扑都有两种选择。因此,共有四种可能的多种集群网格拓扑配置。

  • 多主单网络:结合了多主控制平面拓扑和单网络网络拓扑模型。

  • 多主多网络:结合了多主控制平面拓扑和多网络网络拓扑模型。

  • 主从单网络:结合了主从控制平面拓扑和单网络网络拓扑模型。

  • 主从多网络:结合了主从控制平面拓扑和多网络网络拓扑模型。

控制平面拓扑模型

多集群网格必须使用以下控制平面拓扑之一

  • 多主:在此配置中,控制平面驻留在每个集群上。每个控制平面都观察所有其他集群中的 API 服务器以获取服务和端点。

  • 主从:在此配置中,控制平面仅驻留在一个集群上,称为主集群。在任何其他集群(称为远程集群)上都不会运行控制平面。主集群上的控制平面发现服务和端点,并为所有集群中的工作负载配置 sidecar 代理。

网络拓扑模型

多集群网格必须使用以下网络拓扑之一

  • 单网络:所有集群都驻留在同一网络上,并且所有集群中的服务之间都存在直接连接。无需使用网关即可跨集群边界进行服务间通信。

  • 多网络:集群驻留在不同的网络上,服务之间没有直接连接。必须使用网关才能实现跨网络边界的通信。

多集群配置概述

要配置多集群拓扑,您必须执行以下操作

  • 为每个集群安装 OpenShift Service Mesh Operator。

  • 创建或访问每个集群的根证书和中间证书。

  • 应用每个集群的安全证书。

  • 为每个集群安装 Istio。

为多集群拓扑创建证书

为两个集群创建根和中间证书颁发机构 (CA) 证书。

前提条件
  • 您已在本地安装 OpenSSL。

步骤
  1. 创建根 CA 证书

    1. 通过运行以下命令创建根证书的密钥

      $ openssl genrsa -out root-key.pem 4096
    2. 为根 CA 证书创建一个名为 `root-ca.conf` 的 OpenSSL 配置证书文件

      根证书配置示例文件
      encrypt_key = no
      prompt = no
      utf8 = yes
      default_md = sha256
      default_bits = 4096
      req_extensions = req_ext
      x509_extensions = req_ext
      distinguished_name = req_dn
      [ req_ext ]
      subjectKeyIdentifier = hash
      basicConstraints = critical, CA:true
      keyUsage = critical, digitalSignature, nonRepudiation, keyEncipherment, keyCertSign
      [ req_dn ]
      O = Istio
      CN = Root CA
    3. 通过运行以下命令创建证书签名请求

      $ openssl req -sha256 -new -key root-key.pem \
        -config root-ca.conf \
        -out root-cert.csr
    4. 通过运行以下命令创建共享根证书

      $ openssl x509 -req -sha256 -days 3650 \
        -signkey root-key.pem \
        -extensions req_ext -extfile root-ca.conf \
        -in root-cert.csr \
        -out root-cert.pem
  2. 为 East 集群创建中间 CA 证书

    1. 通过运行以下命令创建一个名为 `east` 的目录

      $ mkdir east
    2. 通过运行以下命令为 East 集群的中间证书创建一个密钥

      $ openssl genrsa -out east/ca-key.pem 4096
    3. 在 `east/` 目录中创建一个名为 `intermediate.conf` 的 OpenSSL 配置文件,用于 East 集群的中间证书。复制以下示例文件并将其保存在本地

      配置示例文件
      [ req ]
      encrypt_key = no
      prompt = no
      utf8 = yes
      default_md = sha256
      default_bits = 4096
      req_extensions = req_ext
      x509_extensions = req_ext
      distinguished_name = req_dn
      [ req_ext ]
      subjectKeyIdentifier = hash
      basicConstraints = critical, CA:true, pathlen:0
      keyUsage = critical, digitalSignature, nonRepudiation, keyEncipherment, keyCertSign
      subjectAltName=@san
      [ san ]
      DNS.1 = istiod.istio-system.svc
      [ req_dn ]
      O = Istio
      CN = Intermediate CA
      L = east
    4. 通过运行以下命令创建证书签名请求

      $ openssl req -new -config east/intermediate.conf \
         -key east/ca-key.pem \
         -out east/cluster-ca.csr
    5. 通过运行以下命令为 East 集群创建中间 CA 证书

      $ openssl x509 -req -sha256 -days 3650 \
         -CA root-cert.pem \
         -CAkey root-key.pem -CAcreateserial \
         -extensions req_ext -extfile east/intermediate.conf \
         -in east/cluster-ca.csr \
         -out east/ca-cert.pem
    6. 通过运行以下命令从 East 集群的中间和根 CA 证书创建证书链

      $ cat east/ca-cert.pem root-cert.pem > east/cert-chain.pem && cp root-cert.pem east
  3. 为 West 集群创建中间 CA 证书

    1. 通过运行以下命令创建一个名为 `west` 的目录

      $ mkdir west
    2. 运行以下命令为 West 集群的中间证书创建密钥

      $ openssl genrsa -out west/ca-key.pem 4096
    3. west/ 目录中为 West 集群的中间证书创建一个名为 intermediate.conf 的 OpenSSL 配置文件。复制以下示例文件并将其保存到本地

      配置示例文件
      [ req ]
      encrypt_key = no
      prompt = no
      utf8 = yes
      default_md = sha256
      default_bits = 4096
      req_extensions = req_ext
      x509_extensions = req_ext
      distinguished_name = req_dn
      [ req_ext ]
      subjectKeyIdentifier = hash
      basicConstraints = critical, CA:true, pathlen:0
      keyUsage = critical, digitalSignature, nonRepudiation, keyEncipherment, keyCertSign
      subjectAltName=@san
      [ san ]
      DNS.1 = istiod.istio-system.svc
      [ req_dn ]
      O = Istio
      CN = Intermediate CA
      L = west
    4. 通过运行以下命令创建证书签名请求

      $ openssl req -new -config west/intermediate.conf \
         -key west/ca-key.pem \
         -out west/cluster-ca.csr
    5. 运行以下命令创建证书

      $ openssl x509 -req -sha256 -days 3650 \
         -CA root-cert.pem \
         -CAkey root-key.pem -CAcreateserial \
         -extensions req_ext -extfile west/intermediate.conf \
         -in west/cluster-ca.csr \
         -out west/ca-cert.pem
    6. 运行以下命令创建证书链

      $ cat west/ca-cert.pem root-cert.pem > west/cert-chain.pem && cp root-cert.pem west

将证书应用于多集群拓扑

将根和中间证书颁发机构 (CA) 证书应用于多集群拓扑中的集群。

在此过程中,CLUSTER1 是 East 集群,CLUSTER2 是 West 集群。

前提条件
  • 您可以访问两个具有外部负载均衡器支持的 OpenShift Container Platform 集群。

  • 您已为每个集群创建了根 CA 证书和中间 CA 证书,或者其他人已为您提供这些证书。

步骤
  1. 将证书应用于多集群拓扑中的 East 集群

    1. 运行以下命令登录到 East 集群

      $ oc login -u https://<east_cluster_api_server_url>
    2. 运行以下命令设置包含 East 集群 oc 命令上下文的环境变量

      $ export CTX_CLUSTER1=$(oc config current-context)
    3. 运行以下命令创建一个名为 istio-system 的项目

      $ oc get project istio-system --context "${CTX_CLUSTER1}" || oc new-project istio-system --context "${CTX_CLUSTER1}"
    4. 运行以下命令配置 Istio 使用 network1 作为 East 集群上 Pod 的默认网络

      $ oc --context "${CTX_CLUSTER1}" label namespace istio-system topology.istio.io/network=network1
    5. 运行以下命令在 East 集群上创建 CA 证书、证书链和 Istio 的私钥

      $ oc get secret -n istio-system --context "${CTX_CLUSTER1}" cacerts || oc create secret generic cacerts -n istio-system --context "${CTX_CLUSTER1}" \
        --from-file=east/ca-cert.pem \
        --from-file=east/ca-key.pem \
        --from-file=east/root-cert.pem \
        --from-file=east/cert-chain.pem

      如果您按照“为多集群网格创建证书”中的说明进行操作,您的证书将位于 east/ 目录中。如果您的证书位于其他目录中,请相应修改语法。

  2. 将证书应用于多集群拓扑中的 West 集群

    1. 运行以下命令登录到 West 集群

      $ oc login -u https://<west_cluster_api_server_url>
    2. 运行以下命令设置包含 West 集群 oc 命令上下文的环境变量

      $ export CTX_CLUSTER2=$(oc config current-context)
    3. 运行以下命令创建一个名为 istio-system 的项目

      $ oc get project istio-system --context "${CTX_CLUSTER2}" || oc new-project istio-system --context "${CTX_CLUSTER2}"
    4. 运行以下命令配置 Istio 使用 network2 作为 West 集群上 Pod 的默认网络

      $ oc --context "${CTX_CLUSTER2}" label namespace istio-system topology.istio.io/network=network2
    5. 运行以下命令在 West 集群上创建 Istio 的 CA 证书密钥

      $ oc get secret -n istio-system --context "${CTX_CLUSTER2}" cacerts || oc create secret generic cacerts -n istio-system --context "${CTX_CLUSTER2}" \
        --from-file=west/ca-cert.pem \
        --from-file=west/ca-key.pem \
        --from-file=west/root-cert.pem \
        --from-file=west/cert-chain.pem

      如果您按照“为多集群网格创建证书”中的说明进行操作,您的证书将位于 west/ 目录中。如果证书位于其他目录中,请相应修改语法。

后续步骤

在构成网格拓扑的所有集群上安装 Istio。

安装多主多网络网格

在两个 OpenShift Container Platform 集群上安装多主多网络拓扑中的 Istio。

在此过程中,CLUSTER1 是 East 集群,CLUSTER2 是 West 集群。

您可以将这些说明适用于跨越两个以上集群的网格。

前提条件
  • 您已在构成网格的所有集群上安装了 OpenShift Service Mesh 3 运算符。

  • 您已完成“为多集群网格创建证书”。

  • 您已完成“将证书应用于多集群拓扑”。

  • 您已创建 Istio 容器网络接口 (CNI) 资源。

  • 您已在可用于运行这些说明的笔记本电脑上安装了 istioctl

步骤
  1. 运行以下命令创建一个 ISTIO_VERSION 环境变量,该变量定义要安装的 Istio 版本

    $ export ISTIO_VERSION=1.24.1
  2. 在 East 集群上安装 Istio

    1. 运行以下命令在 East 集群上创建 Istio 资源

      $ cat <<EOF | oc --context "${CTX_CLUSTER1}" apply -f -
      apiVersion: sailoperator.io/v1alpha1
      kind: Istio
      metadata:
        name: default
      spec:
        version: v${ISTIO_VERSION}
        namespace: istio-system
        values:
          global:
            meshID: mesh1
            multiCluster:
              clusterName: cluster1
            network: network1
      EOF
    2. 运行以下命令等待控制平面返回 Ready 状态条件

      $ oc --context "${CTX_CLUSTER1}" wait --for condition=Ready istio/default --timeout=3m
    3. 运行以下命令在 East 集群上创建 East-West 网关

      $ oc --context "${CTX_CLUSTER1}" apply -f https://raw.githubusercontent.com/istio-ecosystem/sail-operator/main/docs/multicluster/east-west-gateway-net1.yaml
    4. 运行以下命令通过网关公开服务

      $ oc --context "${CTX_CLUSTER1}" apply -n istio-system -f https://raw.githubusercontent.com/istio-ecosystem/sail-operator/main/docs/multicluster/expose-services.yaml
  3. 在 West 集群上安装 Istio

    1. 运行以下命令在 West 集群上创建 Istio 资源

      $ cat <<EOF | oc --context "${CTX_CLUSTER2}" apply -f -
      apiVersion: sailoperator.io/v1alpha1
      kind: Istio
      metadata:
        name: default
      spec:
        version: v${ISTIO_VERSION}
        namespace: istio-system
        values:
          global:
            meshID: mesh1
            multiCluster:
              clusterName: cluster2
            network: network2
      EOF
    2. 运行以下命令等待控制平面返回 Ready 状态条件

      $ oc --context "${CTX_CLUSTER2}" wait --for condition=Ready istio/default --timeout=3m
    3. 运行以下命令在 West 集群上创建 East-West 网关

      $ oc --context "${CTX_CLUSTER2}" apply -f https://raw.githubusercontent.com/istio-ecosystem/sail-operator/main/docs/multicluster/east-west-gateway-net2.yaml
    4. 运行以下命令通过网关公开服务

      $ oc --context "${CTX_CLUSTER2}" apply -n istio-system -f https://raw.githubusercontent.com/istio-ecosystem/sail-operator/main/docs/multicluster/expose-services.yaml
  4. 运行以下命令在 East 集群上安装远程密钥,该密钥提供对 West 集群上 API 服务器的访问权限

    $ istioctl create-remote-secret \
      --context="${CTX_CLUSTER2}" \
      --name=cluster2 | \
      oc --context="${CTX_CLUSTER1}" apply -f -
  5. 运行以下命令在 West 集群上安装远程密钥,该密钥提供对 East 集群上 API 服务器的访问权限

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

验证多集群拓扑

在两个 OpenShift Container Platform 集群上的多集群拓扑上部署示例应用程序并验证流量。

在此过程中,CLUSTER1 是 East 集群,CLUSTER2 是 West 集群。

前提条件
  • 您已在构成网格的所有集群上安装了 OpenShift Service Mesh 运算符。

  • 您已完成“为多集群网格创建证书”。

  • 您已完成“将证书应用于多集群拓扑”。

  • 您已创建 Istio 容器网络接口 (CNI) 资源。

  • 您已在将用于运行这些说明的笔记本电脑上安装了 istioctl

  • 您已安装多集群拓扑。

步骤
  1. 在 East 集群上部署示例应用程序

    1. 运行以下命令在 East 集群上创建一个示例应用程序命名空间

      $ oc --context "${CTX_CLUSTER1}" get project sample || oc --context="${CTX_CLUSTER1}" new-project sample
    2. 运行以下命令为应用程序命名空间添加标签以支持 sidecar 注射

      $ oc --context="${CTX_CLUSTER1}" label namespace sample istio-injection=enabled
    3. 部署 helloworld 应用程序

      1. 运行以下命令创建 helloworld 服务

        $ oc --context="${CTX_CLUSTER1}" apply \
          -f https://raw.githubusercontent.com/istio/istio/${ISTIO_VERSION}/samples/helloworld/helloworld.yaml \
          -l service=helloworld -n sample
      2. 运行以下命令创建 helloworld-v1 部署

        $ oc --context="${CTX_CLUSTER1}" apply \
          -f https://raw.githubusercontent.com/istio/istio/${ISTIO_VERSION}/samples/helloworld/helloworld.yaml \
          -l version=v1 -n sample
    4. 运行以下命令部署 sleep 应用程序

      $ oc --context="${CTX_CLUSTER1}" apply \
        -f https://raw.githubusercontent.com/istio/istio/${ISTIO_VERSION}/samples/sleep/sleep.yaml -n sample
    5. 运行以下命令等待 East 集群上的 helloworld 应用程序返回 Ready 状态条件

      $ oc --context="${CTX_CLUSTER1}" wait --for condition=available -n sample deployment/helloworld-v1
    6. 运行以下命令等待 East 集群上的 sleep 应用程序返回 Ready 状态条件

      $ oc --context="${CTX_CLUSTER1}" wait --for condition=available -n sample deployment/sleep
  2. 在 West 集群上部署示例应用程序

    1. 运行以下命令在 West 集群上创建一个示例应用程序命名空间

      $ oc --context "${CTX_CLUSTER2}" get project sample || oc --context="${CTX_CLUSTER2}" new-project sample
    2. 运行以下命令为应用程序命名空间添加标签以支持 sidecar 注射

      $ oc --context="${CTX_CLUSTER2}" label namespace sample istio-injection=enabled
    3. 部署 helloworld 应用程序

      1. 运行以下命令创建 helloworld 服务

        $ oc --context="${CTX_CLUSTER2}" apply \
          -f https://raw.githubusercontent.com/istio/istio/${ISTIO_VERSION}/samples/helloworld/helloworld.yaml \
          -l service=helloworld -n sample
      2. 运行以下命令创建 helloworld-v2 部署

        $ oc --context="${CTX_CLUSTER2}" apply \
          -f https://raw.githubusercontent.com/istio/istio/${ISTIO_VERSION}/samples/helloworld/helloworld.yaml \
          -l version=v2 -n sample
    4. 运行以下命令部署 sleep 应用程序

      $ oc --context="${CTX_CLUSTER2}" apply \
        -f https://raw.githubusercontent.com/istio/istio/${ISTIO_VERSION}/samples/sleep/sleep.yaml -n sample
    5. 运行以下命令等待 West 集群上的 helloworld 应用程序返回 Ready 状态条件

      $ oc --context="${CTX_CLUSTER2}" wait --for condition=available -n sample deployment/helloworld-v2
    6. 运行以下命令等待 West 集群上的 sleep 应用程序返回 Ready 状态条件

      $ oc --context="${CTX_CLUSTER2}" wait --for condition=available -n sample deployment/sleep
验证集群之间的流量
  1. 对于 East 集群,运行以下命令向 helloworld 服务发送 10 个请求

    $ for i in {0..9}; do \
      oc --context="${CTX_CLUSTER1}" exec -n sample deploy/sleep -c sleep -- curl -sS helloworld.sample:5000/hello; \
    done

    验证您是否看到来自两个集群的响应。这意味着可以在响应中看到服务的版本 1 和版本 2。

  2. 对于 West 集群,发送 10 个请求到 helloworld 服务

    $ for i in {0..9}; do \
      oc --context="${CTX_CLUSTER2}" exec -n sample deploy/sleep -c sleep -- curl -sS helloworld.sample:5000/hello; \
    done

    验证您是否看到来自两个集群的响应。这意味着可以在响应中看到服务的版本 1 和版本 2。

从开发环境中删除多集群拓扑

在开发环境中试验多集群功能后,从所有集群中删除多集群拓扑。

在此过程中,CLUSTER1 是 East 集群,CLUSTER2 是 West 集群。

前提条件
  • 您已安装多集群拓扑。

步骤
  1. 运行以下命令从开发环境的 East 集群中删除 Istio 和示例应用程序

    $ oc --context="${CTX_CLUSTER1}" delete istio/default ns/istio-system ns/sample ns/istio-cni
  2. 运行以下命令从开发环境的 West 集群中删除 Istio 和示例应用程序

    $ oc --context="${CTX_CLUSTER2}" delete istio/default ns/istio-system ns/sample ns/istio-cni

安装主远程多网络网格

在两个OpenShift Container Platform集群上,以主集群-远程集群的多网络拓扑结构安装Istio。

在此过程中,CLUSTER1为东部集群,CLUSTER2为西部集群。东部集群为主集群,西部集群为远程集群。

您可以将这些说明适用于跨越两个以上集群的网格。

前提条件
  • 您已在构成网格的所有集群上安装了 OpenShift Service Mesh 3 运算符。

  • 您已完成“为多集群网格创建证书”。

  • 您已完成“将证书应用于多集群拓扑”。

  • 您已创建 Istio 容器网络接口 (CNI) 资源。

  • 您已在将用于运行这些说明的笔记本电脑上安装了 istioctl

步骤
  1. 运行以下命令创建一个 ISTIO_VERSION 环境变量,该变量定义要安装的 Istio 版本

    $ export ISTIO_VERSION=1.24.1
  2. 在 East 集群上安装 Istio

    1. 运行以下命令设置东部集群的默认网络

      $ oc --context="${CTX_CLUSTER1}" label namespace istio-system topology.istio.io/network=network1
    2. 运行以下命令在 East 集群上创建 Istio 资源

      $ cat <<EOF | oc --context "${CTX_CLUSTER1}" apply -f -
      apiVersion: sailoperator.io/v1alpha1
      kind: Istio
      metadata:
        name: default
      spec:
        version: v${ISTIO_VERSION}
        namespace: istio-system
        values:
          global:
            meshID: mesh1
            multiCluster:
              clusterName: cluster1
            network: network1
            externalIstiod: true (1)
      EOF
      1 这使得安装在东部集群上的控制平面可以作为其他远程集群的外部控制平面。
    3. 运行以下命令等待控制平面返回“就绪”状态条件

      $ oc --context "${CTX_CLUSTER1}" wait --for condition=Ready istio/default --timeout=3m
    4. 运行以下命令在 East 集群上创建 East-West 网关

      $ oc --context "${CTX_CLUSTER1}" apply -f https://raw.githubusercontent.com/istio-ecosystem/sail-operator/main/docs/multicluster/east-west-gateway-net1.yaml
    5. 通过网关公开控制平面,以便西部集群中的服务可以访问控制平面,运行以下命令

      $ oc --context "${CTX_CLUSTER1}" apply -n istio-system -f https://raw.githubusercontent.com/istio-ecosystem/sail-operator/main/docs/multicluster/expose-istiod.yaml
    6. 通过网关公开应用程序服务,运行以下命令

      $ oc --context "${CTX_CLUSTER1}" apply -n istio-system -f https://raw.githubusercontent.com/istio-ecosystem/sail-operator/main/docs/multicluster/expose-services.yaml
  3. 在 West 集群上安装 Istio

    1. 运行以下命令保存运行在东部集群中的东西向网关的IP地址

      $ export DISCOVERY_ADDRESS=$(oc --context="${CTX_CLUSTER1}" \
          -n istio-system get svc istio-eastwestgateway \
          -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
    2. 运行以下命令在 West 集群上创建 Istio 资源

      $ cat <<EOF | oc --context "${CTX_CLUSTER2}" apply -f -
      apiVersion: sailoperator.io/v1alpha1
      kind: Istio
      metadata:
        name: default
      spec:
        version: v${ISTIO_VERSION}
        namespace: istio-system
        profile: remote
        values:
          istiodRemote:
            injectionPath: /inject/cluster/cluster2/net/network2
          global:
            remotePilotAddress: ${DISCOVERY_ADDRESS}
      EOF
    3. 使用以下命令注释西部集群中的istio-system命名空间,以便它由东部集群中的控制平面管理

      $ oc --context="${CTX_CLUSTER2}" annotate namespace istio-system topology.istio.io/controlPlaneClusters=cluster1
    4. 运行以下命令设置西部集群的默认网络

      $ oc --context="${CTX_CLUSTER2}" label namespace istio-system topology.istio.io/network=network2
    5. 运行以下命令在 East 集群上安装远程密钥,该密钥提供对 West 集群上 API 服务器的访问权限

      $ istioctl create-remote-secret \
        --context="${CTX_CLUSTER2}" \
        --name=cluster2 | \
        oc --context="${CTX_CLUSTER1}" apply -f -
    6. 运行以下命令等待Istio资源返回“就绪”状态条件

      $ oc --context "${CTX_CLUSTER2}" wait --for condition=Ready istio/default --timeout=3m
    7. 运行以下命令在 West 集群上创建 East-West 网关

      $ oc --context "${CTX_CLUSTER2}" apply -f https://raw.githubusercontent.com/istio-ecosystem/sail-operator/main/docs/multicluster/east-west-gateway-net2.yaml

      由于西部集群安装了远程配置文件,因此公开东部集群上的应用程序服务会在两个集群的东西向网关上公开这些服务。