备考ICA----Istio实验4---使用 Istio 进行金丝雀部署

news2024/12/23 3:34:08

备考ICA----Istio实验4—使用 Istio 进行金丝雀部署

上一个实验已经通过DestinationRule实现了部分金丝雀部署的功能,这个实验会更完整的模拟展示一个环境由v1慢慢过渡到v2版本的金丝雀发布.

1. 环境清理

kubectl delete gw/helloworld-gateway vs/helloworld dr/helloworld-destination

测试

kubectl get svc,pods
for i in {1..10};do curl $(kubectl get svc helloworld|grep helloworld|awk '{print $3":"$5}'|awk -F"/" '{print $1"/hello"}');sleep .5 ;done
kubectl get gw,vs,dr

在这里插入图片描述
恢复到这样就可以通过helloworld的svc将流量随机分配到v1和v2上
如果实验环境有问题,就重新部署hello

kubectl delete -f istio/samples/helloworld/helloworld.yaml
kubectl apple -f istio/samples/helloworld/helloworld.yaml

2. 所有流量转发到v1

这步就模拟只存在1个版本的环境
canary/helloworld-canary-all-v1.yaml

apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: helloworld-gateway
spec:
  selector:
    istio: ingressgateway # use istio default controller
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"
---
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: helloworld-destination
spec:
  host: helloworld
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2
---
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: helloworld
spec:
  hosts:
  - "*"
  gateways:
  - helloworld-gateway
  http:
  - match:
    - uri:
        exact: /hello
    route:
    - destination:
        host: helloworld
        port:
          number: 5000
        subset: v1
      weight: 100

部署gw,vs,dr

kubectl apply -f canary/helloworld-canary-all-v1.yaml

测试效果
此时所有流量都交由v1进行响应

for i in {1..10};do curl http://192.168.126.220/hello;sleep .5;done

在这里插入图片描述
在这里插入图片描述

3. 90%流量v1,10%流量v2

此时v2版本应用已经上线,将10%流量给v2,其余流量仍由v1进行应答

3.1 配置流量分发比例

canary/helloworld-canary-allin1-10v2.yaml

apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: helloworld-gateway
spec:
  selector:
    istio: ingressgateway # use istio default controller
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"
---
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: helloworld-destination
spec:
  host: helloworld
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2
---
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: helloworld
spec:
  hosts:
  - "*"
  gateways:
  - helloworld-gateway
  http:
  - match:
    - uri:
        exact: /hello
    route:
    - destination:
        host: helloworld
        port:
          number: 5000
        subset: v1
      weight: 90
    - destination:
        host: helloworld
        port:
          number: 5000
        subset: v2
      weight: 10

部署gw,vs,dr

kubectl apply -f canary/helloworld-canary-allin1-10v2.yaml 

测试效果
可以看到10个请求中有1个由v2应答,其他仍由v1进行响应
在这里插入图片描述
在这里插入图片描述

3.2 加入Hpa

---
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: hpa-helloworld-v1
spec:
  maxReplicas: 20
  minReplicas: 1
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: helloworld-v1
  targetCPUUtilizationPercentage: 50
---
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: hpa-helloworld-v2
spec:
  maxReplicas: 20
  minReplicas: 1
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: helloworld-v2
  targetCPUUtilizationPercentage: 50

部署hpa

kubectl apply -f canary/hpa.yaml

3.3 压测

 while true;do curl http://192.168.126.220/hello;done

产生大量请求
在这里插入图片描述

此时v1,v2因访问量大触发hpa扩容,直到v1到达上线16个pod,v2到达3个

在这里插入图片描述

4. 50%流量v1,50%流量v2

4.1 配置流量分发比例

dr和gw部分就不用动了.只要修改vs的weight部分就可以
canary/helloworld-canary-vs-50v2.yaml

---
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: helloworld
spec:
  hosts:
  - "*"
  gateways:
  - helloworld-gateway
  http:
  - match:
    - uri:
        exact: /hello
    route:
    - destination:
        host: helloworld
        port:
          number: 5000
        subset: v1
      weight: 50
    - destination:
        host: helloworld
        port:
          number: 5000
        subset: v2
      weight: 50

部署

kubectl apply -f canary/helloworld-canary-vs-50v2.yaml

4.2 压测

此时流量以1:1分发给v1和v2
在这里插入图片描述

再观测hpa的情况会发现v2的cpu逐渐升高,v1的cpu逐渐降低,v2开始扩容,v1开始缩容,逐渐扩缩容到10:10
在这里插入图片描述
在这里插入图片描述

5. 所有流量转发v2

51. 配置流量分发比例

