×

使用 Red Hat OpenShift Service Mesh,您可以控制服务之间流量和 API 调用的流程。服务网格中的一些服务可能需要在网格内通信,而其他服务可能需要隐藏。您可以管理流量以隐藏特定后端服务、公开服务、创建测试或版本控制部署,或在一组服务上添加安全层。

使用网关

您可以使用网关来管理网格的入站和出站流量,以指定您想要进入或离开网格的流量。网关配置应用于在网格边缘运行的独立 Envoy 代理,而不是与您的服务工作负载一起运行的 sidecar Envoy 代理。

与控制进入您系统的流量的其他机制(例如 Kubernetes Ingress API)不同,Red Hat OpenShift Service Mesh 网关使用流量路由的全部功能和灵活性。

Red Hat OpenShift Service Mesh 网关资源可以使用 4-6 层负载均衡属性(例如端口)来公开和配置 Red Hat OpenShift Service Mesh TLS 设置。无需在同一 API 资源中添加应用层流量路由 (L7),您可以将常规 Red Hat OpenShift Service Mesh 虚拟服务绑定到网关,并像管理服务网格中的任何其他数据平面流量一样管理网关流量。

网关主要用于管理入口流量,但您也可以配置出口网关。出口网关允许您为离开网格的流量配置专用出口节点。这使您可以限制哪些服务可以访问外部网络,从而为您的服务网格增加安全控制。您还可以使用网关配置纯内部代理。

网关示例

网关资源描述了在网格边缘运行的负载均衡器,接收传入或传出的 HTTP/TCP 连接。规范描述了一组应公开的端口、要使用的协议类型、负载均衡器的 SNI 配置等等。

以下示例显示了用于外部 HTTPS 入口流量的示例网关配置

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: ext-host-gwy
spec:
  selector:
    istio: ingressgateway # use istio default controller
  servers:
  - port:
      number: 443
      name: https
      protocol: HTTPS
    hosts:
    - ext-host.example.com
    tls:
      mode: SIMPLE
      serverCertificate: /tmp/tls.crt
      privateKey: /tmp/tls.key

此网关配置允许来自 `ext-host.example.com` 的 HTTPS 流量通过 443 端口进入网格,但不指定任何流量路由。

要指定路由并使网关按预期工作,您还必须将网关绑定到虚拟服务。您可以使用虚拟服务的 gateways 字段来执行此操作,如下例所示

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: virtual-svc
spec:
  hosts:
  - ext-host.example.com
  gateways:
    - ext-host-gwy

然后,您可以为外部流量配置虚拟服务的路由规则。

启用网关注入

网关配置适用于在网格边缘运行的独立 Envoy 代理,而不是与您的服务工作负载一起运行的 sidecar Envoy 代理。因为网关是 Envoy 代理,所以您可以配置 Service Mesh 自动注入网关,类似于您可以注入 sidecar 的方式。

使用网关的自动注入,您可以独立于 `ServiceMeshControlPlane` 资源部署和管理网关,并使用您的用户应用程序管理网关。为网关部署使用自动注入可以让开发人员完全控制网关部署,同时简化操作。当有新的升级可用或配置已更改时,您可以重新启动网关 Pod 以更新它们。这样做使操作网关部署的体验与操作 sidecar 相同。

默认情况下,对于 `ServiceMeshControlPlane` 命名空间(例如 `istio-system` 命名空间)禁用注入。作为安全最佳实践,请在与控制平面不同的命名空间中部署网关。

部署自动网关注入

部署网关时,您必须通过向网关 `deployment` 对象添加注入标签或注释来选择加入注入。以下示例部署了一个网关。

先决条件
  • 命名空间必须通过在 `ServiceMeshMemberRoll` 中定义它或创建 `ServiceMeshMember` 资源来成为网格的成员。

