基础设施即代码

2016年3月1日

Kief Morris 的书 是深入了解如何使用基础设施即代码来利用从铁器时代到云时代的转变的核心文本。

基础设施即代码是一种通过源代码定义计算和网络基础设施的方法,然后可以像对待任何软件系统一样对待这些代码。此类代码可以保存在源代码控制中,以允许可审计性和 可重复构建,并接受测试实践和 持续交付 的全面规范。在过去十年中,这种方法一直被用于处理不断增长的 云计算 平台,并将成为未来处理计算基础设施的主要方式。

我成长于 铁器时代,当时发布新的服务器应用程序意味着要找到一些物理硬件来运行它,配置该硬件以支持应用程序的需求,并将该应用程序部署到硬件上。获得这些硬件通常很昂贵,而且也很漫长,通常需要几个月的时间。但现在我们生活在云时代,启动一台新服务器只需几秒钟,只需要一个互联网连接和一张信用卡。这是一个动态基础设施,其中使用软件命令来创建服务器(通常是虚拟机,但也可以是裸机上的安装)、配置它们并拆除它们,所有这些都不需要接触螺丝刀。

实践

基础设施即代码基于以下一些实践

  • 使用定义文件:所有配置都在可执行的配置定义文件中定义,例如 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 在我们的内部邮件列表中讨论了这篇文章的草稿。