基础设施即代码
2016年3月1日
基础设施即代码是一种通过源代码定义计算和网络基础设施的方法,然后可以像对待任何软件系统一样对待这些代码。此类代码可以保存在源代码控制中,以允许可审计性和 可重复构建,并接受测试实践和 持续交付 的全面规范。在过去十年中,这种方法一直被用于处理不断增长的 云计算 平台,并将成为未来处理计算基础设施的主要方式。
我成长于 铁器时代,当时发布新的服务器应用程序意味着要找到一些物理硬件来运行它,配置该硬件以支持应用程序的需求,并将该应用程序部署到硬件上。获得这些硬件通常很昂贵,而且也很漫长,通常需要几个月的时间。但现在我们生活在云时代,启动一台新服务器只需几秒钟,只需要一个互联网连接和一张信用卡。这是一个动态基础设施,其中使用软件命令来创建服务器(通常是虚拟机,但也可以是裸机上的安装)、配置它们并拆除它们,所有这些都不需要接触螺丝刀。
实践
基础设施即代码基于以下一些实践
- 使用定义文件:所有配置都在可执行的配置定义文件中定义,例如 shell 脚本、Ansible playbook、Chef recipe 或 Puppet 清单。任何时候都不应该有人登录服务器并进行即时调整。任何此类修补都有可能创建 雪花服务器,因此只应在开发充当持久定义的代码时进行。这意味着使用代码应用更新应该很快。幸运的是,计算机执行代码的速度很快,这使得它们能够比任何人都快地配置数百台服务器。
- 自文档化的系统和流程:代码比人类执行的文档中的指令更精确、更一致,而人类执行的指令通常具有人为可靠性。如有必要,可以从该代码生成其他人可读的文档。
- 对所有内容进行版本控制:将所有这些代码保存在源代码控制中。这样,每次配置和每次更改都会被记录下来以供审计,并且您可以进行 可重复构建 以帮助诊断问题。
- 持续测试系统和流程:测试允许计算机快速发现基础设施配置中的许多错误。与任何现代软件系统一样,您可以为您的基础设施代码设置 部署管道,这使您能够实践基础设施更改的 持续交付。
- 小批量更改而不是批量更改:基础设施更新越大,包含错误的可能性就越大,并且越难检测到该错误,尤其是在多个错误相互作用的情况下。小更新更容易发现错误,也更容易回滚。在更改基础设施时,频率降低难度。
- 保持服务持续可用:越来越多的系统无法承受升级或修复造成的停机时间。诸如 蓝绿部署 和 并行更改 之类的技术可以允许在不损失可用性的情况下进行小更新
好处
所有这些都使我们能够利用动态基础设施,轻松启动新服务器,并在服务器被更新的配置替换或负载减少时安全地处置服务器。创建新服务器只需运行脚本即可创建所需数量的服务器实例。这种方法非常适合 凤凰服务器 和 不可变服务器
使用代码定义服务器配置意味着服务器之间的一致性更高。使用手动配置,对不精确指令的不同解释(更不用说错误)会导致雪花具有细微不同的配置,这通常会导致难以调试的棘手故障。不一致的监控通常会加剧此类困难,而再次使用代码可确保监控也保持一致。
最重要的是,使用配置代码可以使更改更安全,从而降低应用程序和系统软件升级的风险。可以更快地发现和修复故障,并且在最坏的情况下,可以将更改恢复到最后一个正常工作的配置。
将您的基础设施定义为版本控制的代码有助于合规性和审计。对配置的每次更改都可以记录下来,并且不易受到错误记录的影响。
当您需要处理更多服务器时,所有这些都变得越来越重要,如果您要认真采用 微服务,那么基础设施即代码功能就变得必不可少。基础设施即代码技术可以有效地扩展以管理大型服务器集群,包括配置服务器和指定它们如何交互。
致谢
这篇文章基于Kief Morris的著作和多次对话,他撰写了关于该主题的权威书籍。实践列表直接取自本书
Ananthapadmanabhan Ranganathan、Danilo Sato、Ketan Padegaonkar、Piyush Srivastava、Rafael Gomes、Ranjan D Sakalley、Sina Jahangirizadeh 和 Srivatsa Katta 在我们的内部邮件列表中讨论了这篇文章的草稿。