×

联邦概述

联邦是一组功能,允许您在独立网格之间连接服务,从而允许跨多个不同的管理域使用服务网格功能,例如身份验证、授权和流量管理。

实现联邦网格允许您运行、管理和观察跨多个 OpenShift 集群运行的单个服务网格。Red Hat OpenShift 服务网格联邦采用了一种针对服务网格多集群实现的有见地的方案,该方案假定网格之间具有最小信任。

服务网格联邦假设每个网格都是单独管理的,并保留其自己的管理员。默认行为是不允许通信,并且网格之间不共享任何信息。网格之间信息的共享是基于显式选择加入的。除非已配置共享,否则在联邦网格中不会共享任何内容。支持功能(如证书生成、指标和跟踪收集)保留在其各自的网格中。

您可以在每个服务网格上配置ServiceMeshControlPlane,以专门为联邦创建入口和出口网关,并为网格指定信任域。

联邦还涉及创建其他联邦文件。以下资源用于配置两个或多个网格之间的联邦。

  • **ServiceMeshPeer** 资源声明一对服务网格之间的联邦。

  • **ExportedServiceSet** 资源声明网格中的一个或多个服务可供对等网格使用。

  • **ImportedServiceSet** 资源声明对等网格导出的哪些服务将导入到网格中。

联邦特性

Red Hat OpenShift 服务网格联邦方法连接网格的特性包括:

  • 支持每个网格的公共根证书。

  • 支持每个网格的不同根证书。

  • 网格管理员必须手动为联邦网格之外的网格配置证书链、服务发现端点、信任域等。

  • 仅导出/导入您希望在网格之间共享的服务。

    • 默认为不与联邦中的其他网格共享已部署工作负载的信息。可以导出服务以使其对其他网格可见,并允许来自其自身网格之外的工作负载的请求。

    • 已导出的服务可以导入到另一个网格,使该网格上的工作负载能够向导入的服务发送请求。

  • 始终加密网格之间的通信。

  • 支持在本地部署的工作负载和联邦中另一个网格中部署的工作负载之间配置负载均衡。

当一个网格加入另一个网格时,它可以执行以下操作:

  • 向联邦网格提供关于自身的信息。

  • 了解联邦网格的信任详细信息。

  • 向联邦网格提供有关其自身导出服务的的信息。

  • 了解联邦网格导出的服务信息。

联邦安全

Red Hat OpenShift Service Mesh 联邦采用一种明确的策略来实现服务网格的多集群部署,该策略假设网格之间信任度最低。数据安全是作为联邦功能的一部分内置的。

  • 每个网格都被视为具有唯一管理的唯一租户。

  • 您为联邦中的每个网格创建一个唯一的信任域。

  • 联邦网格之间的流量使用双向传输层安全 (mTLS) 自动加密。

  • Kiali 图表仅显示您的网格和您已导入的服务。您无法看到尚未导入到您的网格中的其他网格或服务。

联邦限制

Red Hat OpenShift Service Mesh 加入网格的联邦方法具有以下限制:

  • 在 OpenShift Dedicated 上不支持网格联邦。

联邦先决条件

Red Hat OpenShift Service Mesh 加入网格的联邦方法具有以下先决条件:

  • 两个或多个 OpenShift Dedicated 4.6 或更高版本的集群。

  • 联邦功能在 Red Hat OpenShift Service Mesh 2.1 或更高版本中引入。您必须在要加入联邦的每个网格上安装 Red Hat OpenShift Service Mesh 2.1 或更高版本的 Operator。

  • 您必须在要加入联邦的每个网格上部署 2.1 或更高版本的 `ServiceMeshControlPlane`。

  • 您必须将负载均衡器配置为支持与联邦网关关联的服务,以支持原始 TLS 流量。联邦流量包括用于发现的 HTTPS 和用于服务流量的原始加密 TCP。

  • 在您可以导出和导入要向其他网格公开的服务之前,应先部署这些服务。但是,这不是严格的要求。您可以指定尚不存在的要导出/导入的服务名称。当您部署在 `ExportedServiceSet` 和 `ImportedServiceSet` 中命名的服务时,它们将自动可用以进行导出/导入。

规划您的网格联邦

在开始配置网格联邦之前,您应该花一些时间规划您的实现。

  • 您计划在联邦中加入多少个网格?您可能希望从数量有限的网格开始,例如两个或三个。

  • 您计划对每个网格使用什么命名约定?预定义的命名约定将有助于配置和故障排除。本文档中的示例对每个网格使用不同的颜色。您应该确定一个命名约定,这将帮助您确定谁拥有和管理每个网格,以及以下联邦资源:

    • 集群名称

    • 集群网络名称

    • 网格名称和命名空间

    • 联邦入口网关

    • 联邦出口网关

    • 安全信任域

      联邦中的每个网格都必须具有其自身的唯一信任域。

  • 您计划将每个网格中的哪些服务导出到联邦网格?可以单独导出每个服务,或者您可以指定标签或使用通配符。

    • 您是否要为服务命名空间使用别名?

    • 您是否要为导出的服务使用别名?

  • 每个网格计划导入哪些导出的服务?每个网格仅导入其需要的服务。

    • 您是否要为导入的服务使用别名?

跨集群的网格联邦

要将一个 OpenShift Service Mesh 实例与在另一个集群中运行的实例连接起来,其过程与连接在同一集群中部署的两个网格的过程没有什么不同。但是,一个网格的入口网关必须能够从另一个网格访问。确保这一点的一种方法是,如果集群支持此类型的服务,则将网关服务配置为 `LoadBalancer` 服务。

服务必须通过在 OSI 模型的第 4 层运行的负载均衡器公开。

