1.18. 连接服务网格

Federation(联邦) 是一种部署模型,可让您在不同管理域中管理的单独网格间共享服务和工作负载。

1.18.1. 联邦概述

Federation(联邦)是一组可让您在独立网格间连接服务的功能,允许在多个不同的管理域中使用 Service Mesh 功能,如身份验证、授权和流量管理。

通过实施联邦网格,您可以运行、管理和观察在多个 OpenShift 集群中运行的单个服务网格。Red Hat OpenShift Service Mesh 联邦针对 Service Mesh 的多集群实施,该方法假设网格之间的信任最小

Service Mesh federation 假设每个网格都单独管理,并保留自己的管理员。默认的行为是不允许任何通信,且网格之间没有共享信息。在网格间共享信息是基于明确选择的。联邦网格中的任何内容都不是共享的,除非为共享进行了配置。证书生成、指标和追踪集合等支持功能在其各自网格中保持本地。

您可以在每个服务网格中配置 ServiceMeshControlPlane,以创建专用于联合的入口和出口网关,并为网格指定信任域。

联邦还包括创建额外的联邦文件。以下资源用于在两个或多个网格间配置联合。

  • ServiceMeshPeer 资源声明一对服务网格之间的联邦。
  • ExportedServiceSet 资源声明网格中的一个或多个服务可供对等网格使用。
  • ImportedServiceSet 资源声明对等网格导出的服务将导入到网格中。

1.18.2. 联邦特性

Red Hat OpenShift Service Mesh 联邦方法加入网格的功能包括:

  • 支持每个网格的通用 root 证书。
  • 支持每个网格的不同根证书。
  • Mesh 管理员必须手动配置证书链、服务发现端点、信任域等,以用于 RU mesh 之外的网格。
  • 仅导出/导入您要在网格间共享的服务。

    • 默认为不与联邦中其他网格共享已部署的工作负载的信息。可以 导出 服务使其对其他网格可见,并允许来自其自身网格外的工作负载的请求。
    • 已导出的服务可以被导入到另一个网格中,使网格上的工作负载能够将请求发送到导入的服务。
  • 对网格之间的通信进行加密。
  • 支持在本地部署的工作负载和在联邦中部署的另一个网格中部署的工作负载之间配置负载平衡。

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

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

1.18.3. 联邦安全

Red Hat OpenShift Service Mesh 联邦针对 Service Mesh 的多集群实施,该方法假设网格之间的信任最小。数据安全性作为联邦功能的一部分而建立。

  • 每个网格被视为唯一租户,具有独特的管理。
  • 您可以在联邦中为每个网格创建一个唯一的信任域。
  • 联邦网格之间的流量使用 mutual Transport Layer Security(mTLS)自动加密。
  • Kiali 图仅显示您导入的网格和服务。您无法看到还没有导入到网格中的其他网格或服务。

1.18.4. 联邦限制

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

  • OpenShift Dedicated 不支持网格绑定。

1.18.5. 联邦先决条件

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

  • 两个或多个 OpenShift Container Platform 4.6 或更高版本的集群。
  • 联邦(Federation)是在 Red Hat OpenShift Service Mesh 2.1 或更高版本中引入的。您必须已在您要联合的每个网格上安装了 Red Hat OpenShift Service Mesh 2.1 或更高的 Operator。
  • 您必须在您要联邦的每个网格上部署 2.1 或更高版本的 ServiceMeshControlPlane
  • 您必须配置支持与联邦网关关联的服务的负载均衡器,以支持原始 TLS 流量。联合流量包括用于发现的 HTTPS 和用于服务流量的原始加密 TCP。
  • 在导出并导入它们前,您应该部署要公开给另一个网格的服务。但这不是严格的要求。您可以指定导出/导入尚不存在的服务名称。当您部署在 ExportedServiceSetImportedServiceSet 中命名的的服务时,它们会自动提供给导出/导入。

1.18.6. 规划网格联邦

在开始配置网格联邦前,您应该需要一些时间来规划您的实施。

  • 您计划将多少网格加入到联邦?您可能想从有限数量的网格开始,可能是两个或三个网格。
  • 您计划为每个网格使用哪些命名约定?使用预定义的命名约定有助于配置和故障排除。本文档中的示例为每个网格使用不同的颜色。您应该决定一个命名约定,它可帮助您确定谁拥有和管理每个网格,以及以下联合资源:

    • 集群名称
    • 集群网络名称
    • Mesh 名称和命名空间
    • Federation ingress 网关
    • Federation egress 网关
    • 安全信任域

      注意

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

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

    • 是否要将别名用于服务命名空间?
    • 是否要将别名用于导出的服务?
  • 每个网格计划导入哪些导出的服务?每个网格只导入它所需的服务。

    • 是否要将别名用于导入的服务?

