当前位置: 首页 > news >正文

Istio入门体验系列——基于Istio的灰度发布实践


导言:灰度发布是指在项目迭代的过程中用平滑过渡的方式进行发布。灰度发布可以保证整体系统的稳定性,在初始发布的时候就可以发现、调整问题,以保证其影响度。作为Istio体验系列的第一站,本文基于Istio的流量治理机制,针对最简单的几种业务场景进行了实践,为后续的探索学习提供了一个思路和实践案例。

文章目录

  • 一、背景介绍
  • 1.1 灰度发布概述
  • 1.2 基于kubernetes的灰度发布
  • 1.3 基于Istio的灰度发布
  • 二、前置条件
  • 2.1 实验环境搭建
  • 2.2 服务网格监控组件的安装与配置
  • 2.2.1 Kiali的安装
  • 2.2.2 配置Kiali控制面板对外访问
  • 2.3 实验项目部署
  • 2.3.1 项目简介
  • 2.3.2 Weather Forecast 部署
  • 三、实验过程
  • 3.1 初始状态部署
  • 3.2 基于流量比例的路由
  • 3.3 基于请求内容的发布
  • 3.4 多服务同时发布
  • 3.5 自动化部署
  • 四、总结

一、背景介绍

1.1 灰度发布概述

在新版本上线时,不管是在技术上考虑产品的稳定性等因素,还是在商业上考虑新版本被用户接受的程度,直接将老版本全部升级是非常有风险的。所以一般的做法是,新老版本同时在线,新版本只切分少量流量出来,在确认新版本没有问题后,再逐步加大流量比例。这正是灰度发布要解决的问题。其核心是能配置一定的流量策略,将用户在同一个访问入口的流量导到不同的版本上。有如下几种典型场景。

  • 蓝绿发布

蓝绿发布是指不停止老版本,部署新版本,然后进行测试,确认没有问题之后,再将流量全量切到新版本,然后老版本同时也升级到新版本。这样做的好处是无需停机,并且风险较小。

20210219221322136.jpg_x-oss-process_image_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTc2MjE3Mw_size_16_color_FFFFFF_t_70_pic_center

其发布的步骤大致如下:

  1. 部署版本1的应用(一开始的状态),所有外部请求的流量都打到这个版本上;
  2. 部署版本2的应用,版本2的代码与版本1不同(新功能、Bug修复等);
  3. 将流量从版本1切换到版本2,即流量从v1:v2为100:0,切换为0:100;
  4. 如果版本2存在问题,需要回滚到版本1,进行流量切换回v1:v2为100:0。

    • A/B测试
      A/B测试的场景比较明确,就是同时在线上部署A和B两个对等的版本来接收流量,按一定的目标选取策略让一部分用户使用A版本,让一部分用户使用B版本,收集这两部分用户的使用反馈,即对用户采样后做相关比较,通过分析数据来最终决定采用哪个版本。蓝绿发布则主要用于安全稳定地发布新版本应用,而A/B测试则是用来测试应用功能表现的一种方法。
    • 金丝雀发布
      金丝雀发布是指通过让一小部分用户流量引入的新版本进行测试,就像把一个金丝雀塞到瓦斯井里面一样,探测这个新版本在环境中是否可用,在观察到新版本没有问题后再增加切换的比例,直到全部切换完成,是一个渐变、尝试的过程。如在过程中出现任何问题,则可以中止并回滚到旧版本。最简单的方式是随机选择百分比请求到金丝雀版本,但在更复杂的方案下,则可以基于请求的内容、特定范围的用户或其他属性等。
      ![在这里插入图片描述][Image 1]

      20210219222820450.jpg_x-oss-process_image_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTc2MjE3Mw_size_16_color_FFFFFF_t_70_pic_center

1.2 基于kubernetes的灰度发布

在Kubernetes环境下可以基于Pod的数量比例分配流量。如下图所示,B服务的两个版本v2和v1分别有2个和3个实例,当流量被均衡地分发到每个实例上时,前者可以得到40%的流量,后者可以得到60%的流量,从而达到流量在两个版本间分配的效果。
 

20210219223015381.png_x-oss-process_image_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTc2MjE3Mw_size_16_color_FFFFFF_t_70_pic_center


给v1和v2版本设置对应比例的Pod数量,依靠Kube-proxy把流量均衡地分发到目标后端,可以解决一个服务的多个版本分配流量的问题,但是限制非常明显:首先,要求分配的流量比例必须和Pod数量成比例,试想,基于这种方式支持 3:97 比例的流量基本上是不可能的;另外,这种方式不支持根据请求的内容来分配流量,比如要求Chrome浏览器发来的请求和IE浏览器发来的请求分别访问不同的版本。有没有一种更细粒度的分流方式?答案当然是有,Istio就可以。Istio叠加在Kubernetes之上,从机制上可以提供比Kubernetes更细的服务控制粒度及更强的服务管理能力。

1.3 基于Istio的灰度发布

Istio本身并没有关于灰度发布的规则定义,灰度发布只是流量治理规则的一种典型应用,在进行灰度发布时,只要写个简单的流量规则配置即可。Istio在每个Pod里都注入了一个Envoy,因而只要在控制面配置分流策略,对目标服务发起访问的每个Envoy便都可以执行流量策略,完成灰度发布功能。

在使用Istio实现灰度发布的情况下,流量路由和副本部署是两个完全独立的功能。服务的pod数量可以根据流量负载灵活伸缩,与版本流量路由的控制完全无关。这在自动缩放的情况下能够更加简单地管理金丝雀版本。Istio的路由规则非常灵活,可以支持细粒度控制流量百分比(例如,路由1%的流量而不需要100个pod),也可以使用其他规则来控制流量(例如,将特定用户的流量路由到金丝雀版本)。