在裸机上运行的集群上公开联邦入口

如果集群在裸机上运行并完全支持 `LoadBalancer` 服务,则应将入口网关 `Service` 对象的 `.status.loadBalancer.ingress.ip` 字段中找到的 IP 地址指定为 `ServiceMeshPeer` 对象的 `.spec.remote.addresses` 字段中的条目之一。

如果集群不支持 `LoadBalancer` 服务,如果节点可以从运行另一个网格的集群访问,则可以使用 `NodePort` 服务。在 `ServiceMeshPeer` 对象中,在 `.spec.remote.addresses` 字段中指定节点的 IP 地址,并在 `.spec.remote.discoveryPort` 和 `.spec.remote.servicePort` 字段中指定服务的节点端口。

在 Google Cloud Platform (GCP) 上公开联邦入口

在 Google Cloud Platform 上,只需将服务类型设置为 `LoadBalancer` 即可使网格联邦正常运行。

应将入口网关 `Service` 对象的 `.status.loadBalancer.ingress.ip` 字段中找到的 IP 地址指定为 `ServiceMeshPeer` 对象的 `.spec.remote.addresses` 字段中的条目之一。

联邦实施清单

联邦服务网格涉及以下活动:

  • 配置要进行联邦的集群之间的网络。

    • 将支持与联邦网关关联的服务的负载均衡器配置为支持原始 TLS 流量。

  • 在您的每个集群中安装 Red Hat OpenShift Service Mesh 2.1 或更高版本的 Operator。

  • 将 2.1 或更高版本的 `ServiceMeshControlPlane` 部署到您的每个集群。

  • 为要加入联邦的每个网格配置用于联邦的 SMCP。

    • 为您要与其进行联邦的每个网格创建一个联邦出口网关。

    • 为您要与其进行联邦的每个网格创建一个联邦入口网关。

    • 配置唯一的信任域。

  • 通过为每个网格对创建 `ServiceMeshPeer` 资源来联合两个或多个网格。

  • 通过创建ExportedServiceSet资源来导出服务,从而使服务可供一个网格中的对等网格访问。

  • 通过创建ImportedServiceSet资源来导入对等网格共享的服务。

配置服务网格控制平面以进行联合

在网格可以联合之前,必须为网格联合配置ServiceMeshControlPlane。由于所有作为联合成员的网格都是平等的,并且每个网格都是独立管理的,因此必须为将参与联合的每个网格配置SMCP。

在以下示例中,red-mesh的管理员正在配置SMCP以与green-meshblue-mesh进行联合。

red-mesh 的 SMCP 示例
apiVersion: maistra.io/v2
kind: ServiceMeshControlPlane
metadata:
  name: red-mesh
  namespace: red-mesh-system
spec:
  version: v2.6
  runtime:
    defaults:
      container:
        imagePullPolicy: Always
  gateways:
    additionalEgress:
      egress-green-mesh:
        enabled: true
        requestedNetworkView:
        - green-network
        routerMode: sni-dnat
        service:
          metadata:
            labels:
              federation.maistra.io/egress-for: egress-green-mesh
          ports:
          - port: 15443
            name: tls
          - port: 8188
            name: http-discovery  #note HTTP here
      egress-blue-mesh:
        enabled: true
        requestedNetworkView:
        - blue-network
        routerMode: sni-dnat
        service:
          metadata:
            labels:
              federation.maistra.io/egress-for: egress-blue-mesh
          ports:
          - port: 15443
            name: tls
          - port: 8188
            name: http-discovery  #note HTTP here
    additionalIngress:
      ingress-green-mesh:
        enabled: true
        routerMode: sni-dnat
        service:
          type: LoadBalancer
          metadata:
            labels:
              federation.maistra.io/ingress-for: ingress-green-mesh
          ports:
          - port: 15443
            name: tls
          - port: 8188
            name: https-discovery  #note HTTPS here
      ingress-blue-mesh:
        enabled: true
        routerMode: sni-dnat
        service:
          type: LoadBalancer
          metadata:
            labels:
              federation.maistra.io/ingress-for: ingress-blue-mesh
          ports:
          - port: 15443
            name: tls
          - port: 8188
            name: https-discovery  #note HTTPS here
  security:
    identity:
      type: ThirdParty
    trust:
      domain: red-mesh.local
表 1. ServiceMeshControlPlane 联合配置参数
参数 描述 默认值
spec:
  cluster:
    name:

集群名称。不需要指定集群名称,但它对故障排除很有帮助。

字符串

N/A

spec:
  cluster:
    network:

集群网络名称。不需要为网络指定名称,但它对配置和故障排除很有帮助。

字符串

N/A

理解联合网关

使用网关来管理网格的入站和出站流量,从而指定要进入或离开网格的流量。

使用入口和出口网关来管理进入和离开服务网格的流量(南北向流量)。创建联合网格时,会创建额外的入口/出口网关,以促进联合网格之间的服务发现、联合网格之间的通信以及管理服务网格之间的流量流(东西向流量)。

为避免网格之间的命名冲突,必须为每个网格创建单独的出口和入口网关。例如,red-mesh将拥有分别用于到green-meshblue-mesh的流量的单独出口网关。

表 2. 联合网关参数
参数 描述 默认值
spec:
  gateways:
    additionalEgress:
      <egress_name>:

为联合中的每个网格对等体定义一个额外的出口网关。

spec:
  gateways:
    additionalEgress:
      <egress_name>:
        enabled:

此参数启用或禁用联合出口。

true/false

true

spec:
  gateways:
    additionalEgress:
      <egress_name>:
        requestedNetworkView:

与已导出服务关联的网络。