1.18.7. 集群间的 Mesh 联合

要将 OpenShift Service Mesh 的一个实例与在不同集群中运行的实例连接,这个过程与连接同一集群中部署的两个网格的过程有很大不同。但是,一个网格的 ingress 网关必须可以被另一个网格访问。确保这一点的一种方法是,如果集群支持这种类型的服务,将网关服务配置为 LoadBalancer 服务。

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

1.18.7.1. 在裸机上运行的集群上公开联合入口

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

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

1.18.7.2. 在 IBM Power 和 IBM Z 上运行的集群中公开 federation ingress

如果集群在 IBM Power 或 IBM Z 基础架构上运行,且完全支持 LoadBalancer 服务,则 ingress 网关 Service 对象的 .status.loadBalancer.ingress.ip 字段中应当指定为 ServiceMeshPeer 对象的 .spec.remote.addresses 字段中的条目之一。

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

1.18.7.3. 在 Amazon Web Services(AWS)上公开联邦入口。

默认情况下,在 AWS 上运行的集群中的 LoadBalancer 服务不支持 L4 负载均衡。为了使 Red Hat OpenShift Service Mesh 联邦可以正常工作,必须在 ingress 网关服务中添加以下注解:

service.beta.kubernetes.io/aws-load-balancer-type: nlb

在 ingress 网关 Service 对象的 .status.loadBalancer.ingress.hostname 字段中的完全限定域名应指定为 ServiceMeshPeer 对象的 .spec.remote.addresses 字段中的条目之一。

1.18.7.4. 在 Azure 上公开联邦入口

在 Microsoft Azure 中,仅仅将服务类型设置为 LoadBalancer 就足以让网格联邦正确运行。

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

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

在 Google Cloud Platform 上,只要将服务类型设置为 LoadBalancer,网格联邦就可以正常工作。

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

1.18.8. 联邦实施清单

联邦服务网格包括以下活动:

  • ❏ 在您要联邦的集群间配置网络。

    • ❏ 配置支持与联邦网关关联的服务的负载均衡器,以支持原始 TLS 流量。
  • ❏ 在集群中安装 Red Hat OpenShift Service Mesh 版本 2.1 或更高版本的 Operator。
  • ❏ 为每个集群部署版本 2.1 或更高版本的 ServiceMeshControlPlane
  • ❏ 为您要联邦的每个网格配置 SMCP:

    • ❏ 为您要联邦的每个网格创建一个联邦出口网关
    • ❏ 为您要联邦的每个网格创建一个联邦入口网关
    • ❏ 配置唯一的信任域。
  • ❏ 通过为每个网格对创建 ServiceMeshPeer 资源来联邦两个或多个网格。
  • ❏ 通过创建一个 ExportedServiceSet 资源导出服务,使等网网格可以访问这些服务。
  • ❏ 通过创建一个 ImportedServiceSet 资源来导入服务,导入网格对等点共享的服务。

1.18.9. 为联邦配置 Service Mesh control plane

在网格可以被联邦前,您必须为网格联邦配置 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.3
  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:
    trust:
      domain: red-mesh.local

表 1.6. ServiceMeshControlPlane 联邦配置参数

参数描述默认值
spec:
  cluster:
    name:

集群的名称。您不需要指定集群名称,但有助于进行故障排除。

字符串

N/A

spec:
  cluster:
    network:

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

字符串

N/A

1.18.9.1. 了解联邦网关

您可以使用 网关 来管理入站和出站流量,允许您指定您要进入或离开网格的流量。

您可以使用入口和出口网关来管理进入和离开服务网格(North-South 流量)的流量。当您创建联邦网格时,您可以创建额外的入口/出口网关,以便联邦网格间的服务发现、联邦网格之间的通信,以及管理服务网格(East-West 流量)之间的流量流。

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

表 1.7. 联邦网关参数

参数描述默认值
spec:
  gateways:
    additionalEgress:
      <egressName>:

在联邦中为每个网格对等点定义额外的出口网关。

  
spec:
  gateways:
    additionalEgress:
      <egressName>:
        enabled:

这个参数启用或禁用联邦出口。

true/false

true