中间的10%,90%其实和前2个版本差不多,直接修改下数值就可以了.我们这里就忽略了,有兴趣的老哥可以进一步的修改模拟.
这里就模拟经过测试v2版本已经没有问题,我们将所有流量打到v2上
canary/helloworld-canary-all-v2.yaml

---
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: helloworld
spec:
  hosts:
  - "*"
  gateways:
  - helloworld-gateway
  http:
  - match:
    - uri:
        exact: /hello
    route:
    - destination:
        host: helloworld
        port:
          number: 5000
        subset: v2
      weight: 100

部署

kubectl apply -f canary/helloworld-canary-all-v2.yaml

5.2 压测

while true;do curl http://192.168.126.220/hello;done

在这里插入图片描述
在这里插入图片描述
至此canary的一个模拟从v1到v2的版本切换就已经完成了

6. 拓展Canary+AB测试

6.1 canary+ab配置

当我们进行canary测试的时候,普通用户是以50%:50%的流量分发到2个版本上,但我们希望测试人员trump同学,每次都是访问到新上线的v2版本上.
canary/canary-ab-vs.yaml

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: helloworld
spec:
  hosts:
  - "*"
  gateways:
  - helloworld-gateway
  http:
  - match:
    - headers:
        user:
          exact: trump
      uri:
        exact: /hello
    route:
    - destination:
        host: helloworld
        port:
          number: 5000
        subset: v2
      weight: 100
  - route:
    - destination:
        host: helloworld
        port:
          number: 5000
        subset: v1
      weight: 50
    - destination:
        host: helloworld
        port:
          number: 5000
        subset: v2
      weight: 50

部署应用

kubectl apply -f canary/canary-ab-vs.yaml

在这里插入图片描述

6.2 测试

6.2.1 普通用户测试

这部分用户进准的按1:1流量访问v1和v2

for i in {1..20};do curl http://192.168.126.220/hello;done

在这里插入图片描述
在这里插入图片描述

6.2.2 测试人员访问

当测试人员trump访问时,匹配header中的用户名为trump,流量就被100%的打到v2版本上

for i in {1..20};do curl -H "user:trump" http://192.168.126.220/hello;done

在这里插入图片描述
在这里插入图片描述
至此整个金丝雀部署完成

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Arduino IDE 野火ESP8266模块 EEPROM 存储开发

一、操作存储器 我们可以使用ESP8266模块的EEPROM,也就是可读可擦存储器,可以掉电不丢失地帮我们存储一些数据。ESP8266微控制器有一个闪存区(Flash memory) 来模拟Arduino的EEPROM。这是微控制器中一个特殊的内存位置,即使在主板关闭后&…

Redis的安装与启动