设置为网格 SMCP 中spec.cluster.network的值,否则使用<ServiceMeshPeer-name>-network。例如,如果该网格的ServiceMeshPeer资源名为west,则网络将命名为west-network

spec:
  gateways:
    additionalEgress:
      <egress_name>:
        service:
          metadata:
            labels:
              federation.maistra.io/egress-for:

指定网关的唯一标签,以防止联合流量流经集群的默认系统网关。

spec:
  gateways:
    additionalEgress:
      <egress_name>:
        service:
          ports:

用于指定用于 TLS 和服务发现的port:name:。联合流量由用于服务流量的原始加密 TCP 组成。

端口15443是必需的,用于向联合中的其他网格发送 TLS 服务请求。端口8188是必需的,用于向联合中的其他网格发送服务发现请求。

spec:
  gateways:
    additionalIngress:

为联合中的每个网格对等体定义一个额外的入口网关。

spec:
  gateways:
    additionalIgress:
      <ingress_name>:
        enabled:

此参数启用或禁用联合入口。

true/false

true

spec:
  gateways:
    additionalIngress:
      <ingress_name>:
        service:
          type:

入口网关服务必须通过在 OSI 模型的第 4 层运行且公开可用的负载均衡器公开。

LoadBalancer

spec:
  gateways:
    additionalIngress:
      <ingress_name>:
        service:
          type:

如果集群不支持LoadBalancer服务,则可以通过NodePort服务公开入口网关服务。

NodePort

spec:
  gateways:
    additionalIngress:
      <ingress_name>:
        service:
          metadata:
            labels:
              federation.maistra.io/ingress-for:

指定网关的唯一标签,以防止联合流量流经集群的默认系统网关。

spec:
  gateways:
    additionalIngress:
      <ingress_name>:
        service:
          ports:

用于指定用于 TLS 和服务发现的port:name:。联合流量由用于服务流量的原始加密 TCP 组成。联合流量由 HTTPS 用于发现。

端口15443是必需的,用于接收联合中其他网格的 TLS 服务请求。端口8188是必需的,用于接收联合中其他网格的服务发现请求。

spec:
  gateways:
    additionalIngress:
      <ingress_name>:
        service:
          ports:
            nodePort:

如果集群不支持LoadBalancer服务,则用于指定nodePort:

如果指定,则除了 TLS 和服务发现的port:name:之外还需要。nodePort:必须在30000-32767范围内。

在以下示例中,管理员正在使用NodePort服务配置 SMCP 以与green-mesh进行联合。

NodePort 的 SMCP 示例
apiVersion: maistra.io/v2
kind: ServiceMeshControlPlane
metadata:
  name: green-mesh
  namespace: green-mesh-system
spec:
# ...
  gateways:
     additionalIngress:
      ingress-green-mesh:
        enabled: true
        service:
          type: NodePort
          metadata:
            labels:
              federation.maistra.io/ingress-for: ingress-green-mesh
          ports:
          - port: 15443
            nodePort: 30510
            name: tls
          - port: 8188
            nodePort: 32359
            name: https-discovery

理解联合信任域参数

联合中的每个网格都必须具有其自己的唯一信任域。此值用于在ServiceMeshPeer资源中配置网格联合。

kind: ServiceMeshControlPlane
metadata:
  name: red-mesh
  namespace: red-mesh-system
spec:
  security:
    trust:
      domain: red-mesh.local
表 3. 联合安全参数
参数 描述 默认值
spec:
  security:
    trust:
      domain:

用于为网格的信任域指定唯一名称。域对于联合中的每个网格都必须是唯一的。

<mesh-name>.local

N/A

控制台操作步骤

请按照此步骤使用 OpenShift Dedicated Web 控制台编辑ServiceMeshControlPlane。此示例使用red-mesh作为示例。

  1. 以具有 cluster-admin 角色的用户身份登录 OpenShift Dedicated Web 控制台。

  2. 导航到OperatorsInstalled Operators

  3. 单击Project菜单,然后选择安装服务网格控制平面的项目。例如,red-mesh-system

  4. 单击 Red Hat OpenShift Service Mesh Operator。

  5. Istio Service Mesh Control Plane选项卡上,单击您的ServiceMeshControlPlane的名称,例如red-mesh

  6. Create ServiceMeshControlPlane Details页面上,单击YAML以修改您的配置。

  7. 修改您的ServiceMeshControlPlane以添加联合入口和出口网关并指定信任域。

  8. 单击保存

CLI 操作步骤

请按照此步骤使用命令行创建或编辑ServiceMeshControlPlane。此示例使用red-mesh作为示例。

  1. 以具有cluster-admin角色的用户身份登录 OpenShift Dedicated CLI。输入以下命令。然后,在提示时输入您的用户名和密码。

    $ oc login --username=<NAMEOFUSER> https://<HOSTNAME>:6443
  2. 更改到安装服务网格控制平面的项目,例如 red-mesh-system。

    $ oc project red-mesh-system
  3. 编辑ServiceMeshControlPlane文件以添加联合入口和出口网关并指定信任域。

  4. 运行以下命令来编辑服务网格控制平面,其中red-mesh-system是系统命名空间,red-meshServiceMeshControlPlane对象的名称

    $ oc edit -n red-mesh-system smcp red-mesh
  5. 输入以下命令(其中red-mesh-system是系统命名空间),查看服务网格控制平面安装的状态。

    $ oc get smcp -n red-mesh-system

    当 READY 列指示所有组件都已准备就绪时,安装已成功完成。

    NAME       READY   STATUS            PROFILES      VERSION   AGE
    red-mesh   10/10   ComponentsReady   ["default"]   2.1.0     4m25s

加入联合网格

