×

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

在Istio中,租户是一组共享已部署工作负载的公共访问权限和权限的用户。您可以使用租户在不同的团队之间提供隔离级别。您可以使用`NetworkPolicies`、`AuthorizationPolicies`和`exportTo`注释在istio.io或服务资源上隔离对不同租户的访问。

集群范围(单租户)网格部署模型

集群范围部署包含一个服务网格控制平面,该平面监控整个集群的资源。监控整个集群的资源与Istio功能非常相似,因为控制平面使用单个查询跨所有命名空间来监控Istio和Kubernetes资源。因此,集群范围部署减少了发送到API服务器的请求数量。

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

多租户部署模型

Red Hat OpenShift Service Mesh安装默认配置为多租户的`ServiceMeshControlPlane`。Red Hat OpenShift Service Mesh使用多租户操作符来管理服务网格控制平面的生命周期。在网格内,命名空间用于租户。

Red Hat OpenShift Service Mesh使用`ServiceMeshControlPlane`资源来管理网格安装,其范围默认限制为包含该资源的命名空间。您可以使用`ServiceMeshMemberRoll`和`ServiceMeshMember`资源将其他命名空间包含到网格中。一个命名空间只能包含在一个网格中,并且可以在单个OpenShift集群中安装多个网格。

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

集群管理员可以控制和查看所有Istio控制平面,而租户管理员只能控制其特定的服务网格、Kiali和Jaeger实例。

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

关于迁移到集群范围网格

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

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

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

同样,您必须指定哪些 Pod 接收 sidecar 注射。存在于接收 sidecar 注射的命名空间中的 Pod 不会继承 sidecar 注射。将 sidecar 注射应用于命名空间和 Pod 是两个独立的操作。

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

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

使用 OpenShift Container Platform Web 控制台,您可以将发现选择器添加到集群范围网格中的 ServiceMeshControlPlane 资源。发现选择器定义控制平面可以发现的命名空间。控制平面会忽略与任何发现选择器都不匹配的命名空间,从而将该命名空间排除在网格之外。

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

先决条件
  • 您已安装 Red Hat OpenShift Service Mesh Operator。

  • 您已部署 ServiceMeshControlPlane 资源。

  • 您已以具有 cluster-admin 角色的用户身份登录。如果您使用的是 Red Hat OpenShift Dedicated,则您已以具有 dedicated-admin 角色的用户身份登录。

步骤
  1. 登录到 OpenShift Container Platform Web 控制台。

  2. 导航到 **Operators** → **Installed Operators**。

  3. 单击 Red Hat OpenShift Service Mesh Operator。

  4. 单击 **Istio Service Mesh Control Plane**。

  5. 单击控制平面的名称。

  6. 单击 **YAML**。

  7. 修改 YAML 文件,以便 ServiceMeshControlPlane 资源的 spec.meshConfig 字段包含发现选择器。

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

    在以下示例中,Istiod 服务会发现任何标记为 istio-discovery: enabled 的命名空间,或任何名称为 bookinfohttpbinistio-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:
            - bookinfo
            - httpbin
            - istio-system
    1 确保网格发现包含标签 istio-discovery: enabled 的命名空间。
    2 确保网格发现命名空间 bookinfohttpbinistio-system

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

  8. 保存文件。

使用 CLI 包含和排除集群范围网格中的命名空间

使用 OpenShift Container Platform CLI,您可以将发现选择器添加到集群范围网格中的 ServiceMeshControlPlane 资源。发现选择器定义控制平面可以发现的命名空间。控制平面会忽略与任何发现选择器都不匹配的命名空间,从而将该命名空间排除在网格之外。

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

先决条件
  • 您已安装 Red Hat OpenShift Service Mesh Operator。

  • 您已部署 ServiceMeshControlPlane 资源。

  • 您已以具有 cluster-admin 角色的用户身份登录。如果您使用的是 Red Hat OpenShift Dedicated,则您已以具有 dedicated-admin 角色的用户身份登录。

步骤
  1. 登录到 OpenShift Container Platform CLI。

  2. 通过运行以下命令将 ServiceMeshControlPlane 资源作为 YAML 文件打开

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

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

    在以下示例中,Istiod 服务会发现任何标记为 istio-discovery: enabled 的命名空间,或任何名称为 bookinfohttpbinistio-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:
            - bookinfo
            - httpbin
            - istio-system
    1 确保网格发现包含标签 istio-discovery: enabled 的命名空间。
    2 确保网格发现命名空间 bookinfohttpbinistio-system

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

  4. 保存文件并退出编辑器。

使用 Web 控制台定义在集群范围网格中接收 sidecar 注射的命名空间

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

使用发现选择器来确定网格可以发现哪些命名空间,不会影响 sidecar 注射。发现命名空间和配置 sidecar 注射是两个独立的操作。

先决条件
  • 您已安装 Red Hat OpenShift Service Mesh Operator。

  • 您已部署带有 mode: ClusterWide 注解的 ServiceMeshControlPlane 资源。

  • 您已以具有 cluster-admin 角色的用户身份登录。如果您使用的是 Red Hat OpenShift Dedicated,则您已以具有 dedicated-admin 角色的用户身份登录。

步骤
  1. 登录到 OpenShift Container Platform Web 控制台。

  2. 导航到 **Operators** → **Installed 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. 保存文件。

使用 CLI 定义在集群范围网格中接收 sidecar 注射的命名空间

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

使用发现选择器来确定网格可以发现哪些命名空间,不会影响 sidecar 注射。发现命名空间和配置 sidecar 注射是两个独立的操作。

先决条件
  • 您已安装 Red Hat OpenShift Service Mesh Operator。

  • 您已部署带有 mode: ClusterWide 注解的 ServiceMeshControlPlane 资源。

  • 您已以具有 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. 保存文件并退出编辑器。

使用 Web 控制台从集群范围网格中排除单个 Pod

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

如果 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. 导航到 **Workloads** → **Deployments**。

  3. 单击部署的名称。

  4. 单击 **YAML**。

  5. 修改 YAML 文件以部署一个接收 sidecar 注射的应用程序和一个不接收 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. 保存文件。

使用 CLI 从集群范围网格中排除单个 Pod

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

如果 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 注射的应用程序和一个不接收 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. 保存文件。

多网格或联合部署模型

联合是一种部署模型,允许您在不同管理域中管理的独立网格之间共享服务和工作负载。

Istio 多集群模型要求网格之间具有高度信任,并能够远程访问每个网格所在的 Kubernetes API 服务器。Red Hat OpenShift Service Mesh 联合体采用了一种对 Service Mesh 多集群实现的有主见的方法,该方法假设网格之间具有最小信任。

联合网格是一组行为类似于单个网格的网格。每个网格中的服务可以是唯一服务,例如,一个网格通过从另一个网格导入服务来添加服务,可以跨网格为相同服务提供额外的负载,从而提供高可用性,或者两者兼而有之。所有加入联合网格的网格仍然单独管理,并且您必须明确配置哪些服务导出到和导入联合体中的其他网格。证书生成、指标和跟踪收集等支持功能仍然保留在其各自的网格中。