为了更加直观的验证和说明,接下来我们就通过搭建实验环境来模拟各种业务场景下的灰度发布。

二、前置条件

2.1 实验环境搭建

由于个人电脑的网络和内存限制,本人是直接选择了在腾讯云服务器上安装Minikube和Kubectl,然后下载最新版本的Istio1.9,最后通过istioctl工具进行安装。安装过程不再赘述,具体可参考:
http://km.oa.com/group/34294/articles/show/410837

不过安装较新版本Istio的同学需要注意一下的是Istio 1.9 支持的kubernets版本要求不能低于v1.17,所以在用minikube启动kubernetes集群时必须指定好版本:

 
  1. $ minikube start --vm-driver=none --kubernetes-version v1.18.15

具体环境和版本清单如下:

  • 64位Cenos7.6:2核4G(最低配置要求)
  • Minikube == v1.17.1
  • Docker == v1.13.1
  • Kubernetes == v1.18.15
  • Istio == v1.9.0

2.2 服务网格监控组件的安装与配置

2.2.1 Kiali的安装

Kiali 是一个为 Istio 提供图形化界面和丰富观测功能的 Dashboard 的开源项目,其名称源于希腊语,意思是望远镜。用户利用 Kiali 可以监测网格内服务的实时工作状态,管理Istio的网络配置,快速识别网络问题。但是从Istio 1.7开始,默认不安装控制面板Kiali等组件,所以需要用户自行单独安装控制面板Kiali及相关的组件。

首先进入到Istio的安装包解压目录下,然后通过以下命令安装:

 
  1. [root@chon istio-1.9.0]# kubectl apply -f samples/addons
  2. [root@chon istio-1.9.0]# kubectl apply -f samples/addons/extras

安装时,由于网络原因,可能会报错,重试几次就好了。安装完成后,通过kubectl 命令查询相关pod的运行状态:

 
  1. [root@chon istio-1.9.0]# kubectl get pod -n istio-system
  2. NAME READY STATUS RESTARTS AGE
  3. grafana-94f5bf75b-fvlrt 1/1 Running 0 7h14m
  4. istio-egressgateway-5b475b9856-lzwwm 1/1 Running 0 24h
  5. istio-ingressgateway-648778567c-4gddl 1/1 Running 0 24h
  6. istiod-7cccc657f6-ng9r2 1/1 Running 0 24h
  7. jaeger-5c7675974-fmw4n 1/1 Running 0 7h14m
  8. kiali-d4fdb9cdb-wdj2v 1/1 Running 0 7h14m
  9. prometheus-7d76687994-p6whv 2/2 Running 0 7h14m
  10. zipkin-679599ffd8-xxb8l 1/1 Running 0 7h1m

2.2.2 配置Kiali控制面板对外访问

查看kiali服务,发现其类型为ClusterIP,没有对外暴露端口,无法从外部访问:

 
  1. [root@chon istio-1.9.0]# kubectl get service kiali -n istio-system
  2. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)
  3. kiali ClusterIP 10.105.136.82 <none> 20001:/TCP,9090/TCP

所以此时需要通过NodePort的方式对外暴露控制面板,我们将原来的ClusterIP类型的service导出yaml文件,通过删除注解、创建信息、状态字段及ClusterIP等信息将类型改NodePort,然后使用kubectl apply -f 创建:

 
  1. [root@chon istio-1.9.0]# kubectl get svc -n istio-system kiali -o yaml > kiali-nodeport.yaml
  2. [root@chon istio-1.9.0]# vi kiali-nodeport.yaml
  3. #主要删除metadata下的annotation, resourceVersion,seflFlink, uid; 以及spec下的ClusterIP,修改类型为NodePort, 同时删除status状态字段即可。
  4. [root@chon istio-1.9.0]# kubectl apply -f kiali-nodeport.yaml

此时再查看kiali的service,可以看到已经可以端口已经暴露出来:

 
  1. [root@chon istio-1.9.0]# kubectl get service kiali -n istio-system
  2. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  3. kiali NodePort 10.105.136.82 <none> 20001:32662/TCP,9090:31692/TCP 7h44m

然后在浏览器中输入“http://<ip address>:32662/kiali”打开Kiali的登录页面,登录成功后,Kiali的总览视图如下所示:

2021021922323267.jpg_x-oss-process_image_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTc2MjE3Mw_size_16_color_FFFFFF_t_70_pic_center

2.3 实验项目部署

2.3.1 项目简介

下面通过经典的 Weather Forecast 进行部署实践,它是一款查询城市天气信息的应用实例,一共包含4个微服务,它们之间的调用关系如下:

20210219223559314.jpg_x-oss-process_image_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTc2MjE3Mw_size_16_color_FFFFFF_t_70_pic_center

  • frontend:前台服务,会调用 advertisement 和 forecast 这两个服务,展示整个应用的页面;
  • advertisement:广告服务,返回的静态的广告图片;
  • forecast:添加预报服务,返回相应城市的天气数据;
  • recommendation:推荐服务,根据天气情况向用户推荐穿衣和运行等信息。
    其中,frontend 服务的有两个版本:
  • v1 版本的界面按钮为绿色。
  • v2 版本的界面按钮为蓝色。
    forecast 服务有两个版本:
  • v1 版本会直接返回天气信息;
  • v2 版本会请求 recommendation 服务,获取推荐信息,并结合天气信息一起返回数据。

