灰度及蓝绿发布是为新版本服务创建一个与老版本服务完全一致的生产环境,在不影老版本服务的前提下,按照一定的规则把部分流量切换到新版本,当新版本试运行一段时间没有问题后,将用户的全量流量从老版本迁移至新版本。
灰度发布的方式通常用于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-v1
namespace: production
spec:
ingressClassName: nginx
rules:
- host: canary.com
http:
paths:
- backend:
service:
name: canary-v1
port:
number: 8080
path: /
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.yaml
apiVersion: 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: nginx
rules:
- host: canary.com ##客户端访问的域名
http:
paths:
- backend: ##后端设置,通常用来设置service
service:
name: canary-v2
port:
number: 8080
path: /
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>