通过创建ServiceMeshPeer资源来声明两个网格之间的联合。ServiceMeshPeer资源定义两个网格之间的联合,并使用它来配置对等网格的发现、对对等网格的访问以及用于验证其他网格客户端的证书。

Service Mesh federated mesh peers illustration

网格是一对一联合的,因此每对对等体都需要一对ServiceMeshPeer资源来指定与其他服务网格的联合连接。例如,联合名为redgreen的两个网格将需要两个ServiceMeshPeer文件。

  1. 在 red-mesh-system 上,为 green 网格创建一个ServiceMeshPeer

  2. 在 green-mesh-system 上,为 red 网格创建一个ServiceMeshPeer

联合名为redbluegreen的三个网格将需要六个ServiceMeshPeer文件。

  1. 在 red-mesh-system 上,为 green 网格创建一个ServiceMeshPeer

  2. 在 red-mesh-system 上,为 blue 网格创建一个ServiceMeshPeer

  3. 在 green-mesh-system 上,为 red 网格创建一个ServiceMeshPeer

  4. 在 green-mesh-system 上,为 blue 网格创建一个ServiceMeshPeer

  5. 在 blue-mesh-system 上,为 red 网格创建一个ServiceMeshPeer

  6. 在 blue-mesh-system 上,为 green 网格创建一个ServiceMeshPeer

ServiceMeshPeer资源中的配置包括以下内容

  • 其他网格入口网关的地址,用于发现和服务请求。

  • 用于与指定对等网格交互的本地入口和出口网关的名称。

  • 其他网格在向此网格发送请求时使用的客户端 ID。

  • 其他网格使用的信任域。

  • 包含根证书的ConfigMap的名称,该根证书用于验证其他网格使用的信任域中的客户端证书。

在以下示例中,red-mesh 的管理员正在配置与 green-mesh 的联合。

red-mesh 的示例 ServiceMeshPeer 资源
kind: ServiceMeshPeer
apiVersion: federation.maistra.io/v1
metadata:
  name: green-mesh
  namespace: red-mesh-system
spec:
  remote:
    addresses:
    - ingress-red-mesh.green-mesh-system.apps.domain.com
  gateways:
    ingress:
      name: ingress-green-mesh
    egress:
      name: egress-green-mesh
  security:
    trustDomain: green-mesh.local
    clientID: green-mesh.local/ns/green-mesh-system/sa/egress-red-mesh-service-account
    certificateChain:
      kind: ConfigMap
      name: green-mesh-ca-root-cert
表 4. ServiceMeshPeer 配置参数
参数 描述
metadata:
  name:

此资源正在与其配置联合的对等网格的名称。

字符串

metadata:
  namespace:

此网格的系统命名空间,即服务网格控制平面安装的位置。

字符串

spec:
  remote:
    addresses:

对等网格入口网关的公共地址列表,这些网关正在处理来自此网格的请求。

spec:
  remote:
    discoveryPort:

地址处理发现请求的端口。

默认为 8188

spec:
  remote:
    servicePort:

地址处理服务请求的端口。

默认为 15443

spec:
  gateways:
    ingress:
      name:

此网格上处理从对等网格接收到的请求的入口的名称。例如,ingress-green-mesh

spec:
  gateways:
    egress:
      name:

此网格上处理发送到对等网格的请求的出口的名称。例如,egress-green-mesh

spec:
  security:
    trustDomain:

对等网格使用的信任域。

<peerMeshName>.local

spec:
  security:
    clientID:

对等网格在调用此网格时使用的客户端 ID。

<peerMeshTrustDomain>/ns/<peerMeshSystem>/sa/<peerMeshEgressGatewayName>-service-account

spec:
  security:
    certificateChain:
      kind: ConfigMap
      name:

包含用于验证对等网格向此网格提供的客户端和服务器证书的资源的种类(例如,ConfigMap)和名称。包含证书的 config map 条目的密钥应为 root-cert.pem

kind: ConfigMap name: <peerMesh>-ca-root-cert

创建 ServiceMeshPeer 资源

先决条件
  • 两个或多个 OpenShift Dedicated 4.6 或更高版本的集群。

  • 集群必须已经联网。

  • 支持与联合网关关联的服务的负载均衡器必须配置为支持原始 TLS 流量。

  • 每个集群都必须部署配置为支持联合的 2.1 或更高版本的 ServiceMeshControlPlane

  • 具有 cluster-admin 角色的帐户。

CLI 操作步骤