步骤
  1. 为 Istio 入口网关设置一个唯一的标签。此设置是必需的,以确保网关可以选择工作负载。此示例使用 `ingressgateway` 作为网关的名称。

    apiVersion: v1
    kind: Service
    metadata:
      name: istio-ingressgateway
      namespace: istio-ingress
    spec:
      type: ClusterIP
      selector:
        istio: ingressgateway
      ports:
      - name: http2
        port: 80
        targetPort: 8080
      - name: https
        port: 443
        targetPort: 8443
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: istio-ingressgateway
      namespace: istio-ingress
    spec:
      selector:
        matchLabels:
          istio: ingressgateway
      template:
        metadata:
          annotations:
            inject.istio.io/templates: gateway
          labels:
            istio: ingressgateway
            sidecar.istio.io/inject: "true" (1)
        spec:
          containers:
          - name: istio-proxy
            image: auto (2)
    1 通过将 `sidecar.istio.io/inject` 字段设置为 `"true"` 来启用网关注入。
    2 将 `image` 字段设置为 `auto`,以便每次 Pod 启动时图像都会自动更新。
  2. 设置角色以允许读取 TLS 的凭据。

    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      name: istio-ingressgateway-sds
      namespace: istio-ingress
    rules:
      - apiGroups: [""]
        resources: ["secrets"]
        verbs: ["get", "watch", "list"]
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: istio-ingressgateway-sds
      namespace: istio-ingress
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: Role
      name: istio-ingressgateway-sds
    subjects:
    - kind: ServiceAccount
      name: default
  3. 授予从集群外部访问新网关的权限,这在 `spec.security.manageNetworkPolicy` 设置为 `true` 时是必需的。

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: gatewayingress
      namespace: istio-ingress
    spec:
      podSelector:
        matchLabels:
          istio: ingressgateway
      ingress:
        - {}
      policyTypes:
      - Ingress
  4. 当入口流量增加时自动扩展 Pod。此示例将最小副本数设置为 `2`,最大副本数设置为 `5`。当利用率达到 80% 时,它还会创建一个新的副本。

    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      labels:
        istio: ingressgateway
        release: istio
      name: ingressgatewayhpa
      namespace: istio-ingress
    spec:
      maxReplicas: 5
      metrics:
      - resource:
          name: cpu
          target:
            averageUtilization: 80
            type: Utilization
        type: Resource
      minReplicas: 2
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: istio-ingressgateway
  5. 指定必须在节点上运行的 Pod 的最小数量。此示例确保如果 Pod 在新节点上重新启动,则会运行一个副本。

    apiVersion: policy/v1
    kind: PodDisruptionBudget
    metadata:
      labels:
        istio: ingressgateway
        release: istio
      name: ingressgatewaypdb
      namespace: istio-ingress
    spec:
      minAvailable: 1
      selector:
        matchLabels:
          istio: ingressgateway

管理入口流量

在 Red Hat OpenShift Service Mesh 中,入口网关允许将监控、安全和路由规则应用于进入集群的流量。使用 Service Mesh 网关来公开服务网格外部的服务。

确定入口 IP 和端口

入口配置取决于您的环境是否支持外部负载均衡器。外部负载均衡器在集群的入口 IP 和端口中设置。要确定您的集群的 IP 和端口是否已配置为外部负载均衡器,请运行以下命令。在此示例中,`istio-system` 是 Service Mesh 控制平面项目的名称。

$ oc get svc istio-ingressgateway -n istio-system

该命令将返回命名空间中每个项目的 `NAME`、`TYPE`、`CLUSTER-IP`、`EXTERNAL-IP`、`PORT(S)` 和 `AGE`。

如果设置了 `EXTERNAL-IP` 值,则您的环境具有可用于入口网关的外部负载均衡器。

如果 `EXTERNAL-IP` 值为 `` 或永久为 ``,则您的环境不为入口网关提供外部负载均衡器。

使用负载均衡器确定入口端口

如果您的环境具有外部负载均衡器,请按照以下说明操作。

步骤
  1. 运行以下命令以设置入口 IP 和端口。此命令在您的终端中设置一个变量。

    $ export INGRESS_HOST=$(oc -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
  2. 运行以下命令以设置入口端口。

    $ export INGRESS_PORT=$(oc -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
  3. 运行以下命令以设置安全入口端口。

    $ export SECURE_INGRESS_PORT=$(oc -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].port}')
  4. 运行以下命令以设置 TCP 入口端口。

    $ export TCP_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="tcp")].port}')