2.3.2 Weather Forecast 部署

Step1: 下载项目源码。由于官方代码的 Kubernetes api 版本未及时更新肯能会导致报错问题,所以这里不建议使用官,本文提供一个较新的源码:

 
  1. $ git clone https://github.com/slzcc/cloud-native-istio.git

Step2: 添加 v1 版本的服务

 
  1. $ kubectl create ns weather
  2. $ kubectl label namespace weather istio-injection=enabled
  3. $ kubectl apply -f install/weather-v1.yaml -n weather

等待服务安装成功:

20210219223908427.jpg_x-oss-process_image_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTc2MjE3Mw_size_16_color_FFFFFF_t_70_pic_center

Step3: 添加网关资源 Gateway。

 
  1. $ kubectl apply -f install/weather-gateway.yaml

Step4: 验证访问页面。添加网关资源 Gateway 创建完成后访问 istio-ingressgateway 地址即可访问,或者访问其 NodePort 端口:

 
  1. [root@chon ~]# kubectl get svc -n istio-system istio-ingressgateway
  2. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  3. istio-ingressgateway LoadBalancer 10.102.172.210 <pending> 15021:32492/TCP,80:31844/TCP,443:32460/TCP,31400:30568/TCP,15443:31743/TCP 25h

20210219224126222.jpg_x-oss-process_image_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTc2MjE3Mw_size_16_color_FFFFFF_t_70_pic_center

点击查询:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTc2MjE3Mw_size_16_color_FFFFFF_t_70_pic_center

至此,初始实验环境就全部搭建部署完成,接下来就正式开启Istio灰度发布功能的体验之旅。

三、实验过程

实验中有两个核心配置文件贯穿始终,有必要先提前认识和区分一下:

  • VirtualService:路由规则配置(虚拟服务),定义路由规则,可以将满足条件的流量都转发到对应的服务后端;
  • DestinationRule:目标规则配置,定义发生路由后应用于服务流量的策略,描述到达目标的请求怎么处理。
    目标规则是配合虚拟服务来使用的,主要用来定义子集,子集实际上就是具体的目标地址,除此以外,它主要描述的是到达目标请求后如何去处理,所谓的目标就是子集,而如何处理就是指具体的策略。

3.1 初始状态部署

在开始实验前,首先对每个服务都创建各自的 VirtualService 和 DestinationRule 资源,将访问请求路由到所有服务的 v1 版本:

 
  1. $ kubectl apply -f install/destination-rule-v1.yaml -n weather
  2. $ kubectl apply -f install/virtual-service-v1.yaml -n weather

查看配置的路由规则,以 forecast 服务为例:

 
  1. [root@chon ~]# kubectl get vs -n weather forecast-route -o yaml
  2. apiVersion: networking.istio.io/v1beta1
  3. kind: VirtualService
  4. ...
  5. name: forecast-route
  6. namespace: weather
  7. ...
  8. spec:
  9. hosts:
  10. - forecast
  11. http:
  12. - route:
  13. - destination:
  14. host: forecast
  15. subset: v1

在浏览器中多次加载前台页面,并查询城市的天气信息,确认显示正常。然后打开Kiali控制台,查看各个服务之间的调用关系,如下图所示:

20210219224638558.jpg_x-oss-process_image_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTc2MjE3Mw_size_16_color_FFFFFF_t_70_pic_center

3.2 基于流量比例的路由

场景一:用户需要软件能够根据不同的天气情况推荐合适的穿衣和运动信息。于是开发的同学增加了 recommendation 新服务,并升级 forecast 服务到 v2 版本来调用 recommendation 服务。在新特性上线时,运维的同学首先部署 forecast 服务的 v2 版本和 recommendation 服务,并对 forecast 服务的 v2 版本进行灰度发布。

Step1: 部署 recommendation 服务和 forecast 服务的 v2 版本。

 
  1. [root@chon cloud-native-istio]# kubectl apply -f install/recommendation-service/recommendation-all.yaml -f install/forecast-service/forecast-v2-deployment.yaml -n weather

查看服务状态:

在这里插入图片描述

Step2: 更新 forecast 服务 v2 版本的 DestinationRule。

 
  1. [root@chon cloud-native-istio]# kubectl apply -f install/forecast-service/forecast-v2-destination.yaml -n weather

查看下发成功的配置,可以看到增加了 v2 版本 subset 的定义:

 
  1. [root@chon cloud-native-istio]# kubectl get dr forecast-dr -o yaml -n weather
  2. ...
  3. host: forecast
  4. subsets:
  5. - labels:
  6. version: v1
  7. name: v1
  8. - labels:
  9. version: v2
  10. name: v2

这时去浏览器中查询天气,显然还不会出现推荐信息,因为所有流量依然都被路由到 forecast 服务的 v1 版本,不会调用 recommendation 服务。

Step3: 配置 forecast 服务的 VirtualService 配置,其中的 weight 字段显示了相应服务的流量占比,可以看到此时为 v1:v2 = 1:1。

在这里插入图片描述

 
  1. [root@chon cloud-native-istio]# kubectl apply -f chapter-files/canary-release/vs-forecast-weight-based-50.yaml -n weather

Step4: 在浏览器中查看配置后的效果。多次刷新查询天气页面,可以发现大概约 50% 的情况下不显示推荐服务,表示调用了 forecast 服务的 v1 版本;在另外 50% 的情况下表示推荐服务,调用了 forecast 服务的 v2 版本(刷新页面基本上是两个版本交替着来)。

