k8s灰度/金丝雀发布

server/2025/1/15 23:58:06/

        灰度及蓝绿发布是为新版本服务创建一个与老版本服务完全一致的生产环境,在不影老版本服务的前提下,按照一定的规则把部分流量切换到新版本,当新版本试运行一段时间没有问题后,将用户的全量流量从老版本迁移至新版本。

        灰度发布的方式通常用于AB测试,是指一部分用户继续使用老版本的服务,将一部分用户的流量切换到新版本,如果新版本运行稳定,则逐步将所有用户迁移到新版本。

        金丝雀发布是指在生产环境中逐步推出新版本应用程序,只在一小部分用户或流量中使用该版本,并根据反馈逐步扩大规模,最终完全替换旧版本。金丝雀发布允许快速检测新版本与旧版本之间是否存在兼容性问题、性能问题或其他问题,并减轻了在实施全新发布时可能遭受的损失。

        蓝绿部署,是指同时运行两个版本的应用。在蓝绿部署时,蓝绿部署的时候,并不停止掉老版本,而是直接部署一套新版本,等新版本运行起来后,再将流量切换到新版本上。

例如发布前,在蓝色的系统上进行测试,测试完成后切换为蓝色系统,同时观察蓝色系统的运行状态,如果运行出现问题可以及时切回绿色系统。

蓝绿部署的优点

这样做可以减少发布影响的时间。例如某网站要进行后端升级,无需完全停掉服务更新,且出现问题后可以及时切回老版本。

蓝绿部署的缺点

需要两倍的硬件资源,需要额外进行付费;微服务架构很难这样进行迁移;要求蓝绿两套系统完全没有耦合;迁移后未完成的任务进行迁移需要一定的成本,如数据库的迁移。

        假设我们有两个命名空间,一个是正在使用的生产环境Production,另一个是用于灰度测试的Canary。在发布应用时,可以将应用先发布至Canary,然后切—部分流量到Canary,之后慢慢将流量全部切换到上面即可。

1.创建V1版本

(1)首先创建模拟生产(Production)环境的命名空间和服务
[root@k8s-master ~]# kubectl create ns production
(2)创建v1版本的应用
[root@k8s-master ~]# kubectl create deployment canary-v1 \--image=registry.cn-beijing.aliyuncs.com/dotbalo/canary:v1 \
-n production
(3)创建Service暴露应用
[root@k8s-master ~]# kubectl expose deployment canary-v1 --port 8080 -n production
(4)创建ingress,指定域名为canary.com
[root@k8s-master ~]# cat v1-ingress.yaml 
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: canary-v1namespace: production
spec:ingressClassName: nginxrules:- host: canary.comhttp:paths:- backend:service:name: canary-v1port:number: 8080path: /pathType: ImplementationSpecific

备注:

路径类型pathType

  • ImplementationSpecific:系统默认,有IngressClass控制器提供具体实现
  • exact:精确匹配URL路径,区分大小写
  • prefix:匹配URL路径的前缀
(5)部署ingress
[root@k8s-master ~]# kubectl create -f v1-ingress.yaml
(6)测试访问

在客户端添加canary.com的域名解析

2.创建v2版本

创建V2版本,充当灰度环境。

(1)创建v2版本的命名空间
[root@k8s-master ~]# kubectl create ns canary
(2)创建v2版本的应用
[root@k8s-master ~]# kubectl create deployment canary-v2 \--image=registry.cn-beijing.aliyuncs.com/dotbalo/canary:v2 \
-n canary
(3)创建v2版本的service
[root@k8s-master ~]# kubectl expose deployment canary-v2 --port 8080 -n canary
[root@master ~]# ku get svc -n canary
NAME        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
canary-v2   ClusterIP   10.104.202.121   <none>        8080/TCP   31m
[root@k8s-master ~]# curl 10.104.202.121:8080
<h1>Canary v2</h1>

3.通过ingress控制流量

[root@k8s-master ~]# vim canary-v2.yamlapiVersion: networking.k8s.io/v1
kind: Ingress
metadata:annotations:nginx.ingress.kubernetes.io/canary: "true"	##指定此为灰度环境nginx.ingress.kubernetes.io/canary-weight: "10"	##灰度环境的权重name: canary-v2		##此ingress的名称namespace: canary	##所属的命名空间
spec:ingressClassName: nginxrules:- host: canary.com	##客户端访问的域名http:paths:- backend:		##后端设置,通常用来设置serviceservice:name: canary-v2port:number: 8080path: /pathType: ImplementationSpecific
[root@k8s-master ~]# kubectl create -f canary-v2.yaml 

备注:

nginx.ingress.kubernetes.io/canary: "true"  表示此站点为灰度模式