在某些环境中,负载均衡器可以使用主机名而不是 IP 地址公开。在这种情况下,入口网关的 `EXTERNAL-IP` 值不是 IP 地址。相反,它是一个主机名,之前的命令无法设置 `INGRESS_HOST` 环境变量。

在这种情况下,请使用以下命令更正 `INGRESS_HOST` 值

$ export INGRESS_HOST=$(oc -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
在没有负载均衡器的情况下确定入口端口

如果您的环境没有外部负载均衡器,请确定入口端口并改用节点端口。

步骤
  1. 设置入口端口。

    $ export INGRESS_PORT=$(oc -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
  2. 运行以下命令以设置安全入口端口。

    $ export SECURE_INGRESS_PORT=$(oc -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].nodePort}')
  3. 运行以下命令以设置 TCP 入口端口。

    $ export TCP_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="tcp")].nodePort}')

配置入口网关

入口网关是在网格边缘运行的负载均衡器,接收传入的 HTTP/TCP 连接。它配置公开的端口和协议,但不包含任何流量路由配置。入口流量的流量路由与内部服务请求的流量路由方式相同,使用路由规则配置。

以下步骤演示如何创建一个网关并配置一个VirtualService,以便将Bookinfo示例应用程序中的服务通过路径/productpage/login暴露给外部流量。

步骤
  1. 创建一个网关来接收流量。

    1. 创建一个YAML文件,并将以下YAML复制到其中。

      网关示例 gateway.yaml
      apiVersion: networking.istio.io/v1alpha3
      kind: Gateway
      metadata:
        name: bookinfo-gateway
      spec:
        selector:
          istio: ingressgateway
        servers:
        - port:
            number: 80
            name: http
            protocol: HTTP
          hosts:
          - "*"
    2. 应用YAML文件。

      $ oc apply -f gateway.yaml
  2. 创建一个VirtualService对象来重写主机头。

    1. 创建一个YAML文件,并将以下YAML复制到其中。

      虚拟服务示例
      apiVersion: networking.istio.io/v1alpha3
      kind: VirtualService
      metadata:
        name: bookinfo
      spec:
        hosts:
        - "*"
        gateways:
        - bookinfo-gateway
        http:
        - match:
          - uri:
              exact: /productpage
          - uri:
              prefix: /static
          - uri:
              exact: /login
          - uri:
              exact: /logout
          - uri:
              prefix: /api/v1/products
          route:
          - destination:
              host: productpage
              port:
                number: 9080
    2. 应用YAML文件。

      $ oc apply -f vs.yaml
  3. 测试网关和VirtualService是否已正确设置。

    1. 设置网关URL。

      export GATEWAY_URL=$(oc -n istio-system get route istio-ingressgateway -o jsonpath='{.spec.host}')
    2. 设置端口号。在本例中,istio-system是服务网格控制平面项目的名称。

      export TARGET_PORT=$(oc -n istio-system get route istio-ingressgateway -o jsonpath='{.spec.port.targetPort}')
    3. 测试一个已明确暴露的页面。

      curl -s -I "$GATEWAY_URL/productpage"

      预期结果为200

理解自动路由

Istio OpenShift路由(IOR)是一个已弃用的功能。已弃用的功能仍然包含在OpenShift Container Platform中,并且继续受到支持;但是,它将在该产品的未来版本中移除,不建议用于新的部署。

有关OpenShift Container Platform中已弃用或移除的主要功能的最新列表,请参阅OpenShift Container Platform发行说明中的“已弃用和移除的功能”部分。

OpenShift网关路由在服务网格中自动管理。每次在服务网格内创建、更新或删除Istio网关时,都会创建、更新或删除OpenShift路由。

从Service Mesh 2.5开始,对于ServiceMeshControlPlane资源的新实例,默认情况下会禁用自动路由。

带有子域的路由

