1.5. 服务网格部署模型

Red Hat OpenShift Service Mesh 支持几种不同的部署模型,它们可以以不同的方式组合以满足您的业务需求。

在 Istio 中,租户是为一组部署的工作负载共享共同访问权限和特权的用户组。您可以使用租户在不同的团队之间提供一定程度的隔离。您可以使用 istio.io 或服务资源的 NetworkPoliciesAuthorizationPoliciesexportTo 注解来隔离对不同租户的访问。

1.5.1. Cluster-Wide (Single Tenant) 网格部署模型

集群范围的部署包含一个 Service Mesh Control Plane,它监控整个集群的资源。监控整个集群的资源与 control plane 在所有命名空间中使用单个查询来监控 Istio 和 Kubernetes 资源的 Istio 功能非常相似。因此,集群范围的部署会减少发送到 API 服务器的请求数。

与 Istio 类似,集群范围的网格默认包括带有 istio-injection=enabled 命名空间标签的命名空间。您可以通过修改 ServiceMeshMemberRoll 资源的 spec.labelSelectors 字段来更改此标签。

1.5.2. 多租户部署模型

Red Hat OpenShift Service Mesh 安装了一个 ServiceMeshControlPlane,它默认配置为多租户。Red Hat OpenShift Service Mesh 使用多租户 Operator 来管理 Service Mesh control plane 生命周期。在网格内,命名空间用于租期。

Red Hat OpenShift Service Mesh 使用 ServiceMeshControlPlane 资源来管理网格安装,该安装范围默认限制为包含资源的命名空间。您可以使用 ServiceMeshMemberRollServiceMeshMember 资源在网格中包含额外的命名空间。命名空间只能包含在单个网格中,多个网格也可以安装到单个 OpenShift 集群中。

典型的服务网格部署使用单一 Service Mesh control plane 来配置网格中服务间的通信。Red Hat OpenShift Service Mesh 支持"软多租户",其中每个租户有一个 control plane 和一个网格,并且集群中可以有多个独立的 control plane。多租户部署指定可以访问 Service Mesh 的项目,并将 Service Mesh 与其他 control plane 实例隔离。

集群管理员在所有 Istio control plane 间获得控制和可见性,而租户管理员只能控制其特定的 Service Mesh、Kiali 和 Jaeger 实例。

您可以授予团队权限,以便仅将工作负载部署到给定的命名空间或一组命名空间。如果服务网格管理员授予 mesh-user 角色,用户可以创建一个 ServiceMeshMember 资源来将命名空间添加到 ServiceMeshMemberRoll

1.5.2.1. 关于迁移到集群范围的网格

在集群范围的网格中,一个 ServiceMeshControlPlane (SMCP) 会监视整个集群的所有命名空间。您可以使用 Red Hat OpenShift Service Mesh 版本 2.5 或更高版本将现有集群从多租户网格迁移到集群范围的网格。

注意

如果集群必须有多个 SMCP,则无法迁移到集群范围的网格。

默认情况下,集群范围的网格会发现组成集群的所有命名空间。但是,您可以将网格配置为访问有限的命名空间集合。命名空间默认不接收 sidecar 注入。您必须指定哪些命名空间接收 sidecar 注入。

同样,您必须指定哪些 pod 接收 sidecar 注入。接收 sidecar 注入的命名空间中的 Pod 不会继承 sidecar 注入。将 sidecar 注入应用到命名空间和 pod 是独立的操作。

如果您在迁移到集群范围的网格时更改了 Istio 版本,则必须重启应用程序。如果您使用相同的 Istio 版本,应用程序代理将连接到集群范围的网格的新 SMCP,并像多租户网格一样工作。

1.5.2.1.1. 使用 Web 控制台从集群范围的网格中包括和排除命名空间

使用 OpenShift Container Platform Web 控制台,您可以在集群范围的网格中的 ServiceMeshControlPlane 资源中添加发现选择器。发现选择器定义 control plane 可以发现的命名空间。control plane 忽略任何与其中一个发现选择器不匹配的命名空间,这会从网格中排除命名空间。

