灰度发布

灰度发布(又名金丝雀发布)是一种平滑过渡的部署方式,让一部分主机优先使用新的镜像部署(即运行新的程序),测试没有问题后再全面发布,可以保证整体系统的稳定。

灰度发布属于URLOS企业版功能。

本章节将使用实例来介绍URLOS灰度发布功能:首先,在URLOS集群中添加2台主机,使用Dockerfile构建一个版本号为v1的镜像,用该镜像制作一个URLOS云应用,然后用该云应用部署一个网站服务,接下来再将v1镜像更新为为v2镜像,最后通过灰度发布功能将v2部署至其中1台主机,这样就是实现了一台主机运行旧的程序,而另一台主机运行新的程序。


构建镜像

创建Dockerfile文件,内容如下:

  1. FROM alpine:3.8
  2. ENV TIME_ZONE Asiz/Shanghai
  3. RUN sed -i 's~dl-cdn.alpinelinux.org~mirrors.aliyun.com~' /etc/apk/repositories \
  4. && apk update \
  5. && apk add nginx \
  6. && mkdir -p /run/nginx \
  7. && mkdir -p /var/www/html/ \
  8. && echo "这是版本1" > /var/www/html/index.html
  9. WORKDIR /var/www/html/
  10. CMD ["more" ,"index.html"]

使用docker build命令构建镜像:

  1. docker build -t registry.cn-shanghai.aliyuncs.com/urlos-test001/alpine-nginx-1.14.2:v1 .

注:这里的urlos-test001为命名空间,registry.cn-shanghai.aliyuncs.com为阿里仓库线路的域名,请根据自己实际的替换!

将构建好的镜像registry.cn-shanghai.aliyuncs.com/urlos-test001/alpine-nginx-1.14.2:v1上传至阿里云,具体方法参考《阿里云容器镜像服务》

制作云应用

将URLOS的模式更改为开发模式(dev模式),编辑/data/urlos/master-config/config.jsonc文件:

  1. "envType": "pro",

改为

  1. "envType": "dev",

登录URLOS,在 应用管理 中点击右上角的【镜像管理】:

image-20200417164443894

然后点击【添加】:

image-20200417164557666

然后将镜像地址填入即可,使用阿里云的话,仓库线路域名可不填:

image-20200417170728460

返回应用管理列表,找一个官方云应用作为模板,比如,点更多按钮,选择【复制应用】:

image-20200417165424656

请按需修改相关项目,镜像选择之前添加的urlos-test001/alpine-nginx-1.14.2:v1

image-20200417171048636

image-20200417171321676

只保留nginx这一个启动脚本

image-20200417171403710

提交!

返回应用列表后,找到刚才新建的应用,点击【更多】,选择“管理模板”

”

删除php相关模板,修改nginx网站配置模板(nginx:vhost.conf):

image-20200417171826280

将网站根目录修改为/var/www/html/

image-20200417172032764

  1. set $websiteRoot /var/www/html/;

然后提交即可。

部署云应用

返回应用管理列表,选择制作好的应用,在【更多】选项中点击“创建服务”,在【容器个数】中添加“0”,其他按需填写,网站部署完成后,在浏览器中打开得到如下结果:

image-20200417173020729

更新镜像版本

在开发应用程序时,一般都会不停迭代版本,也需要不停测试,URLOS适时的提供了灰度测试功能。下面我们开始进入灰度测试阶段吧。首先,我们需要更新镜像,编辑Dockerfile,将其内容修改为:

  1. FROM alpine:3.8
  2. ENV TIME_ZONE Asiz/Shanghai
  3. RUN sed -i 's~dl-cdn.alpinelinux.org~mirrors.aliyun.com~' /etc/apk/repositories \
  4. && apk update \
  5. && apk add nginx \
  6. && mkdir -p /run/nginx \
  7. && mkdir -p /var/www/html/ \
  8. && echo "这是版本2" > /var/www/html/index.html
  9. WORKDIR /var/www/html/
  10. CMD ["more" ,"index.html"]

我们把首页index.html文件内容修改成了“这是版本2”。

并重新构建一个名为registry.cn-shanghai.aliyuncs.com/urlos-test001/alpine-nginx-1.14.2:v2的镜像。

也将它上传至阿里云仓库,上传后可以在阿里云后台查看到两个镜像版本:

image-20200417174907028

接下来,我们将使用v2的镜像地址进行灰度发布,在本演示里,我们在集群中添加了2个主机,灰度发布时,把灰度值设置为50%或以下,需要达到的预期效果是:仅在其中1台主机上更新到v2。

找到之前部署的网站,点更多菜单,选择“灰度发布”:

image-20200417175426020

镜像地址填写urlos-test001/alpine-nginx-1.14.2:v2,灰度值填写45,然后提交即可。

当出现以下提示,表明灰度发布完成:

image-20200417175710439

现在,如何验证id为1的主机是否更新到了新版v2,而另一个还是使用旧版本v1呢?

很简单,登录到容器里面查看一下index.html内容就好了,或者直接浏览器访问,多刷新几次。