Red Hat OpenShift Service Mesh使用子域创建路由,但必须配置OpenShift Container Platform才能启用它。子域(例如*.domain.com)受支持,但不是默认的。在配置通配符主机网关之前,请配置OpenShift Container Platform通配符策略。

有关更多信息,请参见OpenShift Container Platform中的Ingress Operator中的“使用通配符路由”。

创建子域路由

以下示例在Bookinfo示例应用程序中创建一个网关,该网关创建子域路由。

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: gateway1
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - www.bookinfo.com
    - bookinfo.example.com

Gateway资源创建以下OpenShift路由。您可以使用以下命令检查路由是否已创建。在本例中,istio-system是服务网格控制平面项目的名称。

$ oc -n istio-system get routes
预期输出
NAME           HOST/PORT             PATH  SERVICES               PORT  TERMINATION   WILDCARD
gateway1-lvlfn bookinfo.example.com        istio-ingressgateway   <all>               None
gateway1-scqhv www.bookinfo.com            istio-ingressgateway   <all>               None

如果删除网关,Red Hat OpenShift Service Mesh将删除路由。但是,Red Hat OpenShift Service Mesh永远不会修改手动创建的路由。

路由标签和注释

有时OpenShift路由需要特定的标签或注释。例如,OpenShift路由中的一些高级功能是使用特殊注释管理的。请参见以下“附加资源”部分中的“特定于路由的注释”。

对于此用例和其他用例,Red Hat OpenShift Service Mesh将把Istio网关资源中存在的所有标签和注释(以kubectl.kubernetes.io开头的注释除外)复制到受管理的OpenShift路由资源中。

如果在Service Mesh创建的OpenShift路由中需要特定的标签或注释,请在Istio网关资源中创建它们,它们将被复制到Service Mesh管理的OpenShift路由资源中。

其他资源

禁用自动路由创建

默认情况下,ServiceMeshControlPlane资源会自动将Istio网关资源与OpenShift路由同步。禁用自动路由创建允许您更灵活地控制路由,如果您有特殊情况或更喜欢手动控制路由。

为特定情况禁用自动路由创建

如果要为特定的Istio网关禁用OpenShift路由的自动管理,则必须将注释maistra.io/manageRoute: false添加到网关元数据定义中。Red Hat OpenShift Service Mesh将忽略具有此注释的Istio网关,同时保持其他Istio网关的自动管理。

为所有情况禁用自动路由创建

您可以为网格中的所有网关禁用OpenShift路由的自动管理。

通过将ServiceMeshControlPlane字段gateways.openshiftRoute.enabled设置为false来禁用Istio网关和OpenShift路由之间的集成。例如,请参见以下资源代码片段。

apiVersion: maistra.io/v1alpha1
kind: ServiceMeshControlPlane
metadata:
  namespace: istio-system
spec:
  gateways:
    openshiftRoute:
      enabled: false

理解服务条目

服务条目在Red Hat OpenShift Service Mesh内部维护的服务注册表中添加一个条目。添加服务条目后,Envoy代理会将流量发送到服务,就好像它是在您的网格中的服务一样。服务条目允许您执行以下操作:

  • 管理在服务网格外部运行的服务的流量。

  • 重定向和转发外部目标(例如,从Web消耗的API)的流量或到旧版基础设施中服务的流量。

  • 为外部目标定义重试、超时和故障注入策略。

  • 通过将虚拟机添加到网格中,在虚拟机(VM)中运行网格服务。

将来自不同集群的服务添加到网格中,以便在Kubernetes上配置多集群Red Hat OpenShift Service Mesh网格。

服务条目示例

以下示例是一个网格外部服务条目,它将ext-resource外部依赖项添加到Red Hat OpenShift Service Mesh服务注册表。

apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: svc-entry
spec:
  hosts:
  - ext-svc.example.com
  ports:
  - number: 443
    name: https
    protocol: HTTPS
  location: MESH_EXTERNAL
  resolution: DNS

使用hosts字段指定外部资源。您可以完全限定它或使用通配符前缀域名。

