【06】VirtualService高级流量功能

5.3 weight

  1. 部署demoapp v10v11版本

    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: demoappv10
        version: v1.0
      name: demoappv10
    spec:
      progressDeadlineSeconds: 600
      replicas: 3
      selector:
        matchLabels:
          app: demoapp
          version: v1.0
      template:
        metadata:
          labels:
            app: demoapp
            version: v1.0
        spec:
          containers:
          - image: ikubernetes/demoapp:v1.0
            imagePullPolicy: IfNotPresent
            name: demoapp
            env:
            - name: "PORT"
              value: "8080"
            ports:
            - containerPort: 8080
              name: web
              protocol: TCP
            resources:
              limits:
                cpu: 50m
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: demoappv11
        version: v1.1
      name: demoappv11
    spec:
      progressDeadlineSeconds: 600
      replicas: 2
      selector:
        matchLabels:
          app: demoapp
          version: v1.1
      template:
        metadata:
          labels:
            app: demoapp
            version: v1.1
        spec:
          containers:
          - image: ikubernetes/demoapp:v1.1
            imagePullPolicy: IfNotPresent
            name: demoapp
            env:
            - name: "PORT"
              value: "8080"
            ports:
            - containerPort: 8080
              name: web
              protocol: TCP
            resources:
              limits:
                cpu: 50m
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: demoapp
    spec:
      ports:
        - name: http
          port: 8080
          protocol: TCP
          targetPort: 8080
      selector:
        app: demoapp
      type: ClusterIP
    ---
    
    
  2. 定义subset

    apiVersion: networking.istio.io/v1beta1
    kind: DestinationRule
    metadata:
      name: demoapp
    spec:
      host: demoapp
      subsets:
      - name: v10
        labels:
          version: v1.0
      - name: v11
        labels:
          version: v1.1
    
  3. 定义基于weight的virtualservice

    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: demoapp
    spec:
      hosts:
      - demoapp
      http:
      - name: weight-based-routing
        route:
        - destination:
            host: demoapp
            subset: v10
          weight: 90
        - destination:
            host: demoapp
            subset: v11
          weight: 10
    
    
  4. 测试

    访问http://demoapp:8080

    在这里插入图片描述

    kiali查看拓扑
    在这里插入图片描述

5.4 rewrite

  1. 定义demoapp v1.0demoapp v1.1版本和subset的dr规则。参考weight中定义

  2. 定义rewrite的virtualservice

    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: demoapp
    spec:
      hosts:
      - demoapp
      http:
      - name: rewrite
        match:
        - uri:
            prefix: /canary
        rewrite:
          uri: /
        route:
        - destination:
            host: demoapp
            subset: v11
      - name: default
        route:
        - destination:
            host: demoapp
            subset: v10
    
    
  3. 测试

    访问:http://demoapp:8080/canary

    在这里插入图片描述

    访问:http://demoapp:8080

    在这里插入图片描述

5.5 header

  1. 定义demoapp v1.0demoapp v1.1版本和subset的dr规则。参考weight中定义

  2. 定义header规则

    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: demoapp
    spec:
      hosts:
      - demoapp
      http:
      - name: canary
        match:
        - headers:
            x-canary:
              exact: "true"
        route:
        - destination:
            host: demoapp
            subset: v11
          headers:
            request:
              set: 
                User-Agent: Chrome   #set字段修改request的value的值
            response:
              add:
                x-canary: "true"  # 在reponse中利用add字段进行添加
      - name: default
        headers:
          response:
            add:
              X-Envoy: test
        route:
        - destination:
            host: demoapp
            subset: v10
    
    
  3. 测试功能

    按照定义的header的vs规则:

    • 当请求demoapp:8080会匹配上default规则,并且在response的header加上x-Envoy: test的标头

      / $ curl -I demoapp:8080
      HTTP/1.1 200 OK
      content-type: text/html; charset=utf-8
      content-length: 114
      server: envoy
      date: Tue, 22 Aug 2023 09:14:02 GMT
      x-envoy-upstream-service-time: 2
      x-envoy: test
      
    • 当请求demoapp:8080加上x-canary: true 的标头,会在reponse中增加标头,以及会将request的User-Agent: Chrome修改

      / $ curl -I -H "x-canary: true" demoapp:8080
      HTTP/1.1 200 OK
      content-type: text/html; charset=utf-8
      content-length: 116
      server: envoy
      date: Tue, 22 Aug 2023 09:18:06 GMT
      x-envoy-upstream-service-time: 2
      x-canary: true
      
      / $ curl -H "x-canary: true" demoapp:8080/user-agent
      User-Agent: Chrome
      / $ 
      

