云原生落地:企业级DevOps实践
上QQ阅读APP看书,第一时间看更新

1.8.1 什么是不可变基础设施

不可变基础设施(Immutable Infrastructure)由Chad Fowler在2013年提出,其核心思想是任何基础设施的实例一旦创建后即变为只读状态,若需修改和升级,则应使用新实例进行替换。不可变基础设施与程序设计中不可变变量(Immutable Variable)一样,赋值后不可变更,要想重新定义,只能通过创建新的变量来替换。

与不可变基础设施对应的是可变基础设施。在上容器之前,开发或运维人员的常见操作是根据应用名称,找到对应的服务器IP,之后进行代码文件的替换。一般来说,如果不进行扩容,服务器IP是常年不变的。比如我所在公司曾有一个用PHP语言写的搜索服务,对应的4台服务器IP是172.168.1.100-103,运维人员上线时通常是通过SSH(Secure SHell,安全外壳)协议找到这4台服务器,手动替换对应的代码文件,相当于这几台服务器虽然一直固定,但是代码在不断地更新迭代,久而久之补丁越大越多,可能同一段逻辑有多个不同的冗余版本,线上代码居然有1GB之大,无人敢去优化,逐步变成了一个极大的“代码肿瘤”。换言之,这些服务器创建之后,可以对它们进行更改、升级、调整,这就是之前的可变基础设施。

不可变基础架构是另一种基础架构范例,其中服务器在部署后永远不会被修改。如果需要以任何方式更新、修复或修改某些内容,则应根据具有相应更改的公共映像构建新服务器以替换旧服务器。经过验证后,新服务器投入使用,而旧的则会退役。比如Kubernetes中的Pod滚动更新,旧的4台Pod进行发布后,会有4台新的Pod被创建,它们具有新的Pod IP,旧的4台Pod会被停止,如图1-15所示。

图1-15 滚动更新示意图