使用nginx模拟进行金丝雀发布的方式

2019-10-17 17:05:00王振洲

这篇文章介绍一下蓝绿部署以及使用nginx如何最简单地模拟一下金丝雀发布的方式

金丝雀发布/灰度发布

金丝雀发布的重点在于:试错。金丝雀发布的来历本身就是自然界的美丽生物在人类工业发展过程中的一个悲惨的故事。金丝雀就是用它的生命来为矿工的安全来试错的。用很小的成本来换取整体的安全,在持续部署的实践中,金丝雀就是流量控制,用很少的流量比如百分之一或者十分之一用于检证某个版本是否正常,如果不正常则就用最低的成本实现了其作用,降低了风险。如果正常,则可以逐渐加大权重直至百分之百,将所有的流量都平稳地切换至新的版本。灰度发布,一般来说也是类似的概念。灰色是介于黑和白之前的一个过渡,区别于蓝绿部署的非蓝即绿,灰度发布/金丝雀发布会有一个两者同时存在的时间段,只是两者对应的流量不同,金丝雀发布如果说和灰度发布有所不同的话,其不同点应该是目的性的不同,金丝雀发布目的在于试错,而灰度发布在于平稳发布,而在金丝雀发布没有问题的状况下进行的平稳过渡则正是灰度发布。

模拟金丝雀发布

接下来我们使用nginx的upstream来简单模拟一下金丝雀发布的场景。具体场景如下, 当前活跃的是主版本,通过调整nginx设定,通过不断的调节金丝雀版本的权重,最终实现平稳地发布。

事前准备

事前在7001/7002两个端口分别启动两个服务,用于显示不同信息,为了演示方便,使用tornado做了一个镜像,通过docker容器启动时传递的参数不同用于显示服务的不同。

docker run -d -p 7001:8080 liumiaocn/tornado:latest python /usr/local/bin/daemon.py "Hello main service: v1 in 7001"
docker run -d -p 7002:8080 liumiaocn/tornado:latest python /usr/local/bin/daemon.py "Hello canary deploy service: v2 in 7002"

执行日志

[root@kong ~]# docker run -d -p 7001:8080 liumiaocn/tornado:latest python /usr/local/bin/daemon.py "Hello main service: v1 in 7001"
28f42bbd21146c520b05ff2226514e62445b4cdd5d82f372b3791fdd47cd602a
[root@kong ~]# docker run -d -p 7002:8080 liumiaocn/tornado:latest python /usr/local/bin/daemon.py "Hello canary deploy service: v2 in 7002"
b86c4b83048d782fadc3edbacc19b73af20dc87f5f4cf37cf348d17c45f0215d
[root@kong ~]# curl http://192.168.163.117:7001
Hello, Service :Hello main service: v1 in 7001
[root@kong ~]# curl http://192.168.163.117:7002
Hello, Service :Hello canary deploy service: v2 in 7002
[root@kong ~]#

启动nginx

[root@kong ~]# docker run -p 9080:80 --name nginx-canary -d nginx
659f15c4d006df6fcd1fab1efe39e25a85c31f3cab1cda67838ddd282669195c
[root@kong ~]# docker ps |grep nginx-canary
659f15c4d006    nginx           "nginx -g 'daemon ..."  7 seconds ago    Up 7 seconds    0.0.0.0:9080->80/tcp   nginx-canary
[root@kong ~]#