背景信息
灰度及蓝绿发布是为新版本创建一个与老版本完全一致的生产环境,在不影响老版本的前提下,按照一定的规则把部分流量切换到新版本,当新版本试运行一段时间没有问题后,将用户的全量流量从老版本迁移至新版本。
其中AB测试就是一种灰度发布方式,一部分用户继续使用老版本的服务,将一部分用户的流量切换到新版本,如果新版本运行稳定,则逐步将所有用户迁移到新版本。
本文将介绍在K8S集群中如何通过Nginx Ingress Controller基于服务权重的流量来实现应用服务的灰度发布。
环境
需要在一套k8s集群部署两套应用,上线后,再删掉其中一套。
优点:节省资源
缺点:浪费人力
条件好的情况下:建议部署两套K8s,通过最外层流量负载均衡两套k8s实现灰度发布。
架构如下
实现注解实现蓝绿发布与灰度发布
- canary-*注解方式:使用
canary-*
Annotation配置蓝绿发布与灰度发布,canary-*
Annotation是社区官方实现的灰度发布方式。
第一步:灰度发布
步骤:
1、首先需要创建两个应用(旧版本nginx,老版本nginx),新版本ingress配置注解(重要)
2、新旧版本Nginx分别部署ingress、service、deployment
老版本nginx
old-new-ingress -> old-nginx-service -> old-nginx-deployemnt
旧版本nginx
new-nginx-ingress -> new-nginx-service -> new-nginx-deployemnt
新版本ingress配置注解
annotations:
# 开启Canary。
nginx.ingress.kubernetes.io/canary: "true"
# 仅允许50%的流量会被路由到新版本服务new-nginx中。
# 默认总值为100。
nginx.ingress.kubernetes.io/canary-weight: "50"
架构如下
解释:部署了两套nginx应用,一套更旧版本nginx应用,一套新版栖nginx应用。新旧的nginx应用都配置了ingress相同的host。
而新的ingress还添加了注解
canary:true 代表开启使用灰度发布
cnary-weight: 代表当用户来访问的时候 会有一半流量是会从new-nginx-ingress这个ingress进来访问新版本的nginx。而另一半则从old-nginx-ingress的ingress去访问老版本的nginx。
第二步:流量整合
步骤:
1、把old-nginx-service指向访问new-nginx-deloyment
2、删除new-nginx-ingress
3、删除new-nginx-service
4、删除old-nginx-deployment
架构如下