在这里插入图片描述

在这里插入图片描述

Step5: 继续增加 forecast 服务的 v2 版本的流量比例,直到流量全部被路由到 v2 版本。

在这里插入图片描述

 
  1. [root@chon cloud-native-istio]# kubectl apply -f chapter-files/canary-release/vs-forecast-weight-based-v2.yaml -n weather

Step6: 在浏览器中查看配置后的效果。多次刷新页面查询天气,每次都会出现推荐信息,说明访问请求都被路由到了 forecast 服务 v2 版本。

查看Kiali控制台:

在这里插入图片描述

Step7: 保留 forecast 服务的老版本 v1 一段时间,再确认 v2 版本的各性能指标稳定后,删除老版本 v1 的所有资源,完成灰度发布。

3.3 基于请求内容的发布

场景二:在生产环境中同时上线了 forecast 服务的 v1 和 v2 版本,运维同学期望让不同的终端用户访问不同的版本,例如:让使用 Chrome 浏览器的用户看到推荐信息,但让使用其他浏览器的用户看不到推荐信息。

有了上面场景一的经验,依葫芦画瓢,只需要修改 forecast 服务 v2 版本的 DestinationRule中的 match 条件,使来自Chrome浏览器的请求路由到 v2 版本,其余的不变即可:

在这里插入图片描述

在浏览器中查看配置后的效果:用 Chrome 浏览器多次查询天气信息,发现始终显示推荐信息,说明访问到 forecast 服务的 v2 版本;用 360 或 Firefox 浏览器多次查询天气信息,发现始终不显示推荐信息,说明访问到 forecast 服务的 v1 版本。

谷歌浏览器查询访问结果:

在这里插入图片描述

360浏览器查询访问结果:

在这里插入图片描述

现在已经掌握了两种路由规则的配置和应用之后,感兴趣的同学可以自己动手试一试,模拟将两种路由规则组合在一起的场景,比如:在生产环境中同时上线了 frontend 服务的 v1 和 v2 版本(v1 版本的按钮颜色是绿色的,v2 版本的按钮颜色是蓝色的),运维同学期望使用 Android 操作系统的一半用户看到的是 v1 版本,另一半用户看到的是 v2 版本;使用其他操作系统的用户看到的总是 v1 版本。

3.4 多服务同时发布

场景三:运维同学为 frontend 和 forecast 两个服务同时进行灰度发布,frontend 服务新增 v2 版本(界面的按钮为蓝色);forecast 服务新增 v2 版本(增加了推荐信息)。测试人员在用账户 tester 访问天气应用时会看到这两个服务的 v2 版本,其他用户只能看到两个服务的 v1 版本,要求不会出现服务版本交叉调用的情况。

在场景一中我们已经部署过了非入口服务 recommendation 和 forecast 的 v2 版本,并更新了 forecast 服务的 DestinationRule。现在我们在集群中来部署入口服务 frontend 的 v2 版本,并更新其 DestinationRule。

Step1: 部署入口服务 frontend 的 v2 版本。

 
  1. [root@chon cloud-native-istio]# vi install/frontend-service/frontend-v2-deployment.yaml
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5. name: frontend-v2
  6. labels:
  7. app: frontend
  8. version: v2
  9. spec:
  10. replicas: 1
  11. selector:
  12. matchLabels:
  13. app: frontend
  14. template:
  15. metadata:
  16. labels:
  17. app: frontend
  18. version: v2
  19. spec:
  20. containers:
  21. - name: frontend
  22. image: istioweather/frontend:v2
  23. imagePullPolicy: IfNotPresent
  24. ports:
  25. - containerPort: 3000
  26. [root@chon cloud-native-istio]# kubectl apply -f install/frontend-service/frontend-v2-deployment.yaml -n weather

查看部署情况:

在这里插入图片描述

Step2: 更新 frontend 服务的 DestinationRule,增加对 v2 版本 subset 的定义:

 
  1. [root@chon cloud-native-istio]# vi frontend-service/frontend-v2-destination.yaml
  2. apiVersion: networking.istio.io/v1alpha3
  3. kind: DestinationRule
  4. metadata:
  5. name: frontend-dr
  6. spec:
  7. host: frontend
  8. subsets:
  9. - name: v1
  10. labels:
  11. version: v1
  12. - name: v2
  13. labels:
  14. version: v2
  15. [root@chon cloud-native-istio]# kubectl apply -f install/frontend-service/frontend-v2-destination.yaml -n weather

Step3: 配置 frontend 服务的基于访问内容的路由规则,将测试账户(Cookie 带有 “user=tester”)信息的请求流量导入到 frontend 服务的 v2 版本的 Pod 实例。

 
  1. apiVersion: networking.istio.io/v1alpha3
  2. kind: VirtualService
  3. metadata:
  4. name: frontend-route
  5. spec:
  6. hosts:
  7. - "*"
  8. gateways:
  9. - istio-system/weather-gateway
  10. http:
  11. - match:
  12. - headers:
  13. cookie:
  14. regex: ^(.*?;)?(user=tester)(;.*)?$
  15. route:
  16. - destination:
  17. host: frontend
  18. subset: v2
  19. - route:
  20. - destination:
  21. host: frontend
  22. subset: v1
  23. [root@chon cloud-native-istio]# kubectl apply -f chapter-files/canary-release/vs-frontend-multiservice-release.yaml -n weather