spec:
  gateways:
    additionalEgress:
      <egressName>:
        requestedNetworkView:

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

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

 
spec:
  gateways:
    additionalEgress:
      <egressName>:
        routerMode:

网关要使用的路由器模式。

sni-dnat

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

为网关指定一个唯一标签,以防止联邦流量通过集群的默认系统网关流。

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

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

将 TLS 服务请求发送到联邦中的其他网格需要端口 15443。将服务发现请求发送到联邦中的其他网格需要端口 8188

 
spec:
  gateways:
    additionalIngress:

在联邦中为每个 网格对等点定义额外的入口网关网关。

  
spec:
  gateways:
    additionalIgress:
      <ingressName>:
        enabled:

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

true/false

true

spec:
  gateways:
    additionalIngress:
      <ingressName>:
        routerMode:

网关要使用的路由器模式。

sni-dnat

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

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

LoadBalancer

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

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

NodePort

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

为网关指定一个唯一标签,以防止联邦流量通过集群的默认系统网关流。

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

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

在向联邦中的其他网格接收 TLS 服务请求时,需要端口 15443。在向联邦中的其他网格接收服务发现请求时,需要端口 8188

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

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

如果指定,除了 port:name: 外,还需要用于 TLS 和服务发现。NodePort: 范围需要为 30000-32767

 

在以下示例中,管理员使用 NodePort 服务与 green-mesh 来配置 SMCP。

NodePort 的 SMCP 示例

  gateways:
     additionalIngress:
      ingress-green-mesh:
        enabled: true
        routerMode: sni-dnat
        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

1.18.9.2. 了解联邦信任域参数

联邦中的每个网格都必须有自己的唯一信任域。这个值用于在 ServiceMeshPeer 资源中配置 mesh federation。

kind: ServiceMeshControlPlane
metadata:
  name: red-mesh
  namespace: red-mesh-system
spec:
  security:
    trust:
      domain: red-mesh.local

表 1.8. 联邦安全参数

参数描述默认值
spec:
  security:
    trust:
      domain:

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

<mesh-name>.local

N/A

控制台的步骤

按照以下步骤,使用 OpenShift Container Platform Web 控制台编辑 ServiceMeshControlPlane。本例使用 red-mesh 作为示例。

  1. 以具有 cluster-admin 角色的用户身份登录到 OpenShift Container Platform Web 控制台。
  2. 导航到 OperatorsInstalled Operators
  3. Project 菜单,选择安装 Service Mesh control plane 的项目。例如: 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. Save

通过 CLI 操作的步骤

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

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

    $ oc login --username=<NAMEOFUSER> https://<HOSTNAME>:6443
  2. 切换到安装 Service Mesh control plane 的项目,如 red-mesh-system。

    $ oc project red-mesh-system
  3. 编辑 ServiceMeshControlPlane 文件,添加联合入口和出口网关,并指定信任域。
  4. 运行以下命令编辑 Service Mesh control plane,其中 red-mesh-system 是系统命名空间,red-meshServiceMeshControlPlane 对象的名称:

    $ oc edit -n red-mesh-system smcp red-mesh
  5. 输入以下命令,其中 red-mesh-system 是系统命名空间,以查看 Service Mesh control plane 安装的状态。

    $ oc get smcp -n red-mesh-system

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

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

1.18.10. 加入联邦网格

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

Service Mesh federated mesh peers 示意图

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

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

对名为 red, blue, 和 green 的三个网格进行联邦会需要六个 ServiceMeshPeer 文件。

  1. 在 red-mesh-system 上,为绿色网格创建一个 ServiceMeshPeer
  2. 在 red-mesh-system 上,为蓝网格创建一个 ServiceMeshPeer
  3. 在 green-mesh-system 上,为红色网格创建一个 ServiceMeshPeer
  4. 在 green-mesh-system 上,为蓝网格创建一个 ServiceMeshPeer
  5. 在 blue-mesh-system 上,为红色网格创建一个 ServiceMeshPeer
  6. 在 blue-mesh-system 上,为绿色网格创建一个 ServiceMeshPeer

ServiceMeshPeer 资源中的配置包括以下:

  • 其他网格的 ingress 网关的地址,用于发现和服务请求。
  • 用于与指定对等网格交互的本地入口和出口网关名称。
  • 将请求发送到此网格时由其他网格使用的客户端 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

表 1.9. ServiceMeshPeer 配置参数

参数描述
metadata:
  name:

此资源配置联合的对等网格名称。

字符串

metadata:
  namespace:

