1.14. 管理服务网格中的流量


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

1.14.1. 使用网关

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

与控制进入系统的其他流量的机制不同,如 Kubernetes Ingress API,Red Hat OpenShift Service Mesh 网关可让您获得流量路由所具有的优点和灵活性。

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

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

网关示例

网关资源描述了在网格边缘运行的负载均衡器,接收进入或传出的 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 进入网格,但没有为流量指定路由。

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

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

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

1.14.1.1. 启用网关注入

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

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

注意

ServiceMeshControlPlane 命名空间(如 istio-system 命名空间)默认禁用注入。作为安全最佳实践,在与 control plane 不同的命名空间中部署网关。

1.14.1.2. 部署自动网关注入

在部署网关时,您必须通过将注入标签或注解添加到网关 deployment 对象来选择注入。以下示例部署了网关。

前提条件

  • 命名空间必须是网格的成员,方法是在 ServiceMeshMemberRoll 中定义或创建 ServiceMeshMember 资源。

流程

  1. 为 Istio ingress 网关设置唯一标签。需要此设置以确保网关可以选择工作负载。这个示例使用 ingressgateway 作为网关的名称。

    apiVersion: v1
    kind: Service
    metadata:
      name: istio-ingressgateway
      namespace: istio-ingress
    spec:
      type: ClusterIP
      selector:
        istio: ingressgateway
      ports:
      - name: http
        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

1.14.1.3. 管理入口流量

在 Red Hat OpenShift Service Mesh 中,Ingress Gateway 允许监控、安全性和路由规则等功能应用到进入集群的流量。使用 Service Mesh 网关在服务网格外公开服务。

1.14.1.3.1. 决定入口 IP 和端口

入口配置根据您的环境是否支持外部负载均衡器而有所不同。在集群的入口 IP 和端口中设置一个外部负载均衡器。要确定是否为外部负载均衡器配置了集群的 IP 和端口,请运行以下命令。在本例中,istio-system 是 Service Mesh control plane 项目的名称。

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

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

如果设置了 EXTERNAL-IP 值,您的环境会有一个外部负载均衡器,供您用于入口网关。

如果 EXTERNAL-IP 值是 <none>,或 <pending>,则您的环境不会为入口网关提供外部负载均衡器。您可以使用服务的节点端口访问网关。

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

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

流程

  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.14.1.3.1.2. 确定没有负载均衡器的入口端口

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

流程

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

1.14.1.4. 配置入口网关

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

以下步骤演示了如何创建网关并配置 VirtualService,以在 Bookinfo 示例应用程序中将服务公开给路径 /productpage/login 的外部流量。

流程

  1. 创建网关以接受流量。

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

      网关 gateway.yaml 示例

      apiVersion: networking.istio.io/v1alpha3
      kind: Gateway
      metadata:
        name: info-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: info
      spec:
        hosts:
        - "*"
        gateways:
        - info-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 是 Service Mesh control plane 项目的名称。

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

      curl -s -I "$GATEWAY_URL/productpage"

      预期的结果为 200

1.14.2. 了解自动路由

在 Service Mesh 中自动管理网关的 OpenShift 路由。每次在 service mesh 中创建、更新或删除 Istio 网关时,都会自动创建、更新或删除 OpenShift 路由。

1.14.2.1. 使用子域的路由

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

如需更多信息,请参阅使用通配符路由

1.14.2.2. 创建子域路由

以下示例在 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.info.com
    - info.example.com

Gateway 资源创建以下 OpenShift 路由:您可以使用以下命令来检查是否创建了路由。在本例中,istio-system 是 Service Mesh control plane 项目的名称。

$ oc -n istio-system get routes

预期输出

NAME           HOST/PORT             PATH  SERVICES               PORT  TERMINATION   WILDCARD
gateway1-lvlfn info.example.com        istio-ingressgateway   <all>               None
gateway1-scqhv www.info.com            istio-ingressgateway   <all>               None

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

1.14.2.3. 路由标签和注解