5.6 fault injection

  1. 定义demoapp v1.0demoapp v1.1版本和subset的dr规则。参考weight中定义

  2. 定义fault injection的规则

    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: demoapp
    spec:
      hosts:
      - demoapp
      http:
      - name: canary
        match:
        - uri:
            prefix: /canary
        rewrite:
          uri: /
        route:
        - destination:
            host: demoapp
            subset: v11
        fault:         # 故障注入的一种方式abort,会在发往v11版本的20%的流量上注入abort故障,返回的http code为555
          abort:
            percentage:
              value: 20
            httpStatus: 555
      - name: default
        route:
        - destination:
            host: demoapp
            subset: v10
        fault:
          delay:              # 故障注入的另外一种方式延迟,会在发往v10的版本上20%的流量上注入delay故障,延迟时间为3秒
            percentage:
              value: 20
            fixedDelay: 3s
    
  3. 测试

    • 当访问demoapp:8080/canary的时候,按照上诉定义的规则,会有20%的比例注入abort故障:

      / $ curl demoapp:8080/canary
      iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-77755cdc65-vxmgv, ServerIP: 172.16.140.87!
      / $ curl demoapp:8080/canary
      iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-77755cdc65-k2xzl, ServerIP: 172.16.196.145!
      / $ curl demoapp:8080/canary
      iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-77755cdc65-k2xzl, ServerIP: 172.16.196.145!
      / $ curl demoapp:8080/canary
      iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-77755cdc65-k2xzl, ServerIP: 172.16.196.145!
      / $ curl demoapp:8080/canary
      iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-77755cdc65-vxmgv, ServerIP: 172.16.140.87!
      / $ curl demoapp:8080/canary
      iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-77755cdc65-vxmgv, ServerIP: 172.16.140.87!
      / $ curl demoapp:8080/canary
      iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-77755cdc65-k2xzl, ServerIP: 172.16.196.145!
      / $ curl demoapp:8080/canary
      iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-77755cdc65-k2xzl, ServerIP: 172.16.196.145!
      / $ curl demoapp:8080/canary
      iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-77755cdc65-k2xzl, ServerIP: 172.16.196.145!
      / $ curl demoapp:8080/canary
      iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-77755cdc65-k2xzl, ServerIP: 172.16.196.145!
      / $ curl demoapp:8080/canary
      fault filter abort/ $ 
      
      
    • 当访问demoapp:8080的时候,按照规则,会有20%的流量注入延迟3秒的故障

      / $ curl demoapp:8080
      iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-b5d9576cc-f9vfv, ServerIP: 172.16.140.88!
      / $ curl demoapp:8080
      iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-b5d9576cc-fglcx, ServerIP: 172.16.140.86!
      / $ curl demoapp:8080
      iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-b5d9576cc-qfnw5, ServerIP: 172.16.196.146!
      / $ curl demoapp:8080
      iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-b5d9576cc-fglcx, ServerIP: 172.16.140.86!
      / $ curl demoapp:8080
      iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-b5d9576cc-f9vfv, ServerIP: 172.16.140.88!
      / $ curl demoapp:8080
      iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-b5d9576cc-f9vfv, ServerIP: 172.16.140.88!
      / $ curl demoapp:8080
      ^C
      
      