按照此步骤从命令行创建 ServiceMeshPeer 资源。此示例显示 red-meshgreen-mesh 创建对等资源。

  1. 以具有cluster-admin角色的用户身份登录 OpenShift Dedicated CLI。输入以下命令。然后,在提示时输入您的用户名和密码。

    $ oc login --username=<NAMEOFUSER> <API token> https://<HOSTNAME>:6443
  2. 更改为安装控制平面的项目,例如 red-mesh-system

    $ oc project red-mesh-system
  3. 根据以下示例为要联合的两个网格创建一个 ServiceMeshPeer 文件。

    red-mesh 到 green-mesh 的示例 ServiceMeshPeer 资源
    kind: ServiceMeshPeer
    apiVersion: federation.maistra.io/v1
    metadata:
      name: green-mesh
      namespace: red-mesh-system
    spec:
      remote:
        addresses:
        - ingress-red-mesh.green-mesh-system.apps.domain.com
      gateways:
        ingress:
          name: ingress-green-mesh
        egress:
          name: egress-green-mesh
      security:
        trustDomain: green-mesh.local
        clientID: green-mesh.local/ns/green-mesh-system/sa/egress-red-mesh-service-account
        certificateChain:
          kind: ConfigMap
          name: green-mesh-ca-root-cert
  4. 运行以下命令来部署资源,其中 red-mesh-system 是系统命名空间,servicemeshpeer.yaml 包含您编辑的文件的完整路径

    $ oc create -n red-mesh-system -f servicemeshpeer.yaml
  5. 要确认 red 网格和 green 网格之间的连接已建立,请检查 red-mesh-system 命名空间中 green-mesh ServiceMeshPeer 的状态

    $ oc -n red-mesh-system get servicemeshpeer green-mesh -o yaml
    red-mesh 和 green-mesh 之间的示例 ServiceMeshPeer 连接
    status:
      discoveryStatus:
        active:
        - pod: istiod-red-mesh-b65457658-9wq5j
          remotes:
          - connected: true
            lastConnected: "2021-10-05T13:02:25Z"
            lastFullSync: "2021-10-05T13:02:25Z"
            source: 10.128.2.149
          watch:
            connected: true
            lastConnected: "2021-10-05T13:02:55Z"
            lastDisconnectStatus: 503 Service Unavailable
            lastFullSync: "2021-10-05T13:05:43Z"

    status.discoveryStatus.active.remotes 字段显示对等网格(在此示例中为 green 网格)中的 istiod 已连接到当前网格(在此示例中为 red 网格)中的 istiod。

    status.discoveryStatus.active.watch 字段显示当前网格中的 istiod 已连接到对等网格中的 istiod。

    如果检查 green-mesh-system 中名为 red-meshservicemeshpeer,您可以从 green 网格的角度找到有关相同两个连接的信息。

    当两个网格之间的连接未建立时,ServiceMeshPeer 状态会在 status.discoveryStatus.inactive 字段中指示这一点。

    有关连接尝试失败原因的更多信息,请检查 Istiod 日志、处理对等出口流量的出口网关的访问日志以及对等网格中处理当前网格入口流量的入口网关。

    例如,如果 red 网格无法连接到 green 网格,请检查以下日志

    • red-mesh-system 中的 istiod-red-mesh

    • red-mesh-system 中的 egress-green-mesh

    • green-mesh-system 中的 ingress-red-mesh

从联合网格导出服务

导出服务允许网格与联合网格中的另一个成员共享一个或多个服务。

Service Mesh federation exporting service illustration

您可以使用 ExportedServiceSet 资源声明要向联合网格中的另一个对等方提供的来自一个网格的服务。您必须明确声明要与对等方共享的每个服务。

  • 您可以按命名空间或名称选择服务。

  • 您可以使用通配符来选择服务;例如,要导出命名空间中的所有服务。

  • 您可以使用别名导出服务。例如,您可以将 foo/bar 服务导出为 custom-ns/bar

  • 您只能导出对网格的系统命名空间可见的服务。例如,另一个命名空间中具有设置为“.”的 networking.istio.io/exportTo 标签的服务将不是导出的候选对象。

  • 对于导出的服务,其目标服务只会看到来自入口网关的流量,而不是原始请求者(也就是说,它们不会看到其他网格的出口网关或发起请求的工作负载的客户端 ID)。

以下示例适用于 red-mesh 正在导出到 green-mesh 的服务。

示例 ExportedServiceSet 资源
kind: ExportedServiceSet
apiVersion: federation.maistra.io/v1
metadata:
  name: green-mesh
  namespace: red-mesh-system
spec:
  exportRules:
  # export ratings.mesh-x-bookinfo as ratings.bookinfo
  - type: NameSelector
    nameSelector:
      namespace: red-mesh-bookinfo
      name: red-ratings
      alias:
        namespace: bookinfo
        name: ratings
  # export any service in red-mesh-bookinfo namespace with label export-service=true
  - type: LabelSelector
    labelSelector:
      namespace: red-mesh-bookinfo
      selector:
        matchLabels:
          export-service: "true"
      aliases: # export all matching services as if they were in the bookinfo namespace
      - namespace: "*"
        name: "*"
        alias:
          namespace: bookinfo
表 5. ExportedServiceSet 参数
参数 描述
metadata:
  name:

您要向其公开此服务的 ServiceMeshPeer 的名称。

必须与 ServiceMeshPeer 资源中网格的 name 值匹配。

metadata:
  namespace:

包含此资源的项目/命名空间的名称(应为此网格的系统命名空间)。

spec:
  exportRules:
  - type:

将控制此服务的导出的规则类型。将使用为服务找到的第一个匹配规则进行导出。

NameSelectorLabelSelector

spec:
  exportRules:
  - type: NameSelector
    nameSelector:
      namespace:
      name:

要创建 NameSelector 规则,请指定服务的 namespace 和在 Service 资源中定义的服务的 name

spec:
  exportRules:
  - type: NameSelector
    nameSelector:
      alias:
        namespace:
        name:

要创建使用服务别名的 NameSelector 规则,请在指定服务的 namespacename 后,指定 namespace 的别名以及要用于服务 name 的别名。

spec:
  exportRules:
  - type: LabelSelector
    labelSelector:
      namespace: <exportingMesh>
      selector:
        matchLabels:
          <labelKey>: <labelValue>

要创建 LabelSelector 规则,请指定服务的 namespace 并指定在 Service 资源中定义的 label。在上面的示例中,标签是 export-service

spec:
  exportRules:
  - type: LabelSelector
    labelSelector:
      namespace: <exportingMesh>
      selector:
        matchLabels:
          <labelKey>: <labelValue>
      aliases:
      - namespace:
        name:
        alias:
          namespace:
          name:

要创建使用服务别名的 LabelSelector 规则,请在指定 selector 后,指定要用于服务 namenamespace 的别名。在上面的示例中,所有匹配服务的命名空间别名都是 bookinfo