有时,OpenShift 路由中需要特定的标签或注解。例如,OpenShift 路由中的一些高级功能通过特殊注释进行管理。请参阅以下"Additional resources"部分中的"特定于路由的注解"。

对于这个和其他用例,Red Hat OpenShift Service Mesh 会将 Istio 网关资源中的所有标签和注解(除 kubectl.kubernetes.io开始的注解外)复制到受管 OpenShift Route 资源中。

如果您在 Service Mesh 创建的 OpenShift Routes 中需要特定的标签或注解,在 Istio 网关资源中创建它们,并将其复制到由 Service Mesh 管理的 OpenShift Route 资源中。

其他资源

1.14.2.4. 禁用自动路由创建

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

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

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

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

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

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

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

1.14.3. 了解服务条目

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

  • 管理服务网格外运行的服务的流量。
  • 重定向和转发外部目的地的流量,如来自 web 的 API 调用,或转发到旧基础架构中服务的流量。
  • 为外部目的地定义重新尝试、超时和错误注入策略。
  • 在虚拟机 (VM) 中运行网格服务,方法是在网格中添加虚拟机。
注意

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

服务条目示例

以下示例 mesh-external 服务条目将 ext-resource 外部依赖关系添加到 Red Hat OpenShift Service Mesh 服务 registry:

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 字段指定外部资源。您可以完全限定名,也可以使用通配符前缀域名。

您可以配置虚拟服务和目的地规则,以控制到服务条目的流量,其方式与您为网格中的任何其他服务配置流量相同。例如,以下目的地规则将流量路由配置为使用 mutual 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

1.14.4. 使用 VirtualServices

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

  • 通过单一虚拟服务处理多个应用程序服务。如果网格使用 Kubernetes,您可以配置虚拟服务来处理特定命名空间中的所有服务。虚拟服务使您能够将单体式应用转变为由具有无缝消费者体验的不同微服务组成的服务。
  • 配置流量规则与网关相结合,以控制入口和出口流量。

1.14.4.1. 配置 VirtualServices

使用虚拟服务将请求路由到服务网格中的服务。每个虚拟服务由一组路由规则组成,并按顺序应用。Red Hat OpenShift Service Mesh 会将每个给定给虚拟服务的请求与网格内的特定实际目的地匹配。

如果没有虚拟服务,Red Hat OpenShift Service Mesh 会在所有服务实例间使用最少请求(least requests)负载均衡分配流量。使用虚拟服务时,您可以指定一个或多个主机名的流量行为。虚拟服务的路由规则告知 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>

1.14.4.2. VirtualService 配置参考

参数描述
spec:
  hosts:

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

spec:
  http:
  - match:

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

spec:
  http:
  - match:
    - destination:

route 部分的 destination 字段指定与这个条件匹配的流量的实际目的地。与虚拟服务的主机不同,目的地的主机必须是 Red Hat OpenShift Service Mesh 服务 registry 中存在的真实目的地。这可以是带有代理的网格服务,或使用 service 条目添加的一个非网格服务。在本例中,主机名是一个 Kubernetes 服务名称:

1.14.5. 了解目的地规则

目的地规则在评估虚拟服务路由规则后应用,它们应用到流量的真实目的地。虚拟服务将流量路由到目的地。目的地规则配置该目的地的网络流量。

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

  • Random: 请求会随机转发到池里的实例。
  • Weighted: 根据特定百分比将请求转发到池中的实例。
  • Least requests: 将请求转发到请求数量最少的实例。

目的地规则示例

以下目的地规则示例为 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

1.14.6. 了解网络策略

Red Hat OpenShift Service Mesh 自动在 Service Mesh control plane 和应用程序命名空间中创建和管理多个 NetworkPolicies 资源。这是为了确保应用程序和 control plane 可以相互通信。