此网格的系统命名空间,即安装了 Service Mesh control plane。

字符串

spec:
  remote:
    addresses:

对等网格提供请求的 ingress 网关的公共地址列表。

 
spec:
  remote:
    discoveryPort:

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

默认值为 8188

spec:
  remote:
    servicePort:

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

默认值为 15443

spec:
  gateways:
    ingress:
      name:

此网格上为从 peer 网格接收的请求提供服务的网格的 ingress 名称。例如: ingress-green-mesh

 
spec:
  gateways:
    egress:
      name:

此网格上为发送到 peer 网格的请求提供服务的出口名称。例如,egress-green-mesh

 
spec:
  security:
    trustDomain:

peer 网格使用的信任域。

<peerMeshName>.local

spec:
  security:
    clientID:

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

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

spec:
  security:
    certificateChain:
      kind: ConfigMap
      name:

包含根证书的资源的 kind(如 ConfigMap)和名称,用于验证由 peer 网格提供给这个网格的客户端和服务器证书。包含证书的配置映射条目的密钥应当是 root-cert.pem

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

1.18.10.1. 创建 ServiceMeshPeer 资源

先决条件

  • 两个或多个 OpenShift Container Platform 4.6 或更高版本的集群。
  • 集群必须已经联网。
  • 支持与联邦网关关联的服务的负载均衡器必须配置为支持原始 TLS 流量。
  • 每个集群都必须配置 2.1 或更高版本的 ServiceMeshControlPlane 来支持部署的联邦。
  • 具有 cluster-admin 角色的帐户。

通过 CLI 操作的步骤

按照以下步骤,从命令行创建 ServiceMeshPeer 资源。本例演示,red-meshgreen-mesh 创建一个对等资源。

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

    $ oc login --username=<NAMEOFUSER> <API token> https://<HOSTNAME>:6443
  2. 切换到安装 control plane 的项目,如 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-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 字段显示 peer mesh 中的 istiod(在本例中为绿色网格)连接到当前网格中的 istiod(本例中为红色网格)。

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

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

    当两个网格之间没有建立连接时,ServiceMeshPeshPeer 状态在 status.discoveryStatus.inactive 字段中显示此状态。

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

    例如,如果红色网格无法连接到绿色网格,请检查以下日志:

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

1.18.11. 从联邦网格导出服务

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

Service Mesh federation 导出服务图

您可以使用 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-info as ratings.bookinfo
  - type: NameSelector
    nameSelector:
      namespace: red-mesh-info
      name: red-ratings
      alias:
        namespace: info
        name: ratings
  # export any service in red-mesh-info namespace with label export-service=true
  - type: LabelSelector
    labelSelector:
      namespace: red-mesh-info
      selector:
        matchLabels:
          export-service: "true"
      aliases: # export all matching services as if they were in the info namespace
      - namespace: "*"
        name: "*"
        alias:
          namespace: info

表 1.10. ExportedServiceSet 参数

参数描述
metadata:
  name:

将此服务公开给的 ServiceMeshPeshPeer 的名称。

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

metadata:
  namespace:

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

 
spec:
  exportRules:
  - type:

监管此服务的导出的规则类型。为服务找到的第一个匹配规则将用于导出。

NameSelector,LabelSelector

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

要创建 NameSelector 规则,请指定服务 命名空间 以及 Service 资源中定义的服务 名称

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

要在为服务创建使用别名的 NameSelector 规则,在为服务指定 命名空间名称 后,请指定 命名空间 的别名以及用于服务名称的别名。

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

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

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

要为服务创建使用别名的 LabelSelector 规则,在指定 选择器 后,请指定用于服务名称命名空间的别名。在上例中,所有匹配服务的命名空间别名都是 info

 

使用名称"勘误"的服务从红色的所有命名空间导出到 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: "*"

1.18.11.1. 创建 ExportedServiceSet

您可以创建一个 ExportedServiceSet 资源来显式声明您要提供给网格对等的服务。

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

前提条件

  • 为网格联邦配置了集群和 ServiceMeshControlPlane
  • 具有 cluster-admin 角色的帐户。
注意

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

通过 CLI 操作的步骤