将 red-mesh 中所有命名空间中名为“ratings”的服务导出到 blue-mesh。
kind: ExportedServiceSet
apiVersion: federation.maistra.io/v1
metadata:
  name: blue-mesh
  namespace: red-mesh-system
spec:
  exportRules:
  - type: NameSelector
    nameSelector:
      namespace: "*"
      name: ratings
将 west-data-center 命名空间中的所有服务导出到 green-mesh
kind: ExportedServiceSet
apiVersion: federation.maistra.io/v1
metadata:
  name: green-mesh
  namespace: red-mesh-system
spec:
  exportRules:
  - type: NameSelector
    nameSelector:
      namespace: west-data-center
      name: "*"

创建 ExportedServiceSet

您可以创建 ExportedServiceSet 资源来明确声明要提供给网格对等方的服务。

服务导出为<export-name>.<export-namespace>.svc.<ServiceMeshPeer.name>-exports.local,并将自动路由到目标服务。这是导出服务在导出网格中已知的名称。当入口网关收到发往此名称的请求时,它将被路由到正在导出的实际服务。例如,如果名为ratings.red-mesh-bookinfo的服务导出到green-meshratings.bookinfo,则该服务将以ratings.bookinfo.svc.green-mesh-exports.local名称导出,入口网关接收到的该主机名的流量将被路由到ratings.red-mesh-bookinfo服务。

当您将importAsLocal参数设置为true以将远程端点与本地服务聚合时,必须使用服务的别名。当您将参数设置为false时,不需要别名。

先决条件
  • 集群和ServiceMeshControlPlane已配置为网格联合。

  • 具有 cluster-admin 角色的帐户。

即使服务尚不存在,您也可以配置服务进行导出。当部署与ExportedServiceSet中指定的值匹配的服务时,它将自动导出。

CLI 操作步骤

请按照此步骤从命令行创建ExportedServiceSet

  1. 以具有cluster-admin角色的用户身份登录 OpenShift Dedicated CLI。输入以下命令。然后,在提示时输入您的用户名和密码。

    $ oc login --username=<NAMEOFUSER> <API token> https://<HOSTNAME>:6443
  2. 更改到安装服务网格控制平面的项目;例如,red-mesh-system

    $ oc project red-mesh-system
  3. 基于以下示例创建一个ExportedServiceSet文件,其中red-mesh将服务导出到green-mesh

    从red-mesh到green-mesh的ExportedServiceSet资源示例
    apiVersion: federation.maistra.io/v1
    kind: ExportedServiceSet
    metadata:
      name: green-mesh
      namespace: red-mesh-system
    spec:
      exportRules:
      - type: NameSelector
        nameSelector:
          namespace: red-mesh-bookinfo
          name: ratings
          alias:
            namespace: bookinfo
            name: red-ratings
      - type: NameSelector
        nameSelector:
          namespace: red-mesh-bookinfo
          name: reviews
  4. 运行以下命令以在red-mesh-system命名空间中上传和创建ExportedServiceSet资源。

    $ oc create -n <ControlPlaneNamespace> -f <ExportedServiceSet.yaml>

    例如

    $ oc create -n red-mesh-system -f export-to-green-mesh.yaml
  5. 根据需要为联合网格中的每个网格对等体创建额外的ExportedServiceSets

验证
  • 运行以下命令以验证red-mesh导出的与green-mesh共享的服务。

    $ oc get exportedserviceset <PeerMeshExportedTo> -o yaml

    例如

    $ oc -n red-mesh-system get exportedserviceset green-mesh -o yaml
    验证从red网格导出的与green网格共享的服务的示例。
      status:
        exportedServices:
        - exportedName: red-ratings.bookinfo.svc.green-mesh-exports.local
          localService:
            hostname: ratings.red-mesh-bookinfo.svc.cluster.local
            name: ratings
            namespace: red-mesh-bookinfo
        - exportedName: reviews.red-mesh-bookinfo.svc.green-mesh-exports.local
          localService:
            hostname: reviews.red-mesh-bookinfo.svc.cluster.local
            name: reviews
            namespace: red-mesh-bookinfo

    status.exportedServices数组列出了当前导出的服务(这些服务与ExportedServiceSet对象中的导出规则匹配)。数组中的每个条目都指示导出服务的名称以及导出本地服务的详细信息。

    如果您期望导出的服务缺失,请确认Service对象存在,其名称或标签与ExportedServiceSet对象中定义的exportRules匹配,并且Service对象的命名空间使用ServiceMeshMemberRollServiceMeshMember对象配置为服务网格的成员。

将服务导入联合网格

导入服务允许您显式指定来自另一个网格的哪些服务应该在您的服务网格中可用。

Service Mesh federation importing service illustration

您可以使用ImportedServiceSet资源选择要导入的服务。只有由网格对等体导出并显式导入的服务才可用于网格。您没有显式导入的服务不会在网格中可用。

  • 您可以按命名空间或名称选择服务。

  • 您可以使用通配符来选择服务,例如,导入导出到命名空间的所有服务。

  • 您可以使用标签选择器选择要导出的服务,该选择器可能是网格范围的,也可能是特定成员命名空间范围的。

  • 您可以使用别名导入服务。例如,您可以将custom-ns/bar服务导入为other-mesh/bar

  • 您可以指定自定义域名后缀,它将附加到导入服务的name.namespace以形成其完全限定域名;例如,bar.other-mesh.imported.local

以下示例是green-mesh导入由red-mesh导出的服务。

ImportedServiceSet示例
kind: ImportedServiceSet
apiVersion: federation.maistra.io/v1
metadata:
  name: red-mesh #name of mesh that exported the service
  namespace: green-mesh-system #mesh namespace that service is being imported into