注意

如果在 control plane 命名空间中安装入口或出口网关,则必须在发现选择器中包含 control plane 命名空间。

先决条件

  • 已安装 Red Hat OpenShift Service Mesh Operator。
  • 您已部署了 ServiceMeshControlPlane 资源。
  • 以具有 cluster-admin 角色的用户身份登录。如果使用 Red Hat OpenShift Dedicated,则以具有 dedicated-admin 角色的用户身份登录。

流程

  1. 登陆到 OpenShift Container Platform Web 控制台。
  2. 导航到 OperatorsInstalled Operators
  3. 点 Red Hat OpenShift Service Mesh Operator。
  4. Istio Service Mesh Control Plane
  5. 点 control plane 的名称。
  6. YAML
  7. 修改 YAML 文件,以便 ServiceMeshControlPlane 资源的 spec.meshConfig 字段包含发现选择器。

    注意

    在配置 Istiod 服务可以发现的命名空间时,排除可能包含不应暴露给网格的敏感服务的命名空间。

    在以下示例中,Istiod 服务发现任何标记为 istio-discovery: enabled,或具有名称 infohttpbinistio-system 的命名空间:

    apiVersion: maistra.io/v2
    kind: ServiceMeshControlPlane
    metadata:
      name: basic
    spec:
      mode: ClusterWide
      meshConfig:
        discoverySelectors:
        - matchLabels:
            istio-discovery: enabled 1
        - matchExpressions:
          - key: kubernetes.io/metadata.name 2
            operator: In
            values:
            - info
            - httpbin
            - istio-system
    1
    确保网格发现包含标签 istio-discovery: enabled 的命名空间。
    2
    确保 mesh 发现命名空间的 info, httpbinistio-system

    如果命名空间与任何发现选择器匹配,则网格会发现命名空间。网格排除与任何发现选择器不匹配的命名空间。

  8. 保存该文件。
1.5.2.1.2. 使用 CLI 从集群范围的网格中包括和排除命名空间

使用 OpenShift Container Platform CLI,您可以在集群范围的网格中的 ServiceMeshControlPlane 资源中添加发现选择器。发现选择器定义 control plane 可以发现的命名空间。control plane 忽略任何与其中一个发现选择器不匹配的命名空间,这会从网格中排除命名空间。

注意

如果在 control plane 命名空间中安装入口或出口网关,则必须在发现选择器中包含 control plane 命名空间。

先决条件

  • 已安装 Red Hat OpenShift Service Mesh Operator。
  • 您已部署了 ServiceMeshControlPlane 资源。
  • 以具有 cluster-admin 角色的用户身份登录。如果使用 Red Hat OpenShift Dedicated,则以具有 dedicated-admin 角色的用户身份登录。

流程

  1. 登录 OpenShift Container Platform CLI。
  2. 运行以下命令,以 YAML 文件形式打开 ServiceMeshControlPlane 资源:

    $ oc -n istio-system edit smcp <name> 1
    1
    <name> 代表 ServiceMeshControlPlane 资源的名称。
  3. 修改 YAML 文件,以便 ServiceMeshControlPlane 资源的 spec.meshConfig 字段包含发现选择器。

    注意

    在配置 Istiod 服务可以发现的命名空间时,排除可能包含不应暴露给网格的敏感服务的命名空间。

    在以下示例中,Istiod 服务发现任何标记为 istio-discovery: enabled,或具有名称 infohttpbinistio-system 的命名空间:

    apiVersion: maistra.io/v2
    kind: ServiceMeshControlPlane
    metadata:
      name: basic
    spec:
      mode: ClusterWide
      meshConfig:
        discoverySelectors:
        - matchLabels:
            istio-discovery: enabled 1
        - matchExpressions:
          - key: kubernetes.io/metadata.name 2
            operator: In
            values:
            - info
            - httpbin
            - istio-system
    1
    确保网格发现包含标签 istio-discovery: enabled 的命名空间。
    2
    确保 mesh 发现命名空间的 info, httpbinistio-system

    如果命名空间与任何发现选择器匹配,则网格会发现命名空间。网格排除与任何发现选择器不匹配的命名空间。

  4. 保存文件并退出编辑器。