按照以下步骤,从命令行创建 ExportedServiceSet

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

    $ oc login --username=<NAMEOFUSER> <API token> https://<HOSTNAME>:6443
  2. 切换到安装 Service Mesh control plane 的项目,如 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-info
          name: ratings
          alias:
            namespace: info
            name: red-ratings
      - type: NameSelector
        nameSelector:
          namespace: red-mesh-info
          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
  6. 要验证您从 red-mesh 导出的服务以使用 green-mesh 共享的服务,请运行以下命令:

    $ oc get exportedserviceset <PeerMeshExportedTo> -o yaml

    例如:

    $ oc get exportedserviceset green-mesh -o yaml
  7. 运行以下命令来验证红色导出与 green-mesh 共享的服务:

    $ oc get exportedserviceset <PeerMeshExportedTo> -o yaml

    例如:

    $ oc -n red-mesh-system get exportedserviceset green-mesh -o yaml

    从红色网格导出的服务验证与绿色网格共享的示例。

      status:
        exportedServices:
        - exportedName: red-ratings.info.svc.green-mesh-exports.local
          localService:
            hostname: ratings.red-mesh-info.svc.cluster.local
            name: ratings
            namespace: red-mesh-info
        - exportedName: reviews.red-mesh-info.svc.green-mesh-exports.local
          localService:
            hostname: reviews.red-mesh-info.svc.cluster.local
            name: reviews
            namespace: red-mesh-info

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

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

1.18.12. 将服务导入到联邦网格中

导入服务可让您明确指定从另一个网格导出的服务应在服务网格内访问。

Service Mesh 联邦导入服务图

您可以使用 ImportedServiceSet 资源来选择导入的服务。网格只可使用由网格 peer 导出并明确导入的服务。您没有显式导入的服务不会在网格中提供。

  • 您可以根据命名空间或名称选择服务。
  • 您可以使用通配符来选择服务,例如,将导出的所有服务导入到命名空间。
  • 您可以使用标签选择器(可以是全局到网格)或作用于特定成员命名空间来选择用于导出的服务。
  • 您可以使用别名导入服务。例如,您可以将 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.info as ratings.bookinfo
  - type: NameSelector
    importAsLocal: false
    nameSelector:
      namespace: info
      name: ratings
      alias:
        # service will be imported as ratings.info.svc.red-mesh-imports.local
        namespace: info
        name: ratings

表 1.11. ImportedServiceSet 参数

参数描述
metadata:
  name:

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

 
metadata:
  namespace:

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

 
spec:
  importRules:
  - type:

监管该服务导入的规则类型。为服务找到的第一个匹配规则将用于导入。

NameSelector

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

要创建 NameSelector 规则,请指定导出的服务的命名空间名称

 
spec:
  importRules:
  - type: NameSelector
    importAsLocal:

设置为 true,以将远程端点与本地服务聚合。为 true 时,服务将导入为 <name>.<namespace>.svc.cluster.local

true/false

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

要在为服务创建使用别名的 NameSelector 规则,在为服务指定 命名空间名称 后,请指定 命名空间 的别名以及用于服务名称的别名。

 

将"info/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: info
      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: "*"

1.18.12.1. 创建 ImportedServiceSet

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

服务使用名称 <exported-name>.<exported-namespace>.svc.<ServiceMeshPeer.name>.remote 导入,它是一个"hidden"服务,仅在出口网关命名空间中可见,并与导出的服务主机名相关联。默认情况下,该服务将本地作为 <export-name>.<export-namespace>.<domainSuffix> 提供,其中 domainSuffixsvc.<ServiceMeshPeshPeer.name>-imports.local, 除非 importAsLocal 设置为 true,否则 domainSuffixsvc.cluster.local。如果 importAsLocal 设为 false,则会应用导入规则中的域后缀。您可以像网格中的任何其他服务一样对待本地导入。它通过出口网关自动路由,它将重定向到导出服务的远程名称。

前提条件

  • 为网格联邦配置了集群和 ServiceMeshControlPlane
  • 具有 cluster-admin 角色的帐户。
注意

您可以配置用于导入的服务,即使它们尚未导出。当部署并导出与 ImportedServiceSet 中指定的值匹配的服务时,它会被自动导入。

通过 CLI 操作的步骤

