1.20. 连接服务网格
Federation(联邦) 是一种部署模型,可让您在不同管理域中管理的单独网格间共享服务和工作负载。
1.20.1. 联邦概述
Federation(联邦)是一组可让您在独立网格间连接服务的功能,允许在多个不同的管理域中使用 Service Mesh 功能,如身份验证、授权和流量管理。
通过实施联邦网格,您可以运行、管理和观察在多个 OpenShift 集群中运行的单个服务网格。Red Hat OpenShift Service Mesh 联邦针对 Service Mesh 的多集群实施,该方法假设网格之间的信任最小。
Service Mesh federation 假设每个网格都单独管理,并保留自己的管理员。默认的行为是不允许任何通信,且网格之间没有共享信息。在网格间共享信息是基于明确选择的。联邦网格中的任何内容都不是共享的,除非为共享进行了配置。证书生成、指标和追踪集合等支持功能在其各自网格中保持本地。
您可以在每个服务网格中配置 ServiceMeshControlPlane
,以创建专用于联合的入口和出口网关,并为网格指定信任域。
联邦还包括创建额外的联邦文件。以下资源用于在两个或多个网格间配置联合。
- ServiceMeshPeer 资源声明一对服务网格之间的联邦。
- ExportedServiceSet 资源声明网格中的一个或多个服务可供对等网格使用。
- ImportedServiceSet 资源声明对等网格导出的服务将导入到网格中。
1.20.2. 联邦特性
Red Hat OpenShift Service Mesh 联邦方法加入网格的功能包括:
- 支持每个网格的通用 root 证书。
- 支持每个网格的不同根证书。
- Mesh 管理员必须手动配置证书链、服务发现端点、信任域等,以用于 RU mesh 之外的网格。
仅导出/导入您要在网格间共享的服务。
- 默认为不与联邦中其他网格共享已部署的工作负载的信息。可以 导出 服务使其对其他网格可见,并允许来自其自身网格外的工作负载的请求。
- 已导出的服务可以被导入到另一个网格中,使网格上的工作负载能够将请求发送到导入的服务。
- 对网格之间的通信进行加密。
- 支持在本地部署的工作负载和在联邦中部署的另一个网格中部署的工作负载之间配置负载平衡。
当网格加入到另一个网格时,它可以执行以下操作:
- 向联邦网格提供有关自身的信任详情。
- 发现联邦网格的信任详情。
- 向联邦网格提供有关其自身导出服务的信息。
- 发现联邦网格导出的服务的信息。
1.20.3. 联邦安全
Red Hat OpenShift Service Mesh 联邦针对 Service Mesh 的多集群实施,该方法假设网格之间的信任最小。数据安全性作为联邦功能的一部分而建立。
- 每个网格被视为唯一租户,具有独特的管理。
- 您可以在联邦中为每个网格创建一个唯一的信任域。
- 联邦网格之间的流量使用 mutual Transport Layer Security(mTLS)自动加密。
- Kiali 图仅显示您导入的网格和服务。您无法看到还没有导入到网格中的其他网格或服务。
1.20.4. 联邦限制
Red Hat OpenShift Service Mesh 联邦方法加入网格有以下限制:
- OpenShift Dedicated 不支持网格绑定。
1.20.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。
-
在导出并导入它们前,您应该部署要公开给另一个网格的服务。但这不是严格的要求。您可以指定导出/导入尚不存在的服务名称。当您部署在
ExportedServiceSet
和ImportedServiceSet
中命名的的服务时,它们会自动提供给导出/导入。
1.20.6. 规划网格联邦
在开始配置网格联邦前,您应该需要一些时间来规划您的实施。
- 您计划将多少网格加入到联邦?您可能想从有限数量的网格开始,可能是两个或三个网格。
您计划为每个网格使用哪些命名约定?使用预定义的命名约定有助于配置和故障排除。本文档中的示例为每个网格使用不同的颜色。您应该决定一个命名约定,它可帮助您确定谁拥有和管理每个网格,以及以下联合资源:
- 集群名称
- 集群网络名称
- Mesh 名称和命名空间
- Federation ingress 网关
- Federation egress 网关
安全信任域
注意联邦中的每个网格都必须有自己的唯一信任域。
您计划从每个网格中导出哪些服务到联邦网格?每个服务都可以单独导出,也可以指定标签或使用通配符。
- 是否要将别名用于服务命名空间?
- 是否要将别名用于导出的服务?
每个网格计划导入哪些导出的服务?每个网格只导入它所需的服务。
- 是否要将别名用于导入的服务?
1.20.7. 集群间的 Mesh 联合
要将 OpenShift Service Mesh 的一个实例与在不同集群中运行的实例连接,这个过程与连接同一集群中部署的两个网格的过程有很大不同。但是,一个网格的 ingress 网关必须可以被另一个网格访问。确保这一点的一种方法是,如果集群支持这种类型的服务,将网关服务配置为 LoadBalancer
服务。
该服务必须通过在 OSI 模型的第 4 层运行的负载平衡器公开。
1.20.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.20.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.20.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.20.7.4. 在 Azure 上公开联邦入口
在 Microsoft Azure 中,仅仅将服务类型设置为 LoadBalancer
就足以让网格联邦正确运行。
ingress 网管 Service
对象 .status.loadBalancer.ingress.ip
字段中找到的 IP 地址应指定为 ServiceMeshPeer
对象的 .spec.remote.addresses
字段中的条目之一。
1.20.7.5. 在 Google Cloud Platform(GCP)上公开联邦入口.
在 Google Cloud Platform 上,只要将服务类型设置为 LoadBalancer
,网格联邦就可以正常工作。
ingress 网管 Service
对象 .status.loadBalancer.ingress.ip
字段中找到的 IP 地址应指定为 ServiceMeshPeer
对象的 .spec.remote.addresses
字段中的条目之一。
1.20.8. 联邦实施清单
联邦服务网格包括以下活动:
❏ 在您要联邦的集群间配置网络。
- ❏ 配置支持与联邦网关关联的服务的负载均衡器,以支持原始 TLS 流量。
- ❏ 在集群中安装 Red Hat OpenShift Service Mesh 版本 2.1 或更高版本的 Operator。
-
❏ 为每个集群部署版本 2.1 或更高版本的
ServiceMeshControlPlane
。 ❏ 为您要联邦的每个网格配置 SMCP:
- ❏ 为您要联邦的每个网格创建一个联邦出口网关
- ❏ 为您要联邦的每个网格创建一个联邦入口网关
- ❏ 配置唯一的信任域。
-
❏ 通过为每个网格对创建
ServiceMeshPeer
资源来联邦两个或多个网格。 -
❏ 通过创建一个
ExportedServiceSet
资源导出服务,使等网网格可以访问这些服务。 -
❏ 通过创建一个
ImportedServiceSet
资源来导入服务,导入网格对等点共享的服务。
1.20.9. 为联邦配置 Service Mesh control plane
在网格可以被联邦前,您必须为网格联邦配置 ServiceMeshControlPlane
。因为属于联邦成员的所有网格都是相等的,并且每个网格都独立管理,所以您必须 为每个 加入联邦的网格配置 SMCP。
在以下示例中,red-mesh
的管理员将配置 SMCP 以同时使用 green-mesh
和 blue-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: trust: domain: red-mesh.local
参数 | 描述 | 值 | 默认值 |
---|---|---|---|
spec: cluster: name: | 集群的名称。您不需要指定集群名称,但有助于进行故障排除。 | 字符串 | N/A |
spec: cluster: network: | 集群网络的名称。您不必为网络指定名称,但对配置和故障排除很有帮助。 | 字符串 | N/A |
1.20.9.1. 了解联邦网关
您可以使用 网关 来管理入站和出站流量,允许您指定您要进入或离开网格的流量。
您可以使用入口和出口网关来管理进入和离开服务网格(North-South 流量)的流量。当您创建联邦网格时,您可以创建额外的入口/出口网关,以便联邦网格间的服务发现、联邦网格之间的通信,以及管理服务网格(East-West 流量)之间的流量流。
为了避免网格间的命名冲突,您必须为每个网格创建单独的出口和入口网关。例如,red-mesh
将具有单独的出口网关,用于发送到 green-mesh
和 blue-mesh
的流量。
参数 | 描述 | 值 | 默认值 |
---|---|---|---|
spec: gateways: additionalEgress: <egressName>: | 在联邦中为每个网格对等点定义额外的出口网关。 | ||
spec: gateways: additionalEgress: <egressName>: enabled: | 这个参数启用或禁用联邦出口。 |
|
|
spec: gateways: additionalEgress: <egressName>: requestedNetworkView: | 与导出的服务关联的网络。 |
设置为网格 SMCP 中的 | |
spec: gateways: additionalEgress: <egressName>: routerMode: | 网关要使用的路由器模式。 |
| |
spec: gateways: additionalEgress: <egressName>: service: metadata: labels: federation.maistra.io/egress-for: | 为网关指定一个唯一标签,以防止联邦流量通过集群的默认系统网关流。 | ||
spec: gateways: additionalEgress: <egressName>: service: ports: |
指定用于 TLS 和服务发现的 |
将 TLS 服务请求发送到联邦中的其他网格需要端口 | |
spec: gateways: additionalIngress: | 在联邦中为每个 网格对等点定义额外的入口网关网关。 | ||
spec: gateways: additionalIgress: <ingressName>: enabled: | 此参数启用或禁用联邦入口。 |
|
|
spec: gateways: additionalIngress: <ingressName>: routerMode: | 网关要使用的路由器模式。 |
| |
spec: gateways: additionalIngress: <ingressName>: service: type: | 入口网关服务必须通过在 OSI 模型的第 4 层运行并公开可用的负载均衡器公开。 |
| |
spec: gateways: additionalIngress: <ingressName>: service: type: |
如果集群不支持 |
| |
spec: gateways: additionalIngress: <ingressName>: service: metadata: labels: federation.maistra.io/ingress-for: | 为网关指定一个唯一标签,以防止联邦流量通过集群的默认系统网关流。 | ||
spec: gateways: additionalIngress: <ingressName>: service: ports: |
指定用于 TLS 和服务发现的 |
在向联邦中的其他网格接收 TLS 服务请求时,需要端口 | |
spec: gateways: additionalIngress: <ingressName>: service: ports: nodePort: |
用于指定 |
如果指定,除了 |
在以下示例中,管理员使用 NodePort
服务与 green-mesh
来配置 SMCP。
NodePort 的 SMCP 示例
apiVersion: maistra.io/v2 kind: ServiceMeshControlPlane metadata: name: green-mesh namespace: green-mesh-system spec: # ... 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.20.9.2. 了解联邦信任域参数
联邦中的每个网格都必须有自己的唯一信任域。这个值用于在 ServiceMeshPeer
资源中配置 mesh federation。
kind: ServiceMeshControlPlane metadata: name: red-mesh namespace: red-mesh-system spec: security: trust: domain: red-mesh.local
参数 | 描述 | 值 | 默认值 |
---|---|---|---|
spec: security: trust: domain: | 用于为网格指定信任域的唯一名称。域对于联邦中的每个网格都必须是唯一的。 |
| N/A |
控制台的步骤
按照以下步骤,使用 OpenShift Container Platform Web 控制台编辑 ServiceMeshControlPlane
。本例使用 red-mesh
作为示例。
- 以具有 cluster-admin 角色的用户身份登录到 OpenShift Container Platform Web 控制台。
-
导航到 Operators
Installed Operators。 -
点 Project 菜单,选择安装 Service Mesh control plane 的项目。例如:
red-mesh-system
。 - 点 Red Hat OpenShift Service Mesh Operator。
-
在 Istio Service Mesh Control Plane 选项卡中,点击
ServiceMeshControlPlane
的名称,如red-mesh
。 -
在 Create ServiceMeshControlPlane Details 页中,点
YAML
修改您的配置。 -
修改
ServiceMeshControlPlane
以添加联合入口和出口网关,并指定信任域。 - 点 Save。
通过 CLI 操作的步骤
按照以下步骤使用命令行创建或编辑 ServiceMeshControlPlane
。本例使用 red-mesh
作为示例。
以具有
cluster-admin
角色的用户身份登录 OpenShift Container Platform CLI。输入以下命令。然后在提示时输入您的用户名和密码。$ oc login --username=<NAMEOFUSER> https://<HOSTNAME>:6443
切换到安装 Service Mesh control plane 的项目,如 red-mesh-system。
$ oc project red-mesh-system
-
编辑
ServiceMeshControlPlane
文件,添加联合入口和出口网关,并指定信任域。 运行以下命令编辑 Service Mesh control plane,其中
red-mesh-system
是系统命名空间,red-mesh
是ServiceMeshControlPlane
对象的名称:$ oc edit -n red-mesh-system smcp red-mesh
输入以下命令,其中
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.20.10. 加入联邦网格
您可以通过创建 ServiceMeshPeer
资源来声明两个网格之间的联邦。ServiceMeshPeer
资源定义了两个网格之间的联邦,您可以使用它为对等网格配置发现功能,访问对等网格网格,以及用于验证其他网格客户端的证书。
![Service Mesh federated mesh peers 示意图](https://access.redhat.com/webassets/avalon/d/OpenShift_Container_Platform-4.12-Service_Mesh-zh-CN/images/f15c7cb7991a9b54800e8fbfb11cb0e8/ossm-federated-mesh.png)
网格以一对一为基础联邦,因此每对等点都需要一对 ServiceMeshPeer
资源指定与其他服务网格的联邦连接。例如,联合名为 red
和 green
的两个网格需要两个 ServiceMeshPeer
文件。
-
在 red-mesh-system 上,为绿色网格创建一个
ServiceMeshPeer
。 -
在 green-mesh-system 上,为红色网格创建一个
ServiceMeshPeer
。
对名为 red
, blue
, 和 green
的三个网格进行联邦会需要六个 ServiceMeshPeer
文件。
-
在 red-mesh-system 上,为绿色网格创建一个
ServiceMeshPeer
。 -
在 red-mesh-system 上,为蓝网格创建一个
ServiceMeshPeer
。 -
在 green-mesh-system 上,为红色网格创建一个
ServiceMeshPeer
。 -
在 green-mesh-system 上,为蓝网格创建一个
ServiceMeshPeer
。 -
在 blue-mesh-system 上,为红色网格创建一个
ServiceMeshPeer
。 -
在 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
参数 | 描述 | 值 |
---|---|---|
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 名称。例如: | |
spec: gateways: egress: name: |
此网格上为发送到 peer 网格的请求提供服务的出口名称。例如, | |
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 网格提供给这个网格的客户端和服务器证书。包含证书的配置映射条目的密钥应当是 | kind: ConfigMap name: <peerMesh>-ca-root-cert |
1.20.10.1. 创建 ServiceMeshPeer 资源
先决条件
- 两个或多个 OpenShift Container Platform 4.6 或更高版本的集群。
- 集群必须已经联网。
- 支持与联邦网关关联的服务的负载均衡器必须配置为支持原始 TLS 流量。
-
每个集群都必须配置 2.1 或更高版本的
ServiceMeshControlPlane
来支持部署的联邦。 -
具有
cluster-admin
角色的帐户。
通过 CLI 操作的步骤
按照以下步骤,从命令行创建 ServiceMeshPeer
资源。本例演示,red-mesh
为 green-mesh
创建一个对等资源。
以具有
cluster-admin
角色的用户身份登录 OpenShift Container Platform CLI。输入以下命令。然后在提示时输入您的用户名和密码。$ oc login --username=<NAMEOFUSER> <API token> https://<HOSTNAME>:6443
切换到安装 control plane 的项目,如
red-mesh-system
。$ oc project red-mesh-system
根据以下示例为您要联合的两个网格创建一个
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
运行以下命令来部署资源,其中
red-mesh-system
是系统命名空间,servicemeshpeer.yaml
包含您编辑的文件的完整路径:$ oc create -n red-mesh-system -f servicemeshpeer.yaml
要确认在红色网格和绿色网格间建立了连接,请在 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-mesh
的servicemeshpeer
,您会从绿色网格的角度找到有关同一两个连接的信息。当两个网格之间没有建立连接时,
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.20.11. 从联邦网格导出服务
导出服务允许网格与联邦网格的另一个成员共享一个或多个服务。
![Service Mesh federation 导出服务图](https://access.redhat.com/webassets/avalon/d/OpenShift_Container_Platform-4.12-Service_Mesh-zh-CN/images/11348f2528eded2ba53b60868b417342/ossm-federation-export-service.png)
您可以使用 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
参数 | 描述 | 值 |
---|---|---|
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.20.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
服务。
当您将 importAsLocal
参数设置为 true
以将远程端点与本地服务聚合时,您必须为该服务使用别名。当您设置参数 false
时,不需要别名。
先决条件
-
为网格联邦配置了集群和
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-info name: ratings alias: namespace: info name: red-ratings - type: NameSelector nameSelector: namespace: red-mesh-info 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
。
验证
运行以下命令来验证红色导出与 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 对象的命名空间被配置为使用ServiceMeshMemberRoll
或ServiceMeshMember
对象作为服务网格的成员。
1.20.12. 将服务导入到联邦网格中
导入服务可让您明确指定从另一个网格导出的服务应在服务网格内访问。
![Service Mesh 联邦导入服务图](https://access.redhat.com/webassets/avalon/d/OpenShift_Container_Platform-4.12-Service_Mesh-zh-CN/images/6734470c6e6ae1ee919aa3b9463c0332/ossm-federation-import-service.png)
您可以使用 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
参数 | 描述 | 值 |
---|---|---|
metadata: name: | 将服务导出到联邦网格的 ServiceMeshPeer 的名称。 | |
metadata: namespace: | 包含 ServiceMeshPeer 资源(网格系统命名空间)的命名空间名称。 | |
spec: importRules: - type: | 监管该服务导入的规则类型。为服务找到的第一个匹配规则将用于导入。 |
|
spec: importRules: - type: NameSelector nameSelector: namespace: name: |
要创建 | |
spec: importRules: - type: NameSelector importAsLocal: |
设置为 |
|
spec: importRules: - type: NameSelector nameSelector: namespace: name: alias: namespace: name: |
要在为服务创建使用别名的 |
将"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.20.12.1. 创建 ImportedServiceSet
您可以创建一个 ImportedServiceSet
资源来显式声明您要导入到网格中的服务。
服务使用名称 <exported-name>.<exported-namespace>.svc.<ServiceMeshPeer.name>.remote
导入,它是一个"hidden"服务,仅在出口网关命名空间中可见,并与导出的服务主机名相关联。默认情况下,该服务将本地作为 <export-name>.<export-namespace>.<domainSuffix>
提供,其中 domainSuffix
是 svc.<ServiceMeshPeshPeer.name>-imports.local
, 除非 importAsLocal
设置为 true
,否则 domainSuffix
为 svc.cluster.local
。如果 importAsLocal
设为 false
,则会应用导入规则中的域后缀。您可以像网格中的任何其他服务一样对待本地导入。它通过出口网关自动路由,它将重定向到导出服务的远程名称。
前提条件
-
为网格联邦配置了集群和
ServiceMeshControlPlane
。 -
具有
cluster-admin
角色的帐户。
您可以配置用于导入的服务,即使它们尚未导出。当部署并导出与 ImportedServiceSet 中指定的值匹配的服务时,它会被自动导入。
流程
按照以下步骤,通过命令行创建 ImportedServiceSet
。
以具有
cluster-admin
角色的用户身份登录 OpenShift Container Platform CLI。输入以下命令。然后在提示时输入您的用户名和密码。$ oc login --username=<NAMEOFUSER> <API token> https://<HOSTNAME>:6443
切换到安装 Service Mesh control plane 的项目,如
green-mesh-system
。$ oc project green-mesh-system
根据以下示例创建一个
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
运行以下命令在 green-mesh-system 命名空间中上传并创建
ImportedServiceSet
资源。$ oc create -n <ControlPlaneNamespace> -f <ImportedServiceSet.yaml>
例如:
$ oc create -n green-mesh-system -f import-from-red-mesh.yaml
-
根据需要为联邦网格中的每个网格对等创建额外的
ImportedServiceSet
资源。
验证
运行以下命令,以验证服务是否已导入到
green-mesh
中:$ 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.20.13. 为故障转移配置一个联邦网格
故障转移功能可以实现自动、无缝地切换到可靠的备份系统,例如切换到另一台服务器。如果是联邦网格,您可以在一个网格中配置服务,以便在另一个网格中切换到服务。
您可以通过在 ImportedServiceSet
资源中设置 importAsLocal
和 locality
设置来配置故障转移的联邦,然后配置 DestinationRule
,将服务被配置为 ImportedServiceSet
中指定的本地性。
先决条件
- 两个或多个 OpenShift Container Platform 4.6 或更高版本的集群已进行了联网和联邦。
-
已为联邦网格中的每个网格中的网格对等点创建
ExportedServiceSet
资源。 -
已为联邦网格中的每个网格中的网格对等点创建
ImportedServiceSet
资源。 -
具有
cluster-admin
角色的帐户。
1.20.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
名称 | 描述 | 类型 |
---|---|---|
区域: | 导入的服务所在的区域。 | 字符串 |
子区: | 导入服务的子区(zone)位于其中。I Subzone 被指定,还必须指定 Zone。 | 字符串 |
zone: | 导入的服务所在的区。如果指定了 Zone,还必须指定 Region。 | 字符串 |
流程
以具有
cluster-admin
角色的用户身份登录 OpenShift Container Platform CLI,请输入以下命令:$ oc login --username=<NAMEOFUSER> <API token> https://<HOSTNAME>:6443
进入到安装 Service Mesh control plane 的项目,请输入以下命令:
$ oc project <smcp-system>
例如:
green-mesh-system
。$ oc project green-mesh-system
编辑
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
修改该文件:
-
将
spec.importRules.importAsLocal
设置为true
。 -
将
spec.locality
设置为region
,zone
, 或subzone
。 - 保存您的更改。
-
将
1.20.13.2. 为故障转移配置 DestinationRule
创建配置以下内容的 DestinationRule
资源:
- 服务的 Outlier 检测。需要此项才能使故障转移正常工作。特别是,它会配置 sidecar 代理,以获知服务端点处于不健康状态,并最终触发对下一个位置的故障转移。
- 各地区之间的故障转移策略。这样可确保除区域边界外的故障切换将具有可预见的。
流程
以具有
cluster-admin
角色的用户身份登录到 OpenShift Container Platform CLI。输入以下命令。然后在提示时输入您的用户名和密码。$ oc login --username=<NAMEOFUSER> <API token> https://<HOSTNAME>:6443
切换到安装 Service Mesh control plane 的项目。
$ oc project <smcp-system>
例如:
green-mesh-system
。$ oc project green-mesh-system
根据以下示例创建一个
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
部署
DestinationRule
,其中<DestinationRule>
包含到您的文件的完整路径,请输入以下命令:$ oc create -n <application namespace> -f <DestinationRule.yaml>
例如:
$ oc create -n info -f green-mesh-us-west-DestinationRule.yaml
1.20.14. 从联邦网格中删除服务
如果您需要从联邦网格中删除服务,例如,如果服务已过时或者已被其他服务替换,您可以这样做。
1.20.14.1. 从单个网格中删除服务
从不再应该访问该服务的网格对等点的 ImportedServiceSet
资源中删除服务条目。
1.20.14.2. 从整个联邦网格中删除服务
从拥有该服务的网格的 ExportedServiceSet
资源中删除服务条目。
1.20.15. 从联邦网格中删除网格
如果您需要从联邦中删除网格,您可以这样做。
-
编辑删除的网格的
ServiceMeshControlPlane
资源,以删除所有对等网格的联邦入口网关。 对于已删除网格的每个网格对等点,请执行以下操作:
-
删除链接两个网格的
ServiceMeshPeer
资源。 -
编辑 peer mesh 的
ServiceMeshControlPlane
资源,以删除服务已删除网格的出口网关。
-
删除链接两个网格的