请求路由

此任务将向您展示如何将请求动态路由到微服务的多个版本。

开始之前

关于此任务

Istio Bookinfo 示例包含四个独立的微服务,每个微服务都有多个版本。其中一个微服务 reviews 的三个不同版本已部署并正在同时运行。为了说明由此引起的问题,请在浏览器中访问 Bookinfo 应用程序的 /productpage 并刷新几次。URL 为 http://$GATEWAY_URL/productpage,其中 $GATEWAY_URL 是入口的外部 IP 地址,如 Bookinfo 文档中所述。

您会注意到,有时图书评论输出包含星级评定,有时则不包含。这是因为如果没有要路由到的显式默认服务版本,Istio 会以轮询方式将请求路由到所有可用版本。

此任务的初始目标是应用规则,将所有流量路由到微服务的v1(版本 1)。稍后,您将应用一个规则,根据 HTTP 请求头的值路由流量。

路由到版本 1

要仅路由到一个版本,您可以配置路由规则,将流量发送到微服务的默认版本。

  1. 运行以下命令创建路由规则

Istio 使用虚拟服务来定义路由规则。运行以下命令以应用虚拟服务,这些虚拟服务将所有流量路由到每个微服务的v1

Zip
$ kubectl apply -f @samples/bookinfo/networking/virtual-service-all-v1.yaml@

由于配置传播最终是一致的,请等待几秒钟,使虚拟服务生效。

  1. 使用以下命令显示已定义的路由
$ kubectl get virtualservices -o yaml
- apiVersion: networking.istio.io/v1
  kind: VirtualService
  ...
  spec:
    hosts:
    - details
    http:
    - route:
      - destination:
          host: details
          subset: v1
- apiVersion: networking.istio.io/v1
  kind: VirtualService
  ...
  spec:
    hosts:
    - productpage
    http:
    - route:
      - destination:
          host: productpage
          subset: v1
- apiVersion: networking.istio.io/v1
  kind: VirtualService
  ...
  spec:
    hosts:
    - ratings
    http:
    - route:
      - destination:
          host: ratings
          subset: v1
- apiVersion: networking.istio.io/v1
  kind: VirtualService
  ...
  spec:
    hosts:
    - reviews
    http:
    - route:
      - destination:
          host: reviews
          subset: v1

您还可以使用以下命令显示相应的subset定义

$ kubectl get destinationrules -o yaml

您已将 Istio 配置为路由到 Bookinfo 微服务的v1版本,最重要的是reviews服务版本 1。

测试新的路由配置

您可以通过再次刷新浏览器中 Bookinfo 应用程序的/productpage来轻松测试新配置。请注意,无论刷新多少次,页面中的评论部分均不显示评分星级。这是因为您已将 Istio 配置为将所有流量路由到评论服务的版本reviews:v1,并且此版本的服务器不访问星级评定服务。

您已成功完成了此任务的第一部分:将流量路由到服务的某个版本。

基于用户身份的路由

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

此示例之所以能够实现,是因为productpage服务向发送到评论服务的全部出站 HTTP 请求添加了自定义的end-user标头。

Istio 还支持基于入口网关上强身份验证的 JWT 进行路由,有关更多详细信息,请参阅基于 JWT 声明的路由

请记住,reviews:v2是包含星级评定功能的版本。

  1. 运行以下命令以启用基于用户的路由
Zip
$ kubectl apply -f @samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml@

您可以使用以下命令确认规则已创建

$ kubectl get virtualservice reviews -o yaml
apiVersion: networking.istio.io/v1
kind: VirtualService
...
spec:
  hosts:
  - reviews
  http:
  - match:
    - headers:
        end-user:
          exact: jason
    route:
    - destination:
        host: reviews
        subset: v2
  - route:
    - destination:
        host: reviews
        subset: v1
  1. 在 Bookinfo 应用程序的/productpage上,以用户jason的身份登录。

    刷新浏览器。您看到了什么?每个评论旁边都会显示星级评定。

  2. 以其他用户身份登录(选择任意名称)。

    刷新浏览器。现在星级不见了。这是因为除 Jason 之外的所有用户,其流量都路由到reviews:v1

您已成功将 Istio 配置为基于用户身份路由流量。

了解发生了什么

在此任务中,您使用 Istio 将 100% 的流量发送到每个 Bookinfo 服务的v1版本。然后,您设置了一个规则,根据productpage服务添加到请求中的自定义end-user标头,有选择地将流量发送到reviews服务的版本v2

请注意,像此任务中使用的 Bookinfo 服务这样的 Kubernetes 服务必须遵守某些限制才能利用 Istio 的 L7 路由功能。有关详细信息,请参阅Pod 和服务的必要条件

流量切换任务中,您将遵循此处学习的相同基本模式来配置路由规则,以便逐步将流量从服务的某个版本发送到另一个版本。

清理

  1. 删除应用程序路由规则
Zip
$ kubectl delete -f @samples/bookinfo/networking/virtual-service-all-v1.yaml@
  1. 如果您不打算探索任何后续任务,请参阅Bookinfo 清理说明以关闭应用程序。
这些信息是否有用?
您是否有任何改进建议?

感谢您的反馈!