1.18.11. 从联邦网格导出服务
导出服务允许网格与联邦网格的另一个成员共享一个或多个服务。
您可以使用 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
参数 | 描述 | 值 |
---|---|---|
metadata: name: | 将此服务公开给的 ServiceMeshPeshPeer 的名称。 |
必须与 |
metadata: namespace: | 包含此资源的项目/命名空间的名称(应该是网格的系统命名空间)。 | |
spec: exportRules: - type: | 监管此服务的导出的规则类型。为服务找到的第一个匹配规则将用于导出。 |
|
spec: exportRules: - type: NameSelector nameSelector: namespace: name: |
要创建 | |
spec: exportRules: - type: NameSelector nameSelector: alias: namespace: name: |
要在为服务创建使用别名的 | |
spec: exportRules: - type: LabelSelector labelSelector: namespace: <exportingMesh> selector: matchLabels: <labelKey>: <labelValue> |
要创建 | |
spec: exportRules: - type: LabelSelector labelSelector: namespace: <exportingMesh> selector: matchLabels: <labelKey>: <labelValue> aliases: - namespace: name: alias: namespace: name: |
要为服务创建使用别名的 |
使用名称"勘误"的服务从红色的所有命名空间导出到 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
。
以具有
cluster-admin
角色的用户身份登录 OpenShift Container Platform CLI。输入以下命令。然后在提示时输入您的用户名和密码。$ oc login --username=<NAMEOFUSER> <API token> https://<HOSTNAME>:6443
切换到安装 Service Mesh control plane 的项目,如
red-mesh-system
。$ oc project red-mesh-system
根据以下示例创建
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
运行以下命令,在 red-mesh-system 命名空间中上传并创建
ExportedServiceSet
资源。$ oc create -n <ControlPlaneNamespace> -f <ExportedServiceSet.yaml>
例如:
$ oc create -n red-mesh-system -f export-to-green-mesh.yaml
-
根据需要为联合网格中的每个网格对等创建额外的
ExportedServiceSets
。 要验证您从
red-mesh
导出的服务以使用green-mesh
共享的服务,请运行以下命令:$ oc get exportedserviceset <PeerMeshExportedTo> -o yaml
例如:
$ oc get exportedserviceset green-mesh -o yaml
运行以下命令来验证红色导出与 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 对象的命名空间被配置为使用ServiceMeshMemberRoll
或ServiceMeshMember
对象作为服务网格的成员。