您可以配置虚拟服务和目标规则来控制对服务条目的流量,其方式与您为网格中的任何其他服务配置流量的方式相同。例如,以下目标规则配置流量路由以使用双向TLS来保护与使用服务条目配置的ext-svc.example.com外部服务的连接。

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: ext-res-dr
spec:
  host: ext-svc.example.com
  trafficPolicy:
    tls:
      mode: MUTUAL
      clientCertificate: /etc/certs/myclientcert.pem
      privateKey: /etc/certs/client_private_key.pem
      caCertificates: /etc/certs/rootcacerts.pem

使用VirtualServices

您可以通过Red Hat OpenShift Service Mesh使用虚拟服务将请求动态路由到微服务的多个版本。使用虚拟服务,您可以:

  • 通过单个虚拟服务处理多个应用程序服务。例如,如果您的网格使用Kubernetes,您可以配置虚拟服务来处理特定命名空间中的所有服务。虚拟服务使您可以将单体应用程序转换为由具有无缝消费者体验的不同微服务组成的服务。

  • 将流量规则与网关结合使用以控制入口和出口流量。

配置VirtualServices

使用虚拟服务将请求路由到服务网格内的服务。每个虚拟服务都包含一组按顺序评估的路由规则。Red Hat OpenShift Service Mesh将每个给定的请求与虚拟服务匹配到网格内的特定实际目标。

如果没有虚拟服务,Red Hat OpenShift Service Mesh将使用最少请求负载均衡在所有服务实例之间分配流量。使用虚拟服务,您可以为一个或多个主机名指定流量行为。虚拟服务中的路由规则告诉Red Hat OpenShift Service Mesh如何将虚拟服务的流量发送到相应的目标。路由目标可以是同一服务的不同版本,也可以是完全不同的服务。

步骤
  1. 使用以下示例创建一个YAML文件,以根据连接到应用程序的用户路由对Bookinfo示例应用程序服务的不同版本的请求。

    示例VirtualService.yaml
    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: reviews
    spec:
      hosts:
      - reviews
      http:
      - match:
        - headers:
            end-user:
              exact: jason
        route:
        - destination:
            host: reviews
            subset: v2
      - route:
        - destination:
            host: reviews
            subset: v3
  2. 运行以下命令以应用VirtualService.yaml,其中VirtualService.yaml是文件的路径。

    $ oc apply -f <VirtualService.yaml>

VirtualService配置参考

参数 描述
spec:
  hosts:

hosts 字段列出了虚拟服务的目标地址,路由规则适用于这些地址。这是用于将请求发送到服务的地址。虚拟服务主机名可以是 IP 地址、DNS 名称或解析为完全限定域名 (FQDN) 的短名称。

spec:
  http:
  - match:

http 部分包含虚拟服务的路由规则,这些规则描述了发送到在 hosts 字段中指定的目的地以及针对 HTTP/1.1、HTTP2 和 gRPC 流量的匹配条件和操作。路由规则包括您希望流量到达的目标以及任何指定的匹配条件。示例中的第一个路由规则包含一个以 match 字段开头的条件。在此示例中,此路由适用于来自用户jason的所有请求。添加headersend-userexact字段以选择相应的请求。

spec:
  http:
  - match:
    - destination:

route 部分中的destination字段指定与该条件匹配的流量的实际目标。与虚拟服务的 host 不同,目的地的 host 必须是 Red Hat OpenShift Service Mesh 服务注册表中存在的真实目标。这可以是具有代理的网格服务或使用服务条目添加的非网格服务。在此示例中,主机名是 Kubernetes 服务名称。

理解目标规则

目标规则是在评估虚拟服务路由规则后应用的,因此它们适用于流量的实际目标。虚拟服务将流量路由到目标。目标规则配置在该目标处发生的情况。

默认情况下,Red Hat OpenShift Service Mesh 使用最少请求负载均衡策略,其中池中活动连接数最少的服务实例将接收请求。Red Hat OpenShift Service Mesh 还支持以下模型,您可以在目标规则中为特定服务或服务子集的请求指定这些模型。

  • 随机:请求随机转发到池中的实例。

  • 加权:根据特定百分比将请求转发到池中的实例。

  • 最少请求:请求转发到请求数最少的实例。