1.5.2.1.3. 使用 Web 控制台在集群范围的网格中定义哪些命名空间接收 sidecar 注入

默认情况下,Red Hat OpenShift Service Mesh Operator 使用成员选择器来识别哪些命名空间接收 sidecar 注入。与 ServiceMeshMemberRoll 资源中定义的 istio-injection=enabled 标签不匹配的命名空间不会接收 sidecar 注入。

注意

使用发现选择器来决定网格可以发现哪些命名空间对 sidecar 注入没有影响。发现命名空间并配置 sidecar 注入是独立的操作。

先决条件

  • 已安装 Red Hat OpenShift Service Mesh Operator。
  • 您已部署了带有 mode: ClusterWide 注解的 ServiceMeshControlPlanae 资源。
  • 以具有 cluster-admin 角色的用户身份登录。如果使用 Red Hat OpenShift Dedicated,则以具有 dedicated-admin 角色的用户身份登录。

流程

  1. 登陆到 OpenShift Container Platform Web 控制台。
  2. 导航到 OperatorsInstalled Operators
  3. 点 Red Hat OpenShift Service Mesh Operator。
  4. Istio Service Mesh Member Roll
  5. ServiceMeshMemberRoll 资源。
  6. YAML
  7. 通过添加与 inject 标签匹配的成员选择器,修改 ServiceMeshMemberRoll 资源中的 spec.memberSelectors 字段。以下示例使用 istio-injection: enabled

    apiVersion: maistra.io/v1
    kind: ServiceMeshMemberRoll
    metadata:
      name: default
    spec:
      memberSelectors:
      - matchLabels:
          istio-injection: enabled 1
    1
    确保命名空间接收 sidecar 注入。
  8. 保存该文件。
1.5.2.1.4. 使用 CLI 定义哪些命名空间在集群范围的网格中接收 sidecar 注入

默认情况下,Red Hat OpenShift Service Mesh Operator 使用成员选择器来识别哪些命名空间接收 sidecar 注入。与 ServiceMeshMemberRoll 资源中定义的 istio-injection=enabled 标签不匹配的命名空间不会接收 sidecar 注入。

注意

使用发现选择器来决定网格可以发现哪些命名空间对 sidecar 注入没有影响。发现命名空间并配置 sidecar 注入是独立的操作。

先决条件

  • 已安装 Red Hat OpenShift Service Mesh Operator。
  • 您已部署了带有 mode: ClusterWide 注解的 ServiceMeshControlPlanae 资源。
  • 以具有 cluster-admin 角色的用户身份登录。如果使用 Red Hat OpenShift Dedicated,则以具有 dedicated-admin 角色的用户身份登录。

流程

  1. 登录 OpenShift Container Platform CLI。
  2. 编辑 ServiceMeshMemberRoll 资源。

    $ oc edit smmr -n <controlplane-namespace>
  3. 通过添加与 inject 标签匹配的成员选择器,修改 ServiceMeshMemberRoll 资源中的 spec.memberSelectors 字段。以下示例使用 istio-injection: enabled

    apiVersion: maistra.io/v1
    kind: ServiceMeshMemberRoll
    metadata:
      name: default
    spec:
      memberSelectors:
      - matchLabels:
          istio-injection: enabled 1
    1
    确保命名空间接收 sidecar 注入。
  4. 保存文件并退出编辑器。
1.5.2.1.5. 使用 Web 控制台从集群范围的网格中排除单个 pod

如果应用 sidecar.istio.io/inject: true 注解,pod 会接收 sidecar 注入,并且 pod 存在于与标签选择器或 ServiceMeshMemberRoll 资源中定义的成员列表匹配的命名空间中。