Step4: 配置非入口服务 forecast 的路由规则,使得只有带“version:v2”标签的 Pod 实例的流量,才能进入 forecast 服务的新版本 v2 实例:

 
  1. [root@chon canary-release]# vi chapter-files/canary-release/vs-forecast-multiservice-release.yaml
  2. apiVersion: networking.istio.io/v1alpha3
  3. kind: VirtualService
  4. metadata:
  5. name: forecast-route
  6. spec:
  7. hosts:
  8. - forecast
  9. http:
  10. - match:
  11. - sourceLabels:
  12. version: v2
  13. route:
  14. - destination:
  15. host: forecast
  16. subset: v2
  17. - route:
  18. - destination:
  19. host: forecast
  20. subset: v1
  21. [root@chon cloud-native-istio]# kubectl apply -f chapter-files/canary-release/vs-forecast-multiservice-release.yaml -n weather

Step5: 查看配置后的效果。
用 tester 账户登录并访问前台页面,界面的按钮是蓝色的,表示访问到的是 frontend 服务的 v2 版本。在查询天气时会显示推荐信息,表示可以访问到 forecast 服务的 v2 版本:

在这里插入图片描述

不登入或者使用其他用户则访问的是 v1 版本看不到推荐信息:

在这里插入图片描述

可视化视图查看服务间调用关系:

在这里插入图片描述

3.5 自动化部署

前面介绍的灰度发布的策略配置都需要人工干预。在持续交付过程中,为了解决部署和管理的复杂性,往往需要通过自动化工具实现基于权重的灰度发布。

Flagger 是一个基于 Kubernetes 和 Istio 提供灰度发布、监控和告警等功能的开源软件,通过使用 Istio 的流量路由和 Prometheus 指标来分析应用程序的行为,从而实现灰度版本的自动部署,可以使用 Webhook 扩展 Canary 分析,已运行集成测试、压力测试或其他自定义测试。

在这里插入图片描述

其部署流程如上图所示,由于篇幅有限,这里就不再进行赘述,有兴趣的同学可以进一步进行实践体验。

四、总结

作为Istio入门体验系列的第一篇文章,关于灰度发布的实践暂时就先到这里了。对于一名刚接触Istio的小白,通过基于流量比例、基于请求内容以及多服务场景下的灰度发布的实践,Get到了它区别于Kubernetes的部署方式,也切身感受到了Istio在各种规则业务场景下的灵活性。当然,作为系列文章,接下来我也将继续学习探索,持续输出,还望各位同学多多关注,提出宝贵建议!