目标规则示例

以下目标规则示例为my-svc目标服务配置了三个不同的子集,并具有不同的负载均衡策略。

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: my-destination-rule
spec:
  host: my-svc
  trafficPolicy:
    loadBalancer:
      simple: RANDOM
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2
    trafficPolicy:
      loadBalancer:
        simple: ROUND_ROBIN
  - name: v3
    labels:
      version: v3

理解网络策略

Red Hat OpenShift Service Mesh 会自动创建和管理服务网格控制平面和应用程序命名空间中的一些NetworkPolicies资源。这是为了确保应用程序和控制平面可以相互通信。

例如,如果您已将 OpenShift Container Platform 集群配置为使用 SDN 插件,则 Red Hat OpenShift Service Mesh 将在每个成员项目中创建一个NetworkPolicy资源。这允许来自其他网格成员和控制平面的网格中所有 Pod 的入口流量。这也将入口流量限制为仅成员项目。如果您需要来自非成员项目的入口流量,则需要创建一个NetworkPolicy以允许该流量通过。如果从 Service Mesh 中删除命名空间,则该NetworkPolicy资源将从项目中删除。

禁用自动创建 NetworkPolicy

如果您想禁用NetworkPolicy资源的自动创建和管理(例如,为了执行公司安全策略或允许直接访问网格中的 Pod),您可以这样做。您可以编辑ServiceMeshControlPlane并将spec.security.manageNetworkPolicy设置为false

禁用spec.security.manageNetworkPolicy后,Red Hat OpenShift Service Mesh 将不会创建**任何**NetworkPolicy对象。系统管理员负责管理网络并解决由此可能造成的任何问题。

先决条件
  • 已安装 Red Hat OpenShift Service Mesh Operator 2.1.1 或更高版本。

  • ServiceMeshControlPlane资源已更新到 2.1 或更高版本。

步骤
  1. 在 OpenShift Container Platform Web 控制台中,单击**Operators** → **已安装的 Operators**。

  2. 从**项目**菜单中选择安装 Service Mesh 控制平面的项目,例如istio-system

  3. 单击 Red Hat OpenShift Service Mesh Operator。在**Istio Service Mesh 控制平面**列中,单击您的ServiceMeshControlPlane的名称,例如basic-install

  4. 在**创建 ServiceMeshControlPlane 详情**页面上,单击YAML以修改您的配置。

  5. ServiceMeshControlPlane字段spec.security.manageNetworkPolicy设置为false,如本例所示。

    apiVersion: maistra.io/v2
    kind: ServiceMeshControlPlane
    spec:
      security:
          manageNetworkPolicy: false
  6. 单击**保存**。

配置 sidecar 以进行流量管理

默认情况下,Red Hat OpenShift Service Mesh 将每个 Envoy 代理配置为在其关联工作负载的所有端口上接受流量,并在转发流量时到达网格中的每个工作负载。您可以使用 sidecar 配置来执行以下操作:

  • 微调 Envoy 代理接受的端口和协议集。

  • 限制 Envoy 代理可以到达的服务集。

为了优化服务网格的性能,请考虑限制 Envoy 代理配置。

在 Bookinfo 示例应用程序中,配置一个 Sidecar,以便所有服务都可以到达在同一命名空间和控制平面中运行的其他服务。此 Sidecar 配置是使用 Red Hat OpenShift Service Mesh 策略和遥测功能所必需的。

步骤
  1. 使用以下示例创建一个 YAML 文件,以指定您希望 sidecar 配置应用于特定命名空间中的所有工作负载。否则,请使用workloadSelector选择特定工作负载。

    sidecar.yaml 示例
    apiVersion: networking.istio.io/v1alpha3
    kind: Sidecar
    metadata:
      name: default
      namespace: bookinfo
    spec:
      egress:
      - hosts:
        - "./*"
        - "istio-system/*"
  2. 运行以下命令以应用sidecar.yaml,其中sidecar.yaml是文件的路径。

    $ oc apply -f sidecar.yaml
  3. 运行以下命令以验证 sidecar 是否已成功创建。

    $ oc get sidecar