如果 pod 没有应用 sidecar.istio.io/inject 注解,则无法接收 sidecar 注入。

先决条件

  • 已安装 Red Hat OpenShift Service Mesh Operator。
  • 您已使用 mode: ClusterWide 注解部署了 ServiceMeshControlPlane 资源。
  • 以具有 cluster-admin 角色的用户身份登录。如果使用 Red Hat OpenShift Dedicated,则以具有 dedicated-admin 角色的用户身份登录。

流程

  1. 登陆到 OpenShift Container Platform Web 控制台。
  2. 进入到 WorkloadsDeployments
  3. 点部署的名称。
  4. YAML
  5. 修改 YAML 文件,以部署一个接收 sidecar 注入的应用程序,以及一个没有设置的应用程序,如下例所示:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx
    spec:
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          annotations:
            sidecar.istio.io/inject: 'true' 1
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx:1.14.2
            ports:
            - containerPort: 80
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-without-sidecar
    spec:
      selector:
        matchLabels:
          app: nginx-without-sidecar
      template:
        metadata:
          labels:
            app: nginx-without-sidecar 2
        spec:
          containers:
          - name: nginx
            image: nginx:1.14.2
            ports:
            - containerPort: 80
    1
    此 pod 应用了 sidecar.istio.io/inject 注解,因此它接收 sidecar 注入。
    2
    此 pod 没有注解,因此它不会接收 sidecar 注入。
  6. 保存该文件。
1.5.2.1.6. 使用 CLI 从集群范围的网格中排除单个 pod

如果应用 sidecar.istio.io/inject: true 注解,pod 会接收 sidecar 注入,并且 pod 存在于与标签选择器或 ServiceMeshMemberRoll 资源中定义的成员列表匹配的命名空间中。

如果 pod 没有应用 sidecar.istio.io/inject 注解,则无法接收 sidecar 注入。

先决条件

  • 已安装 Red Hat OpenShift Service Mesh Operator。
  • 您已使用 mode: ClusterWide 注解部署了 ServiceMeshControlPlane 资源。
  • 以具有 cluster-admin 角色的用户身份登录。如果使用 Red Hat OpenShift Dedicated,则以具有 dedicated-admin 角色的用户身份登录。

流程

  1. 登录 OpenShift Container Platform CLI。
  2. 运行以下命令来编辑部署:

    $ oc edit deployment -n <namespace> <deploymentName>
  3. 修改 YAML 文件,以部署一个接收 sidecar 注入的应用程序,以及一个没有设置的应用程序,如下例所示:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx
    spec:
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          annotations:
            sidecar.istio.io/inject: 'true' 1
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx:1.14.2
            ports:
            - containerPort: 80
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-without-sidecar
    spec:
      selector:
        matchLabels:
          app: nginx-without-sidecar
      template:
        metadata:
          labels:
            app: nginx-without-sidecar 2
        spec:
          containers:
          - name: nginx
            image: nginx:1.14.2
            ports:
            - containerPort: 80
    1
    此 pod 应用了 sidecar.istio.io/inject 注解,因此它接收 sidecar 注入。
    2
    此 pod 没有注解,因此它不会接收 sidecar 注入。
  4. 保存该文件。

1.5.3. Multimesh 或联邦部署模型

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

Istio 多集群模型需要在网格和远程访问独立网格所在的所有 Kubernetes API 服务器之间具有高度信任。Red Hat OpenShift Service Mesh 联邦针对 Service Mesh 的多集群实施,该方法假设网格之间的信任最小

联邦网格(federated mesh) 是作为单个网格组成的一组网格。每个网格中的服务可以是独特的服务,例如通过从另一个网格中导入服务的网格添加服务,可以为网格中的相同服务提供额外的工作负载,提供高可用性或两者的组合。加入联邦的所有网格都保持单独管理,您必须明确配置要导出哪些服务并从联邦中的其他网格导入。证书生成、指标和追踪集合等支持功能在其各自网格中保持本地。