nginx.ingress.kubernetes.io/canary-weight: "10"表示为该站点分配10%的流量,原站点就可以得到90%的流量

weight: "10"  权重值为10

4.测试灰度发布

(1)进行测试
[root@k8s-master ~]# for i in $(seq 10);do curl -s canary.com;done
<h1>Canary v2</h1>
<h1>Canary v1</h1>
<h1>Canary v1</h1>
<h1>Canary v1</h1>
<h1>Canary v1</h1>
<h1>Canary v1</h1>
<h1>Canary v1</h1>
<h1>Canary v1</h1>
<h1>Canary v1</h1>
<h1>Canary v1</h1>

从结果可以大致判断出,两个网站的访问比例大约为1:9

(2)修改权重为50的测试结果
[root@k8s-master ~]# ku edit ingress canary-v2 -n canary
#修改权重值为50
nginx.ingress.kubernetes.io/canary-weight: "50"
[root@k8s-master ~]# for i in $(seq 10);do curl -s canary.com;done
<h1>Canary v2</h1>
<h1>Canary v2</h1>
<h1>Canary v1</h1>
<h1>Canary v2</h1>
<h1>Canary v1</h1>
<h1>Canary v1</h1>
<h1>Canary v2</h1>
<h1>Canary v2</h1>
<h1>Canary v1</h1>
<h1>Canary v1</h1>

http://www.ppmy.cn/server/113388.html

相关文章

golang关于slice map函数传参的小问题

问题 函数传参了一个slice&#xff0c;在函数内触发了对长度的修改&#xff08;添加或删除&#xff09;&#xff0c;但是未影响函数外的实参由此产生了另一个问题&#xff0c;我们用map在函数内修改会不会有影响不到实参的情况&#xff1f; 结论 map作为函数参数时是引用传递…

创业者必读!选择拍卖源码还是自建开发,哪种方案更安全?

在当今数字化时代&#xff0c;拍卖平台作为一种独特的电子商务模式&#xff0c;正逐渐成为人们关注的焦点。随着互联网技术的发展&#xff0c;网络安全问题变得越来越突出。如何保障用户数据安全&#xff0c;防止信息泄露及攻击事件的发生&#xff0c;已经成为拍卖软件开发者面…

致远个性化之--获取明细表中相同类型的数据汇总,并赋值对应明细行中

需求 由于在近期的项目中&#xff0c;有预算、费用管控等需求&#xff0c;而且在报销填报时&#xff0c;费用明细项可能会有重复相同的费用类型发生多项&#xff0c;而相同的费用类型是多项时&#xff0c;要求按照汇总后的费用管控。 具体示例图如下&#xff1a; 邮寄费发生了两…

深入浅出孪生神经网络,高效训练模型

大家好&#xff0c;在深度学习领域&#xff0c;神经网络几乎能处理各种任务&#xff0c;但通常需要依赖于海量数据来达到最佳效果。然而&#xff0c;对于像面部识别和签名验证这类任务&#xff0c;我们不可能总是有大量的数据可用。由此产生了一种新型的神经网络架构&#xff0…

汽车电子行业知识:关于车载中控屏

文章目录 1. 车载中控屏的功能2. 最新技术3. 最新产品4. 未来趋势5. 车载中控屏的供应商5.1. 电子元件制造商5.2. 显示技术公司5.3. 软件和系统集成商5.4. 汽车制造商5.5. 新兴科技公司 车载中控屏是现代汽车中不可或缺的组成部分&#xff0c;它不仅提供了车辆信息的显示&#…

【qt】多线程实现倒计时

1.界面设计 设置右边的intvalue从10开始倒计时 2.新建Thread类 新建Thread类&#xff0c;使其继承QThread类&#xff0c;多态重写run函数&#xff0c;相当于线程执行函数 3.重写run函数 重写run函数&#xff0c;让另一个进程每隔1s发出一个信号&#xff0c;主线程使用conne…

vue-seamless-scroll(二)点击事件

继上一篇文章vue-seamless-scroll(一)使用 在表格数据滚动的时候想要点击某一行获取当前行的数据&#xff0c;但是当数据在第二轮数据滚动的时候点击没有反应&#xff0c;获取不到数据&#xff0c;该怎么解决&#xff1f; 首先需要在父级添加一个点击事件&#xff0c;然后在这…

Android调整第三方库PickerView宽高--回忆录

一、效果 // 时间选择implementation com.contrarywind:Android-PickerView:4.1.9 多年前&#xff0c;使用到事件选择器&#xff0c;但是PickerView默认宽度使满屏的&#xff0c;不太符合业务需求&#xff0c;当时为此花了许多时间&#xff0c;最终找到了解决方案&#xff0c;…