1.4.1 自动化
自动化是云原生的一个核心原则。它的理念是将重复性的人工任务进行自动化,以加快云原生应用的交付和部署。很多任务都可以实现自动化,从应用的构建到部署,从基础设施的供应到配置管理均是如此。自动化最重要的优势在于,它能够将流程和任务变成可重复的,这样系统整体会更加稳定可靠。手动执行任务容易出错,并且会增加成本。通过将任务自动化,我们可以得到更加稳定和高效的结果。
在云计算模型中,计算资源会以自动化、自服务的模式供应,并且能够弹性增加或减少资源。云计算自动化的两个重要方面就是基础设施供应和配置管理,我们分别将其称为基础设施即代码(infrastructure as code)和配置即代码(configuration as code)。
Martin Fowler将基础设施即代码定义为“通过源代码的方式来定义计算和网络基础设施,就像任何其他软件系统代码一样”[11]。
[11] M. Fowler, “Infrastructure As Code”, http://mng.bz/DD4。
云供应商提供了便利的API来创建和供应服务器、网络和存储。通过使用像Terraform这样的工具将这些任务进行自动化,将代码进行源码控制并采用与应用开发相同的测试和交付实践,我们可以得到一个更可靠和更可预测的基础设施,它是可重复、更高效并且风险更低的。比如,一个自动化此类任务的样例可能是创建一个新的虚拟机,它具有8个CPU、64GB的内存,并且安装了Ubuntu 22.04操作系统。
在供应完计算资源之后,我们就可以管理它们并对它们的配置实现自动化。套用前面的定义,配置即代码指的是通过源代码的方式来定义计算资源的配置,就像任何其他软件系统代码一样。
通过使用像Ansible这样的工具,我们能够声明服务器或网络该如何进行配置。例如,按照上文所述提供了Ubuntu服务器之后,我们可以自动完成安装Java Runtime Environment(JRE) 17,并在防火墙上打开8080和8443端口的任务。配置即代码的理念也适用于应用的配置。
通过将基础设施供应和配置管理相关的所有任务自动化,我们可以避免不稳定、不可靠的“雪花服务器”(snowflake server)。当每台服务器都是以手动的方式进行供应、管理和配置的时候,其结果就是服务器像雪花一样,即该服务器是脆弱且独一无二的,无法复制,并且变更起来也有风险。自动化能够避免出现雪花服务器,并形成“凤凰服务器”(phoenix server),即作用于这些服务器的所有任务都是自动化的,每个变更都可以在源码中进行跟踪,降低了风险,并且每个设置过程都是可重复的。如果将这种理念发挥到极致,我们就会实现所谓的不可变服务器(immutable server),CNCF在其云原生定义中也提到了不可变基础设施。
注意 在对比传统的雪花基础设施(需要很多的关注和照料,就像宠物一样)和不可变基础设施或容器(其特点是可拆卸和可替换,就像牲畜一样)时,你可能听过“宠物与牲畜”这种表述方式。在本书中,我不会使用这种表述,但是在关于该话题的讨论中,有人可能会用到这种方式,所以你需要注意一下。
在最初的供应和配置完成之后,不可变服务器不允许再进行任何变更,也就是说它们是不可变的。如果有必要进行改变的话,会以代码的方式进行定义和交付。最终,会根据新的代码供应和配置新的服务器,而之前的服务器则会被销毁。
例如,如果现在的基础设施包含Ubuntu 20.04服务器,你想要将其升级到22.04,那么你有两个方案。第一种方案是通过代码定义升级,并在现有的机器(凤凰服务器)上运行自动化脚本以执行操作。第二种方案是自动供应带有Ubuntu 22.04的新机器,并开始使用它们(不可变服务器),而不是在现有的机器上进行升级。
在下一节中,我们将会讨论构建和部署应用的自动化问题。