5.7 retry

  1. 定义demoapp v1.0demoapp v1.1版本和subset的dr规则。参考weight中定义

  2. 定义proxydeploymentgateway 以及virtualservice

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: proxy
    spec:
      progressDeadlineSeconds: 600
      replicas: 1
      selector:
        matchLabels:
          app: proxy
      template:
        metadata:
          labels:
            app: proxy
        spec:
          containers:
            - env:
              - name: PROXYURL
                value: http://demoapp:8080
              image: ikubernetes/proxy:v0.1.1
              imagePullPolicy: IfNotPresent
              name: proxy
              ports:
                - containerPort: 8080
                  name: web
                  protocol: TCP
              resources:
                limits:
                  cpu: 50m
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: proxy
    spec:
      ports:
        - name: http-80
          port: 80
          protocol: TCP
          targetPort: 8080
      selector:
        app: proxy
    ---
    apiVersion: networking.istio.io/v1beta1
    kind: Gateway
    metadata:
      name: proxy-gateway
      namespace: istio-system        # 要指定为ingress gateway pod所在名称空间
    spec:
      selector:
        app: istio-ingressgateway
      servers:
      - port:
          number: 80
          name: http
          protocol: HTTP
        hosts:
        - "fe.icloud2native.com"
    ---
    
  3. demoapp中定义fault

    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: demoapp
    spec:
      hosts:
      - demoapp
      http:
      - name: canary
        match:
        - uri:
            prefix: /canary
        rewrite:
          uri: /
        route:
        - destination:
            host: demoapp
            subset: v11
        fault:         # 故障注入的一种方式abort,会在发往v11版本的20%的流量上注入abort故障,返回的http code为555
          abort:
            percentage:
              value: 50
            httpStatus: 555
      - name: default
        route:
        - destination:
            host: demoapp
            subset: v10
        fault:
          delay:              # 故障注入的另外一种方式延迟,会在发往v10的版本上20%的流量上注入delay故障,延迟时间为3秒
            percentage:
              value: 50
            fixedDelay: 3s
    
  4. 定义retry机制

    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: proxy
    spec:
      hosts:
      - "fe.icloud2native.com"                     # 对应于gateways/proxy-gateway
      gateways:
      - istio-system/proxy-gateway       # 相关定义仅应用于Ingress Gateway上
      - mesh                             # 应用在网格内所有的sidercar上
      http:
      - name: default
        route:
        - destination:
            host: proxy
        timeout: 1s
        retries:
          attempts: 5   # 加上第一次请求,在log里面看到的应该是请求了6次。
          perTryTimeout: 1s # 每次重试超过1s,就会发起第二次重试
          retryOn: 5xx,connect-failure,refused-stream
    
  5. 测试

    上述定义的规则是:后端demoapp注入了abort和delay的故障,前端服务proxy请求demoapp的时候,在proxy中定义了retry,当请求后端出现5xx,connect-failure,refused-stream的时候,会进行retry机制。在前端的log里面看到的应该是请求了6次。

5.8 Traffic mirror

场景:有时候想要用线上真实流量来测试将要上线的服务,这样更能模拟出真实的线上测试效果。所以会将线上真实流量mirror到测试环境。

  1. 定义demoapp v1.0demoapp v1.1版本和subset的dr规则。参考weight中定义

  2. 定义traffic mirror的virtualservice规则

    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: demoapp
    spec:
      hosts:
      - demoapp
      http:
      - name: traffic-mirror
        route:
        - destination:
            host: demoapp
            subset: v10
        mirror:
          host: demoapp
          subset: v11
    
  3. 测试

    我们在客户端请求curl demoapp:8080,虽然请求到了v10 版本,但是我们在v11版本的pod里面看到了有流量进入。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/142408.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构:红黑树的原理和实现

文章目录 红黑树的概念红黑树的性质红黑树的模拟实现红黑树的平衡问题 整体实现和测试 本篇用于进行红黑树的拆解和模拟实现,为之后的map和set的封装奠定基础 红黑树的概念 红黑树也是一种二叉搜索树,但是在每一个节点的内部新增了一个用以表示该节点颜…

【python自动化】Playwright基础教程(八)鼠标操作

【python自动化】Playwright基础教程(八)鼠标操作 本文目录 文章目录 【python自动化】Playwright基础教程(八)鼠标操作playwright系列回顾前文代码click模拟鼠标点击dblclick模拟鼠标双击down模拟鼠标按下move模拟鼠标移动up模拟鼠标释放wheel模拟鼠标滚动鼠标长按常用实战引…

mysql数据库可以执行定时任务

在一些业务需要中,经常需要一些定时任务。如Java的schedule,nodejs的node-schedule等。今天第一次接触了使用数据库的存储过程来执行定时任务。 本篇文章以MySQL数据库为例,介绍通过数据库设置定时任务的方法。本文中以介绍操作过程为主&…

三数之和问题

题目描述 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复的三元组。…

asp.net core mvc之 布局

一、布局是什么? 布局是把每个页面的公共部分,提取成一个布局页面(头、导航、页脚)。 二、默认布局 _Layout.cshtml 默认的布局是在 /Views/Shared 目录的 _Layout.cshtml文件。通常Shared目录中的视图都是公共视图。该目录下的…

瑞利长度(Rayleigh length)

瑞利长度 Rayleigh length 在光学,特别是激光学中,我们设鞍腰部(如图中所示的最低处)为A,其横截面面积为a,沿光的传播方向,当横截面面积因为散射达到2a时,我们设此处为B,…

二维码智慧门牌管理系统升级解决方案:运营可视化之道

文章目录 前言一、系统概述二、数据可视化与运营决策 前言 随着科技的飞速发展和人们生活水平的提高,传统的门牌管理系统已经无法满足现代社会的需求。在这个信息化、智能化的时代,一款升级版的二维码智慧门牌管理系统应运而生,它将以全新的…