一、Linux环境安装&启动Redis 第一步:在官网下载好Redis安装包,上传到Linux中并进行解压到相应(如/opt/software/)目录中;(注意:完成了第二步后,即安装了C/C语言编译器后&#…

中型企业网络路由器配置(ensp)实验

vlan、vlan间路由、ospf协议等来实现三层交换机和单臂路由之间的通信 拓扑图: 1. 配置三层交换机vlan和vlan间路由 SW1 #进入视图 sys sysn sw1 undo info-center enable#配置vlan vlan batch 10 20 30 40 50 60#配置access口 int g0/0/1 port link-type access …

Web前端笔记+表单练习+五彩导航

一、笔记 表单&#xff1a;数据交互的一种方式 登录、注册、搜索 <from> <input type""> --- <input type"text"> --- 普通输入框&#xff0c;内容在一行显示 <input type"password"> --- 密码框 <input type"…

python拍卖行系统的设计与实现flask-django-nodejs-php

此系统设计主要采用的是python语言来进行开发&#xff0c;采用django/flask框架技术&#xff0c;框架分为三层&#xff0c;分别是控制层Controller&#xff0c;业务处理层Service&#xff0c;持久层dao&#xff0c;能够采用多层次管理开发&#xff0c;对于各个模块设计制作有一…

Linux系统------------MySQL事务

目录 一、MySQL事务的概念 二、事务的ACID特点 ●原子性 ●一致性 ●隔离性 ●持久性 事务之间的相互影响有以下几种&#xff1a; ①脏读 ②不可重复读 ③幻读 ④丢失更新 三、Mysql及事务隔离级别 3.1Mysql及事务隔离级别 &#xff08;1&#xff09;read…

搭建基于 Snowflake 的 CI/CD 最佳实践!

Snowflake 提供了可扩展的计算和存储资源&#xff0c;和基于 SQL 的界面 Snowsight&#xff0c;方便用户进行数据操作和分析。然而&#xff0c;如果用户想将自己的 CI/CD 流程与 Snowflake 集成时&#xff0c;会发现一些不便之处&#xff08;尤其相比其 SnowSight 优秀的查询能…

API调试管理工具Postman下载及操作介绍

1.下载安装postman地址&#xff1a;https://www.getpostman.com/downloads/ 2.创建项目 3.创建请求API 然后点击save保存api 4.用一个变量保存主域名&#xff0c;方便后续操作 就类似下面的baseurl 5.创建新环境 6.添加变量&#xff08;如添加本地测试环境url——ba…

ThingsBoard初始化数据库Postgres+Cassandra

本章将介绍ThingsBoard初始化数据PostgresCassandra&#xff0c;两种数据库结合使用&#xff0c;以及源码的编译安装。本机环境&#xff1a;Centos7、Docker、Postgres、Cassandra 环境安装 开发环境要求&#xff1a; docker &#xff1b;Docker&#xff1b;Postgres:Cassandr…

nodejs各版本下载

https://registry.npmmirror.com/binary.html 然后进入nodejs各个版本&#xff0c;然后按需选择

Qt 利用共享内存实现一次只能启动一个程序(单实例运行)

Qt 利用共享内存实现一次只能启动一个程序 文章目录 Qt 利用共享内存实现一次只能启动一个程序摘要利用共享内存实现一次只能启动一个程序示例代码 关键字&#xff1a; Qt、 unique、 单一、 QSharedMemory、 共享内存 摘要 今天接着在公司搞我的屎山代码&#xff0c;按照…

unbantu Apache的基本配置与配置静态资源访问

目录 前言: 1.Apache介绍 2.安装Apache 3. 测试Apache服务是否启动成功 3.1配置Servername 3.2重启服务 4.配置Apache主页面 5. 配置静态的资源 6.为静态资源设置访问权限(基于源地址) 致谢: 前言: 此博客是基于unbantu的Apache服务的详细解析&#xff0c;在这片博…

专业130+总分410+西南交通大学924信号与系统考研经验西南交大电子信息通信工程,真题,大纲,参考书。

初试分数出来&#xff0c;专业课924信号与系统130&#xff0c;总分410&#xff0c;整体上发挥正常&#xff0c;但是还有遗憾&#xff0c;其实自己可以做的更好&#xff0c;总结一下经验&#xff0c;希望对大家有所帮助。专业课&#xff1a;&#xff08;130&#xff09; 西南交…

(附源码)基于Spring Boot + Vue 在线网课学习系统的设计与实现

前言 &#x1f497;博主介绍&#xff1a;✌专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅&#x1f447;&#x1f3fb; 2024年Java精品实战案例《100套》 &#x1f345;文末获取源码联系&#x1f345; &#x1f31…

仿京东项目——京西商城(数据库设计)

文章目录 仿京东——京西商城数据库设计建立E-R图数据库表设计用户表商品表订单表订单详情表评论表购物车表购物车项表 仿京东——京西商城 数据库设计 主要实体有&#xff1a; 用户 用户ID&#xff08;User_ID&#xff09;&#xff1a;唯一标识用户的主键 用户名&#xff0…

关于在vue中有时候表格的位置不对是怎么个情况

今天在写代码的时候多了一个<div>标签&#xff0c;导致表格的位置大小不对 <template><div><tr><td><input type"checkbox" checked"true" /></td><td>xxxxx</td><td><button class"…

Airgorah:一款功能强大的WiFi安全审计工具

关于Airgorah Airgorah是一款功能强大的WiFi安全审计工具&#xff0c;该工具可以轻松发现和识别连接到无线接入点的客户端&#xff0c;并对特定的客户端执行身份验证攻击测试&#xff0c;捕捉WPA握手包&#xff0c;并尝试破解接入点的密码。在该工具的帮助下&#xff0c;广大研…

AcWing 1360. 有序分数(每日一题)

目录 题目&#xff1a; 枚举版&#xff1a; 递归版&#xff08;Stern-Brocot Tree&#xff09;&#xff1a; 总结&#xff1a; 原题链接&#xff1a;1360. 有序分数 - AcWing题库 题目&#xff1a; 给定一个整数 N&#xff0c;请你求出所有分母小于或等于 N&#xff0c;大…

Flutter 项目架构技术指南

Flutter 项目架构技术指南 视频 https://www.bilibili.com/video/BV1rx4y127kN/ 前言 原文 https://ducafecat.com/blog/flutter-clean-architecture-guide 探讨Flutter项目代码组织架构的关键方面和建议。了解设计原则SOLID、Clean Architecture&#xff0c;以及架构模式MVC…

Spring MVC(三)- 处理器与注解

Spring MVC 用Controller及RestController 注解来标志&#xff08;自动扫描并注册成bean&#xff09;该类是一个控制器容器类,在该类下&#xff0c;使用RequestMapping及其扩展注解来定义处理器。使用注解&#xff0c;可以定义请求的映射、请求的输入、异常处理等。 1 映射请求…