Immutable Infrastructure
什么是Mutable Infrastructure
传统物理服务器时代,企业倾向于对服务器做修改以实现商业目的。如,更换配件,原地更新软件包(upgrade app),修改配置(update configuration),打补丁(ad-hoc fixes),微调(tweaks)。这些操作渐渐把一个服务器变得独一无二(SnowflakeServer)。这使得它难以被替换,难以维护,难以复制。你越来越无法理解其上面的某个配置这样配的原因。而这一切之所以会这样发展,是因为物理服务器时代服务器更新的难度大,成本高,周期长。所以企业在服务器更新上发展出很多技术,但都是围绕着原地升级的思路发展的。
什么是Immutable Infrastructure
到了虚拟化时代,虚拟服务器变得可以被轻易替换(disposable),整个服务器可以在秒级被重新构建。这使得使用服务器被整体替换的方式更新服务器比原地升级服务器来的更划算。服务器一旦部署完就不再被修改,服务器需要升级时,是基于一个基线重新构建然后替换原有服务器。这使得服务器的复制,替换变得轻而易举。这种服务器也叫PhoenixServer。这样的基础架构无疑更加健壮,可维护。
如何实现Immutable Infrastructure
- 禁止人工登录服务器做任何修改
- 使用虚拟化技术
- 服务器可以基于镜像快速构建,
- 服务器的生命周期管理由软件自动化实现
- 服务器目标状态由文档定义
- 文档由VCS管理
- 服务器更新由自动化工具基于VCS里文档的更新触发,并最终实现目标状态
- 一个无状态,变化频繁的应用层
- 一个数据持久层
- 日志中心,记录服务器的每次变更
- 外部数据存储,无状态应用层服务器被频繁替换,数据必须存储在外部
- 开发和运维无间合作(DevOps)
- 使用混沌工程工具验证服务的健壮性
理想很丰满,现实很骨感
如果在物理服务器上利用严格规范和自动化工具是否能打造Immutable Infrastructure呢?理论上可以,但现实是物理服务器很多场景下难以实现批量统一的更新,因为物理服务器太大,上面跑的东西太多。
那么是不是使用了虚拟化技术,就一定能实现Immutable Infrastructure?答案是否定的。国内很多大厂,甚至是云计算提供商,其内部服务虽然使用了虚拟机,甚至容器,但是其运维范式仍然遵循传统原地升级模式,仍然会登录到虚拟机或容器内部做一些修改,或者只有部分技术栈(如服务软件包,基础软件包)实现了基线化管理,而其他技术栈(如操作系统配置,网络配置)还是通过其他途径手动升级,整体效果仍然和传统Mutable Infrastructure一样。举个例子,应用扩容一台机器,而防火墙没有同步更新,导致新扩容的服务器和其他服务器之间网络不通,需要人工修改网络配置才能打通网络。
所以说,真正的Immutable Infrastructure的落地,是依赖强有力的运维能力的,而这样的运维能力又依赖配套的组织架构关系和DevOps文化和极强的规范化。