Vmware虚拟机重装 虚拟机能ping通主机,而主机不能ping通虚拟机的问题

CClean,用它把你电脑上已经卸载的软件但是注册表还没删干净的把注册表删干净,之前说的那种情况(虚拟网络编辑器打不上勾)就迎刃而解了。 Ps:CClean:再网上百度就可以查到,软件对用户也很友好&a…

(11.13 知识总结(路由层)

一、路由层 1.1路由匹配 1.1.1 什么是路由? 路由可以看成是跟在 ip 和 port 之后的地址 1.1.2 url( ) 方法 # 示例 urlpatterns [ url(r^admin/, admin.site.urls), url(r^login/, views.login_func), url(r^register/$, views.register_func), ] url…

【异步并发编程】使用aiohttp构建Web应用程序

文章目录 1. 写在前面1. 什么是aiohttp?1.1. 什么是异步编程? 2. 安装aiohttp3. 异步HTTP服务器4. 异步请求5. aiohttp REST实例 【作者主页】:吴秋霖 【作者介绍】:Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力…

iOS:何为空指针和野指针

一:什么是空指针和野指针 1、空指针 ①.没有存储任何内存地址的指针就成为空指针(NULL指针) ②.空指针就是被赋值为0的指针,在没有被具体初始化之前,其值为0. //以下都是空指针,eg: Person *p1 NULL; …

Linux上C++通过LDAP协议使用kerberos认证AES加密连接到AD服务器

一.前言 记录自己在实现这个流程遇到的各种问题,因为我也是看了许多优质的文章以及组内大佬的帮助下才弄成的,这里推荐一个大佬的文章,写的非常优秀,比我这篇文章写得好得很多,最后我也是看这个大佬的代码最终才实现的…

一行JavaScrip可以做什么?

说在前面 JavaScript 提供了许多方便的方法和操作符来简化常见的任务,使得编程变得更加高效和便捷。无论是数学计算、字符串处理还是数据操作,JavaScript 都能帮助我们以简洁的方式实现所需功能。 代码 1、生成指定范围内的随机整数 const randomInt …

部分背包问题【贪心算法】

部分背包问题是一种经典的贪心问题,物品可以取一部分,也就是可以随意拆分的物品。 算法思路: 用列表保存每个物品的价值及总重量、平均价值(性价比)。输入数据同时计算每种物品的平均价值。使用自定义的compare函数以…

2023亚太杯数学建模思路 - 复盘:校园消费行为分析

文章目录 0 赛题思路1 赛题背景2 分析目标3 数据说明4 数据预处理5 数据分析5.1 食堂就餐行为分析5.2 学生消费行为分析 建模资料 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 赛题背景 校园一卡通是集…

苹果独占鳌头,国产手机围攻,双十一“照妖镜”显露谁有真实力

随着双十一购物节的结束,电商平台也给出了各手机品牌的销量数据,苹果毫无疑问成为双十一的赢家,不过两家国产手机品牌也显露了他们的实力,已具有与苹果一战之力。 与去年双十一和今年618类似,苹果仍然占据热销榜前列&a…

信驰达科技加入车联网联盟(CCC),推进数字钥匙发展与应用

CCC)的会员。 图 1 深圳信驰达正式成为车联网联盟(CCC)会员 车联网联盟(CCC)是一个跨行业组织,致力于推动智能手机与汽车连接解决方案的技术发展。CCC涵盖了全球汽车和智能手机行业的大部分企业,拥有150多家成员公司。CCC成员公司包括智能手机和汽车制造…

TLP超线程技术

在实现IPL指令级并行的同时实现TLP(Thread Level Parallelism)线程级并行实现多线程有两种主要的方法超线程即同时多线程,在单个处理器或单个核中设置了两套线程状态部件,共享高速缓存和功能部件当两个线程同时需要某个资源时,其中一个线程必…

Mac 本地部署thinkphp8【配置环境】

PHP开发工具 我这里选择的是VSCode,里面安装PHP插件 把thinkphp的项目放到 切换到phpenv ![在这里插入图片描述](https://img-blog.csdnimg.cn/a15cc442fab74754ad86d74f6d9942e5.png URL重写如果不改,在请求的时候地址是这样的‘http://tp.com/index.php…

Prim算法(C++)

目录 介绍: 代码: 结果: 介绍: Prim算法是一种用于解决最小生成树问题的贪心算法。该算法的主要思想是从一个顶点开始,不断向图中添加边,直到构成一棵包含所有顶点的生成树,使得树的边权之…