spec:
  importRules: # first matching rule is used
  # import ratings.bookinfo as ratings.bookinfo
  - type: NameSelector
    importAsLocal: false
    nameSelector:
      namespace: bookinfo
      name: ratings
      alias:
        # service will be imported as ratings.bookinfo.svc.red-mesh-imports.local
        namespace: bookinfo
        name: ratings
表6. ImportedServiceSet参数
参数 描述
metadata:
  name:

导出服务到联合网格的ServiceMeshPeer的名称。

metadata:
  namespace:

包含ServiceMeshPeer资源(网格系统命名空间)的命名空间的名称。

spec:
  importRules:
  - type:

将管理服务的导入的规则类型。将使用为服务找到的第一个匹配规则进行导入。

NameSelector

spec:
  importRules:
  - type: NameSelector
    nameSelector:
      namespace:
      name:

要创建NameSelector规则,请指定导出的服务的namespacename

spec:
  importRules:
  - type: NameSelector
    importAsLocal:

设置为true以将远程端点与本地服务聚合。当为true时,服务将作为<name>.<namespace>.svc.cluster.local导入。当为true时,需要别名。当为false时,不需要别名。

true/false

spec:
  importRules:
  - type: NameSelector
    nameSelector:
      namespace:
      name:
      alias:
        namespace:
        name:

要创建使用服务别名的 NameSelector 规则,请在指定服务的 namespacename 后,指定 namespace 的别名以及要用于服务 name 的别名。

将red-mesh中的“bookinfo/ratings”服务导入blue-mesh。
kind: ImportedServiceSet
apiVersion: federation.maistra.io/v1
metadata:
  name: red-mesh
  namespace: blue-mesh-system
spec:
  importRules:
  - type: NameSelector
    importAsLocal: false
    nameSelector:
      namespace: bookinfo
      name: ratings
将red-mesh的west-data-center命名空间中的所有服务导入green-mesh。这些服务将作为<name>.west-data-center.svc.red-mesh-imports.local访问。
kind: ImportedServiceSet
apiVersion: federation.maistra.io/v1
metadata:
  name: red-mesh
  namespace: green-mesh-system
spec:
  importRules:
  - type: NameSelector
    importAsLocal: false
    nameSelector:
      namespace: west-data-center
      name: "*"

创建ImportedServiceSet

您可以创建一个ImportedServiceSet资源来显式声明要导入到网格中的服务。

服务以<exported-name>.<exported-namespace>.svc.<ServiceMeshPeer.name>.remote名称导入,这是一个“隐藏”服务,仅在出口网关命名空间内可见,并与导出服务的域名相关联。该服务将在本地可用为<export-name>.<export-namespace>.<domainSuffix>,其中domainSuffix默认为svc.<ServiceMeshPeer.name>-imports.local,除非importAsLocal设置为true,在这种情况下domainSuffixsvc.cluster.local。如果importAsLocal设置为false,则将应用导入规则中的域名后缀。您可以像处理网格中的任何其他服务一样处理本地导入。它会自动通过出口网关进行路由,在那里它会重定向到导出服务的远程名称。

先决条件
  • 集群和ServiceMeshControlPlane已配置为网格联合。

  • 具有 cluster-admin 角色的帐户。

即使服务尚未导出,您也可以配置服务进行导入。当部署和导出与ImportedServiceSet中指定的值匹配的服务时,它将自动导入。

步骤

请按照此步骤从命令行创建ImportedServiceSet

  1. 以具有cluster-admin角色的用户身份登录 OpenShift Dedicated CLI。输入以下命令。然后,在提示时输入您的用户名和密码。

    $ oc login --username=<NAMEOFUSER> <API token> https://<HOSTNAME>:6443
  2. 更改到安装服务网格控制平面的项目;例如,green-mesh-system

    $ oc project green-mesh-system
  3. 基于以下示例创建一个ImportedServiceSet文件,其中green-mesh正在导入之前由red-mesh导出的服务。

    从red-mesh到green-mesh的ImportedServiceSet资源示例
    kind: ImportedServiceSet
    apiVersion: federation.maistra.io/v1
    metadata:
      name: red-mesh
      namespace: green-mesh-system
    spec:
      importRules:
      - type: NameSelector
        importAsLocal: false
        nameSelector:
          namespace: bookinfo
          name: red-ratings
          alias:
            namespace: bookinfo
            name: ratings
  4. 运行以下命令以在green-mesh-system命名空间中上传和创建ImportedServiceSet资源。

    $ oc create -n <ControlPlaneNamespace> -f <ImportedServiceSet.yaml>

    例如

    $ oc create -n green-mesh-system -f import-from-red-mesh.yaml
  5. 根据需要为联合网格中的每个网格对等体创建额外的ImportedServiceSet资源。

验证
  • 运行以下命令以验证服务是否已导入到green-mesh

    $ oc get importedserviceset <PeerMeshImportedInto> -o yaml
    验证从red网格导出的服务是否已使用green-mesh-system命名空间中的importedserviceset/red-mesh'对象的状态部分导入到green网格中的示例
    $ oc -n green-mesh-system get importedserviceset/red-mesh -o yaml
    status:
      importedServices:
      - exportedName: red-ratings.bookinfo.svc.green-mesh-exports.local
        localService:
          hostname: ratings.bookinfo.svc.red-mesh-imports.local
          name: ratings
          namespace: bookinfo
      - exportedName: reviews.red-mesh-bookinfo.svc.green-mesh-exports.local
        localService:
          hostname: ""
          name: ""
          namespace: ""

    在前面的示例中,只有ratings服务被导入,如localService下填充的字段所示。reviews服务可用于导入,但当前未导入,因为它与ImportedServiceSet对象中的任何importRules都不匹配。

配置联合网格以进行故障转移