路由教程

本指南参考 Bookinfo 示例应用程序,以提供示例应用程序中路由的示例。安装Bookinfo 应用程序以了解这些路由示例的工作原理。

Bookinfo 路由教程

Service Mesh Bookinfo 示例应用程序由四个单独的微服务组成,每个微服务都有多个版本。安装 Bookinfo 示例应用程序后,reviews微服务的三个不同版本将同时运行。

当您在浏览器中访问 Bookinfo 应用程序/product页面并多次刷新时,有时图书评论输出包含星级评定,有时则不包含。如果没有显式指定的默认服务版本进行路由,Service Mesh 会依次将请求路由到所有可用版本。

本教程将帮助您应用将所有流量路由到微服务的v1(版本 1)的规则。稍后,您可以应用一个规则,根据 HTTP 请求头的值来路由流量。

先决条件
  • 部署 Bookinfo 示例应用程序以使用以下示例。

应用虚拟服务

在以下过程中,虚拟服务通过应用设置微服务的默认版本的虚拟服务,将所有流量路由到每个微服务的v1

步骤
  1. 应用虚拟服务。

    $ oc apply -f https://raw.githubusercontent.com/Maistra/istio/maistra-2.6/samples/bookinfo/networking/virtual-service-all-v1.yaml
  2. 要验证您是否应用了虚拟服务,请使用以下命令显示已定义的路由

    $ oc get virtualservices -o yaml

    该命令将返回一个`kind: VirtualService`的YAML格式资源。

您已将 Service Mesh 配置为路由到 Bookinfo 微服务的 `v1` 版本,包括 `reviews` 服务的版本 1。

测试新的路由配置

通过刷新 Bookinfo 应用程序的 `/productpage` 来测试新的配置。

步骤
  1. 设置 `GATEWAY_URL` 参数的值。您可以使用此变量来查找 Bookinfo 产品页面的 URL。在本例中,istio-system 是控制平面项目的名称。

    export GATEWAY_URL=$(oc -n istio-system get route istio-ingressgateway -o jsonpath='{.spec.host}')
  2. 运行以下命令以检索产品页面的 URL。

    echo "http://$GATEWAY_URL/productpage"
  3. 在您的浏览器中打开 Bookinfo 站点。

无论刷新多少次,页面中的评论部分都不会显示评分星,这是因为您已将 Service Mesh 配置为将所有 `reviews` 服务的流量路由到 `reviews:v1` 版本,而此版本的 service 无法访问评分星服务。

您的服务网格现在将流量路由到服务的某个版本。

基于用户身份的路由

更改路由配置,以便来自特定用户的全部流量路由到特定服务版本。在本例中,来自名为 `jason` 的用户的全部流量将路由到 `reviews:v2` 服务。

Service Mesh 本身并不具备对用户身份的特殊内置理解。此示例之所以能够实现,是因为 `productpage` 服务会向所有传出到 reviews 服务的 HTTP 请求添加自定义 `end-user` 头。

步骤
  1. 运行以下命令以在 Bookinfo 示例应用程序中启用基于用户的路由。

    $ oc apply -f https://raw.githubusercontent.com/Maistra/istio/maistra-2.6/samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml
  2. 运行以下命令以确认规则已创建。此命令将返回所有 `kind: VirtualService` 的 YAML 格式资源。

    $ oc get virtualservice reviews -o yaml
  3. 在 Bookinfo 应用的 `/productpage` 上,以用户 `jason` 身份登录(无需密码)。

  4. 刷新浏览器。每个评论旁边都会显示星级评分。

  5. 以其他用户身份登录(选择任何您想要的名字)。刷新浏览器。现在星级消失了。现在,除 Jason 之外的所有用户的流量都将路由到 `reviews:v1`。

您已成功配置 Bookinfo 示例应用程序以基于用户身份路由流量。