使用istio我们可以根据权重和HTTP headers来动态配置请求路由。

基于内容的路由

因为BookInfo示例部署了3个版本的评论微服务,我们需要设置一个默认路由。 否则,当你多次访问应用程序时,会注意到有时输出包含星级,有时候又没有。 这是因为没有明确的默认版本集,Istio将以随机方式将请求路由到服务的所有可用版本。

注意:假定您尚未设置任何路由。如果您已经为示例创建了冲突的路由规则,则需要在以下命令中使用replace而不是create。

下面这个例子能够根据网站的不同登陆用户,将流量划分到服务的不同版本和实例。跟kubernetes中的应用一样,所有的路由规则都是通过声明式的yaml配置。关于reviews:v1reviews:v2的唯一区别是,v1没有调用评分服务,productpage页面上不会显示评分星标。

  1. 将微服务的默认版本设置成v1。

    istioctl create -f samples/apps/bookinfo/route-rule-all-v1.yaml

    使用以下命令查看定义的路由规则。

    istioctl get route-rules -o yaml
    type: route-rule
    name: details-default
    namespace: default
    spec:
    destination: details.default.svc.cluster.local
    precedence:
    route:
    - tags:
    version: v1
    ---
    type: route-rule
    name: productpage-default
    namespace: default
    spec:
    destination: productpage.default.svc.cluster.local
    precedence:
    route:
    - tags:
    version: v1
    ---
    type: route-rule
    name: reviews-default
    namespace: default
    spec:
    destination: reviews.default.svc.cluster.local
    precedence:
    route:
    - tags:
    version: v1
    ---
    type: route-rule
    name: ratings-default
    namespace: default
    spec:
    destination: ratings.default.svc.cluster.local
    precedence:
    route:
    - tags:
    version: v1
    ---

    由于对代理的规则传播是异步的,因此在尝试访问应用程序之前,需要等待几秒钟才能将规则传播到所有pod。

  2. 在浏览器中打开BookInfo URL(http://$GATEWAY_URL/productpage ,我们在上一节中使用的是 http://ingress.istio.io/productpage )您应该会看到BookInfo应用程序的产品页面显示。 注意,产品页面上没有评分星,因为reviews:v1不访问评级服务。

  3. 将特定用户路由到reviews:v2

    为测试用户jason启用评分服务,将productpage的流量路由到reviews:v2实例上。

    istioctl create -f samples/apps/bookinfo/route-rule-reviews-test-v2.yaml

    确认规则生效:

    istioctl get route-rule reviews-test-v2
    destination: reviews.default.svc.cluster.local
    match:
    httpHeaders:
    cookie:
    regex: ^(.*?;)?(user=jason)(;.*)?$
    precedence:
    route:
    - tags:
    version: v2
  4. 使用jason用户登陆productpage页面。

    你可以看到每个刷新页面时,页面上都有一个1到5颗星的评级。如果你使用其他用户登陆的话,将因继续使用reviews:v1而看不到星标评分。

内部实现

在这个例子中,一开始使用istio将100%的流量发送到BookInfo服务的reviews:v1的实例上。然后又根据请求的header(例如用户的cookie)将流量选择性的发送到reviews:v2实例上。

验证了v2实例的功能后,就可以将全部用户的流量发送到v2实例上,或者逐步的迁移流量,如10%、20%直到100%。

如果你看了故障注入这一节,你会发现v2版本中有个bug,而在v3版本中修复了,你想将流量迁移到reviews:v1迁移到reviews:v3版本上,只需要运行如下命令:

  1. 将50%的流量从reviews:v1转移到reviews:v3上。

    istioctl replace -f samples/apps/bookinfo/route-rule-reviews-50-v3.yaml

    注意这次使用的是replace命令,而不是create,因为该rule已经在前面创建过了。

  2. 登出jason用户,或者删除测试规则,可以看到新的规则已经生效。

    删除测试规则。

    istioctl delete route-rule reviews-test-v2
    istioctl delete route-rule ratings-test-delay

    现在的规则就是刷新productpage页面,50%的概率看到红色星标的评论,50%的概率看不到星标。

    注意:因为使用Envoy sidecar的实现,你需要刷新页面很多次才能看到接近规则配置的概率分布,你可以将v3的概率修改为90%,这样刷新页面时,看到红色星标的概率更高。

  3. 当v3版本的微服务稳定以后,就可以将100%的流量分摊到reviews:v3上了。

    istioctl replace -f samples/apps/bookinfo/route-rule-reviews-v3.yaml

    现在不论你使用什么用户登陆productpage页面,你都可以看到带红色星标评分的评论了。

k8s istio 配置请求的路由规则的更多相关文章

  1. [Istio]流量管理API v1alpha3路由规则

    Istio提供一个API进行流量管理,该API允许用户将请求路由到特定版本的服务,为弹性测试注入延迟和失败,添加断路器等,所有这些功能都不必更改应用程序本身的代码.Istio 1.0中引入新的流量管理 ...

  2. Knative 实战:如何在 Knative 中配置自定义域名及路由规则

    作者 | 元毅 阿里云智能事业群高级开发工程师 当前 Knative 中默认支持是基于域名的转发,可以通过域名模板配置后缀,但目前对于用户来说并不能指定全域名设置.另外一个问题就是基于 Path 和 ...

  3. MVC系列——MVC源码学习:打造自己的MVC框架(三:自定义路由规则)

    前言:上篇介绍了下自己的MVC框架前两个版本,经过两天的整理,版本三基本已经完成,今天还是发出来供大家参考和学习.虽然微软的Routing功能已经非常强大,完全没有必要再“重复造轮子”了,但博主还是觉 ...

  4. MVC之路由规则 (自定义,约束,debug)

    自定义路由规则的要求,小范围写在前,大范围写在后.路由规则可以注册多条,路由规则的名称不能重复路由规则有顺序,并且按照顺序进行匹配,建议小范围写在前,大范围写在后.路由规则可以设置约束 即正则表达式路 ...

  5. Spring Cloud Zuul路由规则动态更新

    背景  Spring Cloud Zuul 作为微服务的网关,请求经过zuul路由到内部的各个service,由于存在着新增/修改/删除服务的路由规则的需求,zuul的路由规则的动态变更功能 提供了 ...

  6. ASP.NET Web API路由规则(二)

    默认的规则 在ASP.NET MVC4中 global.asax.cs代码中并无注册默认路由规则的代码 代码如下: public class WebApiApplication : System.We ...

  7. ASP.NET MVC4 ASP.NET Web API路由规则

    using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Web.Ht ...

  8. ASP.NET Web API路由规则(二) 【转】

    http://www.cnblogs.com/liulun/archive/2012/06/20/2556556.html 默认的规则 在ASP.NET MVC4中 global.asax.cs代码中 ...

  9. Flask框架(二)—— 反向解析、配置信息、路由系统、模板、请求响应、闪现、session

    Flask框架(二)—— 反向解析.配置信息.路由系统.模板.请求响应.闪现.session 目录 反向解析.配置信息.路由系统.模板.请求响应.闪现.session 一.反向解析 1.什么是反向解析 ...

随机推荐

  1. 初次尝试PHP——一个简单的对数据库操作的增删改查例子

    第一次学习PHP,很多人说PHP是最好的语言,学习了一点点,还不敢说这样的话,不过确实蛮好用的. 做了一个简单的对数据库的增删改查的操作,主要是将四种操作写成了独立的函数,之后直接调用函数.以下是代码 ...

  2. 三维重建:多点透视cvSolvePNP的替代函数(Code)

           在调试JNI程序时,所有的Shell都已经加载完成,而唯一真正核心的cv::SolvePnP却不能在JNI里面获得通行证,经过反复测试都不能运行,因此只能忍痛舍弃,自行编写一个具有相 ...

  3. 三维重建:SLAM算法的考题总结

    参考英文维基:https://en.wikipedia.org/wiki/Slam 参考文档:视觉slam研究分析的一点认识 1. 请简单描述您对机器人的SLAM的概念理解? 答: 机器人需要在自身位 ...

  4. WebGL画点程序v3

    本文程序实现画一个点的任务,如下图.其中,点的颜色由Javascript传到片元着色器程序中. 整个程序包含两个文件,分别是: 1. HelloPoint3.html <!DOCTYPE HTM ...

  5. EF CodeFirst 基础命令

    PM> enable-migrations 已在项目"EasyWeChat.Data"中启用迁移.若要覆盖现有迁移配置,请使用 -Force 参数. PM> add-m ...

  6. python核心编程中的对象值比较VS对象身份比较(转载)

    转载地址: https://blog.csdn.net/Mluka/article/details/51076786 在python核心编程第四章中,P69在优化下面这段代码时提出了:对象值比较VS对 ...

  7. Js 字符串中提取数字

    一 parseInt()方法: 首先想到的是js提供的parseInt方法,例子: var str ="4500元"; var num = parseInt(str); alert ...

  8. Spark中Task,Partition,RDD、节点数、Executor数、core数目的关系和Application,Driver,Job,Task,Stage理解

    梳理一下Spark中关于并发度涉及的几个概念File,Block,Split,Task,Partition,RDD以及节点数.Executor数.core数目的关系. 输入可能以多个文件的形式存储在H ...

  9. lvs直接路由模式DR模式

    1)实验所有关闭防火墙systemtcl stop firewalldsystemctl disable firewalldsetenforce 0iptables -F2)配置负载调度器配置虚拟IP ...

  10. 【VIP视频网站项目二】搭建爱奇艺优酷腾讯视频官网首页轮播图效果及实现原理分析

    这个是实现的效果,基本上轮播效果和主流网站的一致,但是我也在上面优化了一些效果, 可以在线预览效果:https://vip.52tech.tech/ 目前项目代码已经全部开源:项目地址:https:/ ...