[

相关文章:

Istio入门体验系列——基于Istio的灰度发布实践

导言&#xff1a;灰度发布是指在项目迭代的过程中用平滑过渡的方式进行发布。灰度发布可以保证整体系统的稳定性&#xff0c;在初始发布的时候就可以发现、调整问题&#xff0c;以保证其影响度。作为Istio体验系列的第一站&#xff0c;本文基于Istio的流量治理机制&#xff0c;…...

CSS行内,内部,外部以及优先级

1.内联样式表&#xff1a; 将样式编写到style标签里 <style>.context {color: red;} </style> 2. 行内样式&#xff1a; 在 HTML 标签中使用 style 属性设置 CSS 样式 <div style"font-size: 18px;">行内样式</div> 3.外联样式&#xff1…...

LCA——最近公共祖先

LCA问题是指在一棵树中找到两个节点的最近公共祖先。最近公共祖先是指两个节点在树中的最近的共同祖先节点。例如&#xff0c;在下面这棵树中&#xff0c;节点 6 6 6和节点7的最近公共祖先是节点 3 3 3。 1/ \2 3/ \ / \4 5 6 7解决LCA问题的方法有很多种&#xff…...

游戏开发与硬件结合,开启全新游戏体验!

游戏与硬件的结合可以通过多种方式实现&#xff0c;从改善游戏体验到创造全新的游戏玩法。以下是一些常见的游戏与硬件结合的方式&#xff1a; 虚拟现实&#xff08;VR&#xff09;和增强现实&#xff08;AR&#xff09;技术&#xff1a;VR和AR技术使玩家能够沉浸式地体验游戏…...

测试框架pytest教程(4)运行测试

运行测试文件 $ pytest -q test_example.py 会运行该文件内test_开头的测试方法 该-q/--quiet标志使输出保持简短 测试类 pytest的测试用例可以不写在类中&#xff0c;但如果写在类中&#xff0c;类名需要是Test开头&#xff0c;非Test开头的类下的test_方法不会被搜集为用…...

Linux 上 离线部署GeoScene Server Py3 运行时环境

默认安装ArcGIS Pro的时候&#xff0c;会自动部署上Python3环境&#xff0c;所以在windows上不需要考虑这个问题&#xff0c;但是linux默认并不部署Py3&#xff0c;因此需要单独部署&#xff0c;具体部署可以参考Linux 上 ArcGIS Server 的 Python 3 运行时—ArcGIS Server | A…...

Python+request+unittest实现接口测试框架集成实例

这篇文章主要介绍了Pythonrequestunittest实现接口测试框架集成实例&#xff0c;小编觉得挺不错的&#xff0c;现在分享给大家&#xff0c;也给大家做个参考。一起跟随小编过来看看吧 1、为什么要写代码实现接口自动化 大家知道很多接口测试工具可以实现对接口的测试&#xf…...

django/flask+python+vue汽车租赁管理系统_1ma2x

开发语言&#xff1a;Python 框架&#xff1a;django/flask Python版本&#xff1a;python3.7.7 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat 开发软件&#xff1a;PyCharm . 课题主要分为三大模块&#xff1a;即管理员模块、用户模块和普通管理员模块&#xff0…...

胜者打仗,就像高山上决开积水,势不可挡

胜者打仗&#xff0c;就像高山上决开积水&#xff0c;势不可挡 【安志强趣讲《孙子兵法》16讲】 【原文】 是故胜兵先胜而后求战&#xff0c;败兵先战而后求胜。善用兵者&#xff0c;修道而保法&#xff0c;故能为胜败之政。 【注释】 修道&#xff1a;指从各方面修治“先立于不…...

stm32的命令规则

stm32型号的说明&#xff1a;以STM32F103RBT6这个型号的芯片为例&#xff0c;该型号的组成为7个部分&#xff0c;其命名规则如下&#xff1a;...

1. HBase中文学习手册之揭开Hbase的神秘面纱

揭开Hbase的神秘面纱 1.1 欢迎使用 Apache Hbase1.1.1 什么是 Hbase?1.1.2 Hbase的前世今生1.1.3 HBase的技术选型&#xff1f;1.1.3.1 不适合使用 HBase的场景1.1.3.2 适合使用 HBase的场景 1.1.4 HBase的特点1.1.4.1 HBase的优点1.1.4.2 HBase的缺点 1.1.5 HBase设计架构 1.…...

[线程/C++]线程同(异)步和原子变量

文章目录 1.线程的使用1.1 函数构造1.2 公共成员函数1.2.1 get_id()1.2.2 join()2.2.3 detach()2.2.5 joinable()2.2.6 operator 1.3 静态函数1.4 call_once 2. this_thread 命名空间2.1 get_id()2.2 sleep_for()2.3 sleep_until()2.4 yield() 3. 线程同步之互斥锁3.1 std:mute…...

全球网络加速器GA和内容分发网络CDN,哪个更适合您的组织使用?

对互联网用户来说&#xff0c;提供最佳的用户体验至关重要&#xff1a;网页加载时间过长、视频播放断断续续以及服务忽然中断等问题都足以在瞬间失去客户。因此可以帮助提高您的网站或APP提高加载性能的解决方案就至关重要&#xff1a;全球网络加速器和CDN就是其中的两种解决方…...

蓝凌OA custom.jsp 任意文件读取

​曾子曰&#xff1a;“慎终追远&#xff0c;民德归厚矣。” 漏洞复现 访问漏洞url&#xff1a; 出现漏洞的文件为 custom.jsp&#xff0c;构造payload&#xff1a; /sys/ui/extend/varkind/custom.jsp var{"body":{"file":"file:///etc/passwd&q…...

(二)结构型模式:7、享元模式(Flyweight Pattern)(C++实例)

目录 1、享元模式&#xff08;Flyweight Pattern&#xff09;含义 2、享元模式的UML图学习 3、享元模式的应用场景 4、享元模式的优缺点 5、C实现享元模式的简单实例 1、享元模式&#xff08;Flyweight Pattern&#xff09;含义 享元模式&#xff08;Flyweight&#xff09…...

laravel 多次查询请求,下次请求清除上次请求的where 条件

在Laravel中&#xff0c;可以使用where方法来添加查询条件&#xff0c;但是每次添加where条件时&#xff0c;都会在查询构造器中持久化这些条件&#xff0c;直到你手动重置它们。所以&#xff0c;如果你想在下一次查询中清除上次查询的where条件&#xff0c;有以下几种选择&…...

C++根据如下使用类MyDate的程序,写出类MyDate的定义,MyDate中有三个数据成员:年year,月month,日day完成以下要求

题目&#xff1a; 根据如下使用类MyDate的程序&#xff0c;写出类MyDate的定义&#xff0c;MyDate中有三个数据成员&#xff1a; 年year&#xff0c;月month&#xff0c;日day int year,month,day; void main() { MyDate d1, d2; d1.set(2015, 12, 31); d2.set(d1); d1.…...

微盟集团中报增长稳健 重点发力智慧零售AI赛道

零售数字化进程已从渠道构建走向了用户的深度运营。粗放式用户运营体系无法适应“基于用户增长所需配套的精细化运营能力”,所以需要有个体、群体、个性化、自动化运营——即在对的时候、以对的方式、把对的内容推给用户。 出品|产业家 2023年已经过半&#xff0c;经济复苏成为…...

设计模式(7)模板方法模式

一、定义&#xff1a; 定义一个操作中的算法骨架&#xff0c;而将算法的一些步骤延迟到子类中&#xff0c;使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。它是一种类行为型模式。 //模板方法抽象类 public abstract class AbstractClass {//模板方法publ…...

2308C++协程流程9

参考 #include <协程> #include "简异中.cpp" //用来中文定义的.元<类 T>构 P;元<类 T>构 任务{用 承诺型P<T>;任务()默认;动 符号 协待()常 无异{构 等待器{极 直接协()常 无异{中 p.是准备好();}协柄 挂起协(协柄<>o)常 无异{p.连续…...

基于学习交流社区的自动化测试实现

一 项目介绍 项目名称 项目名称&#xff1a; 学习交流社区 项目介绍 项目介绍&#xff1a; 学习交流社区是一个基于Spring的前后端分离的在线论坛系统。使用了MySQL数据库来存储相关信息&#xff0c;项目完成后使用Xshell将其部署到云服务器上。 前端页面&#xff1a; 前端共由…...

2023-08-21力扣每日一题

链接&#xff1a; 2337. 移动片段得到字符串 题意&#xff1a; L可以和左边的_交换&#xff0c;R可以和右边的_交换&#xff0c;求判断A是否能通过交换&#xff08;不限次数&#xff09;变成B 解&#xff1a; 观察可知&#xff0c;如果存在RL,一定不能交换出LR&#xff0c…...

对象存储服务-MinIO基本集成

是什么 MinIO 是一个高性能的分布式对象存储服务&#xff0c;适合存储非结构化数据&#xff0c;如图片&#xff0c;音频&#xff0c;视频&#xff0c;日志等。对象文件最大可以达到5TB。 安装启动 mkdir -p /usr/local/minio cd /usr/local/minio# 下载安装包 wget https:/…...

Yarn介绍及快速安装 - Debian/Ubuntu Linux

1.Yarn介绍 Yarn 是一个用于管理 JavaScript 包的快速、可靠和安全的包管理器。它是由 Facebook、Google、Exponent 和 Tilde 团队共同开发的&#xff0c;旨在提供比 npm 更快速、可靠的包管理体验。 以下是 Yarn 的一些主要特点和优势&#xff1a; 快速安装&#xff1a;Yarn…...

【新日语(2)】第10課 中国の生活に慣れるかどうか少し心配です

第10課 中国の生活に慣れるかどうか少し心配です 注释&#xff1a; &#xff5e;かどうか&#xff1a;“是否”。 练习A 一、例句 田中さんは鈴木さんに、30分ぐらい遅れると言いました。 田中先生告诉铃木先生&#xff0c;他会迟到大约30分钟。 注释&#xff1a; &…...

Python 网页解析初级篇:BeautifulSoup库的入门使用

在Python的网络爬虫中&#xff0c;网页解析是一项重要的技术。而在众多的网页解析库中&#xff0c;BeautifulSoup库凭借其简单易用而广受欢迎。在本篇文章中&#xff0c;我们将学习BeautifulSoup库的基本用法。 一、BeautifulSoup的安装与基本使用 首先&#xff0c;我们需要使…...

Spring Schedular 定时任务

大家好 , 我是苏麟 , 今天带来定时任务的实现 . Spring网站 : 入门 |计划任务 (spring.io) 什么是定时任务 通过时间表达式来进行调度和执行的一类任务被称为定时任务 定时任务实现 1.Spring Schedule (Spring boot 默认整合了) 2.Quartz(独立于Spring 存在的定时任务框架…...

营业额统计

营业额统计 # 题目描述 Tiger 最近被公司升任为营业部经理&#xff0c;他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。 Tiger 拿出了公司的账本&#xff0c;账本上记录了公司成立以来每天的营业额。分析营业情况是一项相当复杂的工作。由于节假日&…...

使用lodash的throttle函数会触发两次

当使用lodash的throttle函数时会触发两次&#xff0c;分别在最开始和最后。 严格来说不算是bug&#xff0c;因为官方文档写的很清楚。throttle函数其实有三个参数&#xff1a; _.throttle(func, [wait0], [options]) func: 要节流的函数 wait: 等待时间 options: 选项 op…...

如何使用CSS实现一个瀑布流布局?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 使用CSS实现瀑布流布局⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚…...

dfs之有重复字符串的排列组合

https://leetcode.cn/problems/permutation-ii-lcci/description/ ■ 题目描述 考古问题&#xff0c;假设以前的石碑被打碎成了很多块&#xff0c;每块上面都有一个或若干个字符&#xff0c;请你写个程序来把之前石碑上文字可能的组合全部写出来&#xff0c;按升序进行排列。…...

Java之抽象类

Java之抽象类 抽象类概念抽象类如何使用抽象类的特性 作者简介&#xff1a; zoro-1&#xff0c;目前大一&#xff0c;正在学习Java&#xff0c;数据结构等 作者主页&#xff1a;zoro-1的主页 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f49…...

“无Internet连接但是可以上网” 解决全流程

先说我的最后解决方法&#xff1a; 修改注册表下\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NlaSvc\Parameters\Internet下 的 EnableActiveProbing 项&#xff1a;将 1 改成 0 为什么要解决“无Internet连接但是可以上网”这个问题&#xff1f; 因为虽然可以上百…...

VS2022 CMake报错解决小结

目录 一、问题背景 二、问题分析 三、问题解决 一、问题背景 VS2022中能够跨平台的工程类型就是CMake项目&#xff0c;一套代码能跨windows/Linux/Mac多种操作系统。而实际使用时&#xff0c;发现相关资料比较少&#xff0c;需要摸索一下。 碰到的问题简述&#xff1a; 1、C…...

java之webservice_aegis.xml学习

开门见山,直奔主题,让我们先来看一个接口: public interface UserInfo {public Collection findRoleInfosByUserID(String userUniqueID);public User findUserInfosByUserID(String userUniqueID);public String test();} 观察此接口,首先我们看findRoleInfosByUserID方法…...

总结 TCP 协议的相关特性

TCP协议段格式: 如图, 端口号: 是其中一个重要的部分,知道端口号才能确认数据交给哪个应用程序(端口号属于传输层的概念). 4位首部长度:4bit表示的范围是0->15,在此处,单位是"4字节",因此,将这里的数值 * 4&#xff0c;才是真正的报头长度,即TCP 报头最大长度,60…...

不负众望~历时4年修炼,这本册子终于成书了(文末赠书)

名字&#xff1a;阿玥的小东东 学习&#xff1a;Python、C/C 主页链接&#xff1a;阿玥的小东东的博客_CSDN博客-python&&c高级知识,过年必备,C/C知识讲解领域博主 目录 精进Spring Boot首选读物 “小册”变“大书”&#xff0c;彻底弄懂Spring Boot 全方位配套资源…...

【校招VIP】java语言考点之垃圾回收算法

考点介绍&#xff1a; 垃圾回收算法是必考题。GC中的垃圾指的是存在于内存中的、不会再被使用的对象。而垃圾回收就是把那些不再被使用的对象进行清除&#xff0c;收回占用的内存空间...... 『java语言考点之垃圾回收算法』相关题目及解析内容可点击文章末尾链接查看&#xff…...

juc概述和Lock接口

目录 一、什么是JUC 1、JUC概述 2、进程与线程 3、线程的状态 4、wait/sleep 的区别 5、并发与并行 6、管程 7、用户线程和守护线程 二、Lock接口 1、Synchronized 使用synchronized实现售票案例 使用synchronized实现增减变量操作 2、什么是 Lock 买票例子使用lo…...

图像降采样的计算原理:F.interpolate INTER_AREA

一、F.interpolate——数组采样操作 torch.nn.functional.interpolate(input, size=None, scale_factor=None, mode=nearest, align_corners=None, recompute_scale_factor=None) 功能:利用插值方法,对输入的张量数组进行上\下采样操作,换句话说就是科学合理地改变数组的尺…...

云上的甜蜜早安:腾讯云云函数助力PHP打造女友专属每日推送

用腾讯云的云函数做一个微信公众号早安&#xff0c;每天定时发送早安给你的女朋友&#xff01; 1.首先我们登录腾讯云&#xff0c;在搜索栏搜索云函数 2.进入云函数&#xff0c;点击立即体验 3.这里我们选择 按照步骤选择 php 4.再就是配置页面&#xff0c;这里我们只需要配…...

Javaweb基础学习(3)

Javaweb基础学习 web核心介绍一、HTTP1.1 HTTP介绍1.2、HTTP请求数据格式1.3、HTTP响应数据格式 二、Tomcat2.1 简介2.2 基本使用2.3 Tomcat配置2.4 Tomcat部署项目2.5 Web项目结构2.6 创建Maven Web项目 三、Servlet3.1、Servlet简介&快速入门3.2 创建Servlet步骤3.3 Serv…...

使用在 Web 浏览器中运行的 VSCode 实现 ROS2 测程法

一、说明 Hadabot是软件工程师学习ROS2和机器人技术的机器人套件。我们距离Hadabot套件的测试版还有一周左右的时间。我们将在本文末尾披露有关如何注册的更多信息。 新的Hadabot套件完全支持ROS2。除了硬件套件外&#xff0c;Hadabot软件环境将主要基于Web浏览器&#xff0c;以…...

快速学习GO语言总结

备注&#xff1a;本博客将自己初步学习GO的总结进行分享&#xff0c;希望大家通过本博客可以在短时间内快速掌握GO的基本程序编码能力&#xff0c;如有错误请留言指正&#xff0c;谢谢&#xff01; 一、初步了解Go语言 &#xff08;一&#xff09;Go语言诞生的主要问题和目标…...

尚硅谷宋红康MySQL笔记 10-18

是记录&#xff0c;我不会记录的特别详细 第10章 创建和管理表 标识符命名规则 数据库名、表名不得超过30个字符&#xff0c;变量名限制为29个只能包含 A–Z, a–z, 0–9, _共63个字符数据库名、表名、字段名等对象名中间不要包含空格同一个MySQL软件中&#xff0c;数据库不能…...

Java 面试题--SpringBoot篇

一、什么是 SpringBoot&#xff1f; Spring Boot 是 Spring 开源组织下的子项目&#xff0c; 是 Spring 组件一站式解决方案&#xff0c;主要是简化 了使用 Spring 的难度&#xff0c;简省了繁重 xml 的配 置&#xff0c;提供了各种启动器&#xff0c;在运行过程中自定 配置,&a…...

GitKraken 详细图文教程

前言 写这篇文章的原因是组内的产品和美术同学&#xff0c;开始参与到git工作流中&#xff0c;但是网上又没有找到一个比较详细的使用教程&#xff0c;所以干脆就自己写了一个[doge]。文章的内容比较基础&#xff0c;介绍了Git内的一些基础概念和基本操作&#xff0c;适合零基…...

ubuntu20.04 root用户下使用中文输入法——root用户pycharm无法用中文输入法问题

因为一些众所不周知的bug&#xff0c;我的pycharm使用apt或者snap安装都不行了&#xff0c;官网下了“绿色版”&#xff0c;运行pycharm.sh也运行不起来&#xff0c;有个java相关环境报错&#xff0c;jre和jdk都装了&#xff0c;还是有点问题&#xff0c;最后尝试发现可以用roo…...

FastDFS与Nginx结合搭建文件服务器,并实现公网访问【内网穿透】

文章目录 前言1. 本地搭建FastDFS文件系统1.1 环境安装1.2 安装libfastcommon1.3 安装FastDFS1.4 配置Tracker1.5 配置Storage1.6 测试上传下载1.7 与Nginx整合1.8 安装Nginx1.9 配置Nginx 2. 局域网测试访问FastDFS3. 安装cpolar内网穿透4. 配置公网访问地址5. 固定公网地址5.…...

嵌入式蓝海变红海?其实是大浪淘沙!

嵌入式是当下热门的职业方向之一&#xff0c;吸引了众多求职者的目光。然而&#xff0c;有人担心大家一拥而上&#xff0c;导致嵌入式就业竞争激烈&#xff0c;找工作难度大。其实&#xff0c;嵌入式行业的竞争并非无法逾越的天堑&#xff0c;也远远没有从蓝海变成红海&#xf…...