按照以下步骤,通过命令行创建 ImportedServiceSet

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

    $ oc login --username=<NAMEOFUSER> <API token> https://<HOSTNAME>:6443
  2. 切换到安装 Service Mesh control plane 的项目,如 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: info
          name: red-ratings
          alias:
            namespace: info
            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 资源。
  6. 要验证已导入到 green-mesh 中的服务,请运行以下命令:

    $ oc get importedserviceset <PeerMeshImportedInto> -o yaml

    例如:

    $ oc get importedserviceset green-mesh -o yaml
  7. 运行以下命令以验证导入到网格中的服务。

    $ oc get importedserviceset <PeerMeshImportedInto> -o yaml

    使用 importedserviceset/red-mesh' object in the 'green-mesh-system 命名空间中的 status 部分验证从红色网格导出的服务是否已导入到绿色网格中 :

    $ oc -n green-mesh-system get importedserviceset/red-mesh -o yaml

    status:
      importedServices:
      - exportedName: red-ratings.info.svc.green-mesh-exports.local
        localService:
          hostname: ratings.info.svc.red-mesh-imports.local
          name: ratings
          namespace: info
      - exportedName: reviews.red-mesh-info.svc.green-mesh-exports.local
        localService:
          hostname: ""
          name: ""
          namespace: ""

    在上例中,仅导入 ratings 服务,如 localService 下的填充字段所示。reviews 服务可用于导入,但目前并不导入,因为它与 ImportedServiceSet 对象中的任何 importRules 不匹配。

1.18.13. 为故障转移配置一个联邦网格

故障转移功能可以实现自动、无缝地切换到可靠的备份系统,例如切换到另一台服务器。如果是联邦网格,您可以在一个网格中配置服务,以便在另一个网格中切换到服务。

您可以通过在 ImportedServiceSet 资源中设置 importAsLocallocality 设置来配置故障转移的联邦,然后配置 DestinationRule,将服务被配置为 ImportedServiceSet 中指定的本地性。

先决条件

  • 两个或多个 OpenShift Container Platform 4.6 或更高版本的集群已进行了联网和联邦。
  • 已为联邦网格中的每个网格中的网格对等点创建 ExportedServiceSet 资源。
  • 已为联邦网格中的每个网格中的网格对等点创建 ImportedServiceSet 资源。
  • 具有 cluster-admin 角色的帐户。

1.18.13.1. 为故障转移配置 ImportedServiceSet

管理员可以利用本地方式管理负载平衡,根据流量的来源和终止位置控制流量到端点的分布。这些本地设置使用任意标签指定,它以 {region}/{zone}/{sub-zone} 的形式指定了一个分层级结构的本地设置。

在本节示例中,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.info as ratings.bookinfo
  - type: NameSelector
    importAsLocal: true
    nameSelector:
      namespace: info
      name: ratings
      alias:
        # service will be imported as ratings.info.svc.red-mesh-imports.local
        namespace: info
        name: ratings
  #Locality within which imported services should be associated.
  locality:
    region: us-west

表 1.12. ImportedServiceLocality 字段表

名称描述类型

区域:

导入的服务所在的区域。

字符串

子区:

导入服务的子区(zone)位于其中。I Subzone 被指定,还必须指定 Zone。

字符串

zone:

导入的服务所在的区。如果指定了 Zone,还必须指定 Region。

字符串

流程

  1. 以具有 cluster-admin 角色的用户身份登录 OpenShift Container Platform CLI,请输入以下命令:

    $ oc login --username=<NAMEOFUSER> <API token> https://<HOSTNAME>:6443
  2. 进入到安装 Service Mesh control plane 的项目,请输入以下命令:

    $ 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 设置为 region, zone, 或 subzone
    3. 保存您的更改。

1.18.13.2. 为故障转移配置 DestinationRule

创建配置以下内容的 DestinationRule 资源:

  • 服务的 Outlier 检测。需要此项才能使故障转移正常工作。特别是,它会配置 sidecar 代理,以获知服务端点处于不健康状态,并最终触发对下一个位置的故障转移。
  • 各地区之间的故障转移策略。这样可确保除区域边界外的故障切换将具有可预见的。

流程

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

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

    $ 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: info
    spec:
      host: "ratings.info.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 info -f green-mesh-us-west-DestinationRule.yaml

1.18.14. 从联邦网格中删除服务

如果您需要从联邦网格中删除服务,例如,如果服务已过时或者已被其他服务替换,您可以这样做。

1.18.14.1. 从单个网格中删除服务

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

1.18.14.2. 从整个联邦网格中删除服务

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

1.18.15. 从联邦网格中删除网格

如果您需要从联邦中删除网格,您可以这样做。

  1. 编辑删除的网格的 ServiceMeshControlPlane 资源,以删除所有对等网格的联邦入口网关。
  2. 对于已删除网格的每个网格对等点,请执行以下操作:

    1. 删除链接两个网格的 ServiceMeshPeer 资源。
    2. 编辑 peer mesh 的 ServiceMeshControlPlane 资源,以删除服务已删除网格的出口网关。