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-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

表 1.11. 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 规则,在指定 选择器 后,请指定用于服务名称命名空间的别名。在上例中,所有匹配服务的命名空间别名都是 bookinfo

 

使用名称"勘误"的服务从红色的所有命名空间导出到 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-bookinfo 的服务导出至 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-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
  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.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 对象作为服务网格的成员。