×

您正在查看不再受支持的 Red Hat OpenShift 服务网格版本的文档。

服务网格版本 1.0 和 1.1 控制平面不再受支持。有关升级服务网格控制平面的信息,请参见 升级服务网格

有关特定 Red Hat OpenShift 服务网格版本的支持状态信息,请参见 产品生命周期页面

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

使用网关

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

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

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

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

配置入口网关

入口网关是在网格边缘运行的负载均衡器,接收传入的 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

管理入口流量

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

确定入口 IP 和端口

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

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

该命令将返回命名空间中每个项目的NAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)AGE

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

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

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

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

步骤
  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}')

自动路由创建

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

启用自动路由创建

名为 Istio OpenShift Routing (IOR) 的 Red Hat OpenShift Service Mesh 控制平面组件会同步网关路由。在控制平面部署中启用 IOR。

如果网关包含 TLS 部分,则 OpenShift 路由将配置为支持 TLS。

  1. ServiceMeshControlPlane资源中,添加ior_enabled参数并将其设置为true。例如,请参见以下资源代码片段

spec:
  istio:
    gateways:
     istio-egressgateway:
       autoscaleEnabled: false
       autoscaleMin: 1
       autoscaleMax: 5
     istio-ingressgateway:
       autoscaleEnabled: false
       autoscaleMin: 1
       autoscaleMax: 5
       ior_enabled: true

子域名

Red Hat OpenShift Service Mesh 使用子域名创建路由,但必须配置 OpenShift Container Platform 以启用它。子域名(例如*.domain.com)受支持,但不是默认支持的。在配置通配符主机网关之前,请配置 OpenShift Container Platform 通配符策略。有关更多信息,请参见“链接”部分。

如果创建以下网关

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

然后,将自动创建以下 OpenShift 路由。您可以使用以下命令检查路由是否已创建。

$ oc -n <control_plane_namespace> 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 永远不会修改手动创建的路由。

了解服务条目

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

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

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

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

  • 通过将 VM 添加到网格中,在虚拟机 (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 名称或解析为完全限定域名 的短名称。

spec:
  http:
  - match:

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

spec:
  http:
  - match:
    - destination:

路由部分中的destination字段指定与该条件匹配的流量的实际目标。与虚拟服务的主机不同,目标的主机必须是 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

本指南引用 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:v1版本的评论服务,而此版本的服務不会访问星级评分服务。

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

基于用户身份的路由

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

Service Mesh 没有任何对用户身份的特殊内置理解。此示例之所以能够实现,是因为productpage服务会向对评论服务的全部出站 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. 运行以下命令以确认规则已创建。此命令将以 YAML 格式返回所有kind: VirtualService 资源。

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

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

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

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

其他资源

有关配置 OpenShift Container Platform 通配符策略的更多信息,请参阅 OpenShift Container Platform 中的 Ingress 运算符 中的“使用通配符路由”。