故障转移是指自动无缝切换到可靠备份系统(例如另一台服务器)的能力。在联合网格的情况下,您可以将一个网格中的服务配置为故障转移到另一个网格中的服务。

您可以通过在ImportedServiceSet资源中设置importAsLocallocality设置,然后配置一个DestinationRule来为服务配置故障转移到ImportedServiceSet中指定的区域,从而配置故障转移。

先决条件
  • 两个或多个已联网并已联合的OpenShift Dedicated 4.6或更高版本集群。

  • 已为联合网格中的每个网格对等体创建了ExportedServiceSet资源。

  • 已为联合网格中的每个网格对等体创建了ImportedServiceSet资源。

  • 具有 cluster-admin 角色的帐户。

配置用于故障转移的ImportedServiceSet

基于区域的加权负载均衡允许管理员根据流量的来源和终点位置来控制流量到端点的分布。这些区域使用任意标签指定,这些标签以{区域}/{区域}/{子区域}的形式指定区域的层次结构。

在本节的示例中,green-mesh位于us-east区域,red-mesh位于us-west区域。

从red-mesh到green-mesh的ImportedServiceSet资源示例
kind: ImportedServiceSet
apiVersion: federation.maistra.io/v1
metadata:
  name: red-mesh #name of mesh that exported the service
  namespace: green-mesh-system #mesh namespace that service is being imported into
spec:
  importRules: # first matching rule is used
  # import ratings.bookinfo as ratings.bookinfo
  - type: NameSelector
    importAsLocal: true
    nameSelector:
      namespace: bookinfo
      name: ratings
      alias:
        # service will be imported as ratings.bookinfo.svc.red-mesh-imports.local
        namespace: bookinfo
        name: ratings
  #Locality within which imported services should be associated.
  locality:
    region: us-west
表7. ImportedServiceLocality字段表
名称 描述 类型

区域 (region)

导入服务所在的区域。

字符串 (string)

子区域 (subzone)

导入服务所在的子区域。如果指定了子区域,则也必须指定区域。

字符串 (string)

区域 (zone)

导入服务所在的区域。如果指定了区域,则也必须指定大区。

字符串 (string)

步骤
  1. 以具有cluster-admin角色的用户身份登录到OpenShift Dedicated CLI,输入以下命令

    $ oc login --username=<NAMEOFUSER> <API token> https://<HOSTNAME>:6443
  2. 切换到安装Service Mesh控制平面的项目,输入以下命令

    $ oc project <smcp-system>

    例如,green-mesh-system

    $ oc project green-mesh-system
  3. 编辑ImportedServiceSet文件,其中<ImportedServiceSet.yaml>包含要编辑文件的完整路径,输入以下命令

    $ oc edit -n <smcp-system> -f <ImportedServiceSet.yaml>

    例如,如果您想修改从red-mesh-system导入到green-mesh-system的文件,如之前的ImportedServiceSet示例所示。

    $ oc edit -n green-mesh-system -f import-from-red-mesh.yaml
  4. 修改文件

    1. spec.importRules.importAsLocal设置为true

    2. spec.locality设置为regionzonesubzone

    3. 保存您的更改。

配置用于故障转移的DestinationRule

创建一个DestinationRule资源,该资源配置以下内容:

  • 服务的异常值检测。这是故障转移正常运行的必要条件。特别是,它配置sidecar代理以了解服务端点何时不健康,最终触发到下一个区域的故障转移。

  • 区域之间的故障转移策略。这确保了跨区域边界的故障转移将具有可预测性。

步骤
  1. 以具有cluster-admin角色的用户身份登录 OpenShift Dedicated CLI。输入以下命令。然后,在提示时输入您的用户名和密码。

    $ oc login --username=<NAMEOFUSER> <API token> https://<HOSTNAME>:6443
  2. 切换到安装Service Mesh控制平面的项目。

    $ oc project <smcp-system>

    例如,green-mesh-system

    $ oc project green-mesh-system
  3. 基于以下示例创建一个DestinationRule文件,如果green-mesh不可用,则应将流量从us-east区域的green-mesh路由到us-west区域的red-mesh。

    DestinationRule示例
    apiVersion: networking.istio.io/v1beta1
    kind: DestinationRule
    metadata:
      name: default-failover
      namespace: bookinfo
    spec:
      host: "ratings.bookinfo.svc.cluster.local"
      trafficPolicy:
        loadBalancer:
          localityLbSetting:
            enabled: true
            failover:
              - from: us-east
                to: us-west
        outlierDetection:
          consecutive5xxErrors: 3
          interval: 10s
          baseEjectionTime: 1m
  4. 部署DestinationRule,其中<DestinationRule>包含文件的完整路径,输入以下命令

    $ oc create -n <application namespace> -f <DestinationRule.yaml>

    例如

    $ oc create -n bookinfo -f green-mesh-us-west-DestinationRule.yaml

从联合网格中移除服务

如果您需要从联合网格中移除服务(例如,如果服务已过时或已被其他服务取代),您可以这样做。

从单个网格中移除服务

从不再应访问该服务的网格对等体的ImportedServiceSet资源中移除该服务的条目。

从整个联合网格中移除服务

从拥有该服务的网格的ExportedServiceSet资源中移除该服务的条目。

从联合网格中移除网格

如果您需要从联合体中移除网格,您可以这样做。

  1. 编辑已移除网格的ServiceMeshControlPlane资源,以移除所有对等网格的联合入口网关。

  2. 对于已与已移除网格联合的每个网格对等体

    1. 移除链接这两个网格的ServiceMeshPeer资源。

    2. 编辑对等网格的ServiceMeshControlPlane资源,以移除为已移除网格服务的出口网关。