例如,如果您已将 OpenShift Container Platform 集群配置为使用 SDN 插件,Red Hat OpenShift Service Mesh 会在每个成员项目中创建 NetworkPolicy 资源。这可让从其他网格成员和 control plane 对网格中的所有 pod 的入站网络数据。这也限制了到成员项目的入站网络数据。如果需要来自非成员项目的入站网络数据,则需要创建一个 NetworkPolicy 来允许这些流量通过。如果您从 Service Mesh 中删除命名空间,则此 NetworkPolicy 资源会从项目中删除。

1.14.6.1. 禁用自动 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 Installed Operators
  2. Project 菜单中选择安装 Service Mesh control plane 的项目,如 istio-system
  3. 点 Red Hat OpenShift Service Mesh Operator。在 Istio Service Mesh Control Plane 栏中,点 ServiceMeshControlPlane 的名称,如 basic-install
  4. Create ServiceMeshControlPlane Details 页中,点 YAML 修改您的配置。
  5. ServiceMeshControlPlane 字段 spec.security.manageNetworkPolicy 设置为 false,如下例所示。

    apiVersion: maistra.io/v2
    kind: ServiceMeshControlPlane
    spec:
      security:
          manageNetworkPolicy: false
  6. Save

1.14.7. 为流量管理配置 sidecar

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

  • 微调 Envoy 代理接受的端口和协议集合。
  • 限制 Envoy 代理可访问的服务集合。
注意

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

在 Bookinfo 示例应用程序中,配置 Sidecar 以便所有服务都可以访问在同一命名空间和 control plane 中运行的其他服务。使用 Red Hat OpenShift Service Mesh 策略和遥测功能需要这个 Sidecar 配置。

流程

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

    sidecar.yaml 示例

    apiVersion: networking.istio.io/v1alpha3
    kind: Sidecar
    metadata:
      name: default
      namespace: info
    spec:
      egress:
      - hosts:
        - "./*"
        - "istio-system/*"

  2. 运行以下命令以应用 sidecar.yaml,其中 sidecar.yaml 是文件的路径。

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

    $ oc get sidecar

1.14.8. 路由教程

本指南使用 Bookinfo 示例应用程序来提供示例应用程序中的路由示例。安装 Bookinfo 应用程序以了解这些路由示例如何工作。

1.14.8.1. Bookinfo 路由指南

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

当您在浏览器中访问 Bookinfo 应用 /product 页面并多次刷新时,有时书的评论输出中会包含星号分级,而其它时候则没有。如果没有可路由的显式默认服务版本,Service Mesh 会将请求路由到所有可用版本。

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

先决条件:

  • 部署 Bookinfo 示例应用程序以使用以下示例。

1.14.8.2. 应用虚拟服务

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

流程

  1. 应用虚拟服务。

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

    $ oc get virtualservices -o yaml

    该命令返回一个 kind: VirtualService 资源,采用 YAML 格式。

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

1.14.8.3. 测试新路由配置

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

流程

  1. 设置 GATEWAY_URL 参数的值。您可以在以后使用这个变量查找 Bookinfo 产品页面的 URL。在本例中,istio-system 是 control plane 项目的名称。

    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 服务的所有流量路由到版本 review:v1,此版本的服务无法访问星表分级服务。

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

1.14.8.4. 基于用户身份的路由

更改路由配置,以便特定用户的所有流量都路由到特定的服务版本。在这种情况下,所有来自名为 Jason 的用户的流量都会被路由到服务的 review:v2 中。

Service Mesh 对用户身份没有任何特殊的内置了解。这个示例是启用的,因为 productpage 服务为到 reviews 服务的所有传出 HTTP 请求都添加了一个自定义的 end-user 标头。

流程

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

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

    $ oc get virtualservice reviews -o yaml
  3. 在 Bookinfo 应用程序的 /productpage 中,以用户 jason 身份在无需密码的情况下进行登录。
  4. 刷新浏览器。星级分级会出现在每条评论旁。
  5. 以其他用户身份登录(选择任意名称)。刷新浏览器。现在就不会出现星级评分。现在,除 Jason 外,所有用户的流量都会被路由到 review :v1

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

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.