基于镜像的日常发布

场景介绍

我们在使用ECS的时候要更时常地面临更新软件的问题,如运行的后端服务版本更新,安全打补丁等情况。我们可以使用ECS镜像来维护需要更新的程序版本,更新好镜像后对需要发布的机器更换下系统盘重新启动就能完成对单台机器的程序更新。对于在线上运行的机器我们需要分批的去更换系统盘。总结下来,我们需要做的操作如下:

  1. 更新镜像后,可以启动一台新的机器,或者在一台机器上执行命令后打成一个镜像。

  2. 用新镜像分批更新系统盘。

对于以上操作,我们一步一步的操作实在是太繁琐了,这种发布流程对运维人员是一种考验,一个不留神可能就出错了,那么我们有没有自动化方案呢?有!使用系统运维管理

解决方案

机器分组

首先建议对机器进行分组,可以给机器打上相应的tag,比如我们可以给我们的ECS按环境来分组env:test和env:product这样比较方便管理,批量执行时候只需要选好相应的标签即可。

打镜像

然后我们需要解决更新镜像的问题,有了ECS云助手我们有了到机器上执行命令的通道,而OOS可以编排云产品的API,我们可以将一系列命令编排起来执行。更新镜像的话我们可以按原有镜像启动一台ECS,在ECS上执行命令,执行成功后关闭当前实例并给当前实例生成镜像,然后再释放临时实例。如下图所示。

以上步骤可以用OOS模板一步搞定,具体操作步骤如下。

  1. 请到OOS控制台执行更新镜像。

    image

  2. 并填写相应的参数。

    image

  3. 执行后,需要运行一段时间,我们可以看到运行的步骤和运行结果。

  4. 最后生成了一个新的镜像ID。

批量更新系统盘

这个步骤就相当于对每台机器执行,停止机器,等机器变成Stopped,更换系统盘,把机器启动,等机器到Running,循环直到所有机器操作完毕,这个过程不建议手动完成。

通过OOS也可以比较简单地解决这个问题,到OOS控制台搜索系统盘,找到批量更换系统盘模板。

image

创建执行,选择实例,这里可以手动选择实例也可以按tag来,我之前已经给机器打好了标签env:test这里就用tag来操作,批次控制支持并发执行和分批执行,这两个的区别是并发执行永远保持n个运行中的,而分批执行是执行完第一批再执行第二批,我这里就选并发执行,每次1台。

image

单击执行,我们可以看到已经在运行中,并且符合预期地一台一台地执行。等待执行成功,整个分批更换系统盘的操作就完成了。

总结

我们通过以上步骤实现了一套ECS基于镜像的发布流程。如果我使用了负载均衡ECS挂载到了SLB上,希望在替换系统盘前先从SLB移除,更换好再挂载上去实现无缝升级能做到吗?这两个步骤有办法合并成一个模板吗?有办法在提交代码后自动触发整个过程吗?

答案当然是肯定的,CI以后调用OOS aliyuncli或者SDK做集成触发模板就可以了,对于全自动整个过程,可以自定义模板来做,我们也整打算把这个功能变成一个公共模板来使用。我们帮助一个客户实现了整个流程大大的提升了客户的运维效率,带来自动化的同时为客户也提供了白屏化的操作工具。将整个发布过程变得顺畅透明安全。