Istio请求路由

半兽人 发表于: 2019-11-26   最后更新时间: 2020-11-26 20:32:36  
{{totalSubscript}} 订阅, 4,420 游览

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

开始之前

  • 按照安装指南中的说明设置Istio。
  • 部署Bookinfo示例应用程序。
  • 理解流量管理概念文档。在尝试这个任务之前,你应该熟悉destination rule(目标规则)virtual service(虚拟服务)subset(子集)等重要术语。

关于此示例

Istio Bookinfo示例包含四个单独的微服务,每个微服务具有多个版本。微服务之一的三个不同版本reviews(评论)已部署并同时运行。 为了说明此问题的原因,请在浏览器中访问Bookinfo应用的/productpage,然后刷新几次。您会发现页面输出有时包含星级,有时则不包含。这是因为如果没有明确的默认服务版本可路由,Istio将以循环方式将请求路由到所有可用版本。

该例子的初始目标是应用规则,将所有流量路由到微服务的v1(版本1)。稍后,将基于HTTP请求标头的值规则来路由流量。

应用虚拟服务(virtual service)

接下来,虚拟服务会将所有流量路由到微服务v1上。

如果你还没有应用 destination rule,请先应用 默认目标规则

  1. 执行以下命令以应用虚拟服务:

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

    请等待几秒钟以使虚拟服务生效。

  2. 使用以下命令显示定义的路由规则:

    $ kubectl get virtualservices -o yaml
    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
    name: details
    ...
    spec:
    hosts:
    - details
    http:
    - route:
      - destination:
          host: details
          subset: v1
    ---
    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
    name: productpage
    ...
    spec:
    gateways:
    - bookinfo-gateway
    - mesh
    hosts:
    - productpage
    http:
    - route:
      - destination:
          host: productpage
          subset: v1
    ---
    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
    name: ratings
    ...
    spec:
    hosts:
    - ratings
    http:
    - route:
      - destination:
          host: ratings
          subset: v1
    ---
    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
    name: reviews
    ...
    spec:
    hosts:
    - reviews
    http:
    - route:
      - destination:
          host: reviews
          subset: v1
    ---
    
  3. 可以使用以下命令显示相应的子集(subset)定义:

    $ kubectl get destinationrules -o yaml
    

现在,已将Istio配置为路由到Bookinfo微服务的v1版本了。

验证新的路由配置

你可以再次刷新/productpage来测试新配置是否生效。

注意,无论刷新多少次,页面的评论部分均不会显示星评。所有流量路由到版本reviews:v1,该版本没有星级评分功能。

现在,您已成功完成此任务的第一部分:将流量路由到其中一个版本了。

根据用户身份进行路由(Route based on user identity)

接下来,更改路由配置,将来自特定用户的所有流量路由到特定服务版本上。本例中,将来自名为Jason的用户的所有流量都将被路由到reviews:v2

请注意,Istio对用户身份没有任何特殊的、内置的理解。这个例子是通过productpage服务为所有向评论服务发出的HTTP请求添加一个自定义的终端用户头来实现的。

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

  1. 运行以下命令以启用基于用户的路由规则:

    $ kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml
    
  2. 确认规则已创建:

    $ kubectl get virtualservice reviews -o 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: v1
    
  3. /productpage上,以用户jason的身份登录。
    刷新浏览器。你看到了什么?每条评论旁边都会出现星级评价。

  4. 以另一个用户的身份登录(选择任何你想要的名字)。
    刷新浏览器。现在星星不见了。这是因为除了Jason之外,所有用户的流量都被路由到review:v1

这样,就已经成功地配置了Istio,使其能够根据用户身份进行流量路由。

了解发生了什么

在此示例中,您使用 Istio 将 100% 的流量发送到每个 Bookinfo 服务的 v1 版本。然后,您设置了一个规则,以根据 productpage 服务添加到请求中的自定义终端用户头,有选择地将流量发送到带有评论功能的 v2 版本。

请注意,Kubernetes服务,如本任务中使用的Bookinfo服务,必须遵守某些限制,以利用Istio的L7路由功能。详情请参考《Pods和服务的要求》

流量转移示例中,您将遵循您在这里学到的相同的基本模式来配置路由规则,实现逐步的将流量从服务的一个版本发送到另一个版本。

清理

  1. 删除应用虚拟服务。

    kubectl delete -f samples/bookinfo/networking/virtual-service-all-v1.yaml
    
  2. 如果你不打算体验后面的功能,请参考Bookinfo清理删除应用程序。

更新于 2020-11-26

查看istio更多相关的文章或提一个关于istio的问题,也可以与我们一起分享文章