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