翻译自 Infrastructure as Code in Any Programming Language 。
并非每个工程师都有深厚的基础设施背景,但现在需要更多地亲身实践。这就是基础设施即代码可以提供帮助的地方。
这是一个由三部分组成的系列中的第一部分。
基础设施即代码是一种用于自动化云应用程序基础设施的技术。如果你是一名工程师,无论是开发后端服务还是在中央平台团队中工作,你需要进行基础设施的配置、更新和执行其他与其支持相关的任务,而这就是基础设施即代码所能帮助的地方。与手动在云控制台中进行指针点击(这是不可重复和容易出错的)或编写特定脚本(这可能是繁琐且难以扩展的)不同,基础设施即代码让我们作为工程师,只需编写代码即可使用熟悉的技术。
并非每个工程师都具备深入的基础设施背景,但现在需要更多地参与基础设施的工作,这是可以接受的:本系列文章从工程师的角度撰写。我们将通过 Pulumi ,一种广受工程师欢迎的基础设施即代码工具,阐述基础设施即代码的原因、内容和实施方法,帮助解开其神秘面纱。
现代应用程序需要云基础设施才能运行。这同样适用于运行在虚拟机上的简单单体应用程序,也适用于完全弹性可伸缩的异构分布式无服务器应用程序。这些应用程序需要直接使用的基础设施,比如它们运行在其中的任何内容(例如虚拟机、容器化服务、无服务器函数、静态网站),以及它们使用的任何其他资源(数据库、发布/订阅主题、队列、AI/ML服务、可观测性指标和仪表板),但它们也依赖于更原始的基础设施来运行(如Kubernetes集群、安全角色和权限、私有网络、负载均衡器、加密密钥等)。
“云基础设施”这个词的含义比它看起来的要广泛。这个词组立刻让人想到像亚马逊网络服务(AWS)、微软 Azure 和谷歌云这样的流行云平台,以及更专业或区域性的云平台,如阿里云、DigitalOcean和Oracle Cloud。它还快速引领我们进入云本地基础设施,如 Docker 、 Kubernetes 和 Helm 。但这个词组也可能不明显地适用于现代软件即服务(SaaS)基础设施公司,它们越来越多地提供关键的云基础设施部件,包括 Confluent 、 Cloudflare、 Databricks、 DataDog、 Elastic、 MongoDB、 New Relic 和 Snowflake 。
这些公司本质上是专业云,提供更专业的服务,但正在不断扩展成为他们自己的云。它还适用于 F5、VMware vSphere 和相关技术等私有云技术。最后,同样不明显的是,我们每天都在使用具有可配置状态的 SaaS 工具,并且可能需要像我们的其他云资产一样进行可重复管理,包括 Auth0、GitHub、GitLab 和 PagerDuty。
云基础设施的影响范围很广!但这也意味着有许多复杂的移动部件需要管理和驯服。随着云功能出现如此多的创新,这种复杂性只会随着时间的推移而增加。这引出了如下问题:
基础设施从何而来?随着需求的发展,我们如何改变它?我们如何随着需求的增长扩展它,无论是增加我们工作负载可用的计算和内存,扩展到许多新实例,增加我们的可用性并通过部署到全球新区域和环境来减少延迟......或者,通常情况下,所有这些的组合?
如果出现故障或出现错误,我们如何确保我们的基础设施实践是可重复的?我们如何捕捉和重用最佳实践?这些问题的答案是否因云而异?我们如何确保协作可以安全进行,并且我们的部署不会不稳定且容易发生冲突?我们如何保护所有这些并确保始终执行最佳实践和政策?
这些都是基础设施即代码解决的事情,它从代码开始。
基础设施即代码方法提供了许多好处,但它们分为两大类:
- 使用代码声明基础设施
- 使用声明式引擎来协调基础设施更改
正是这两件事的结合导致了“基础设施即代码”的魔力。
将云应用基础设施编码成代码将产生一个持久的表示所需架构的工件。这可以通过代码审查,在源代码控制中提交并按照通常的方式进行版本控制。基础设施即代码工具不仅知道如何建立基础设施的初始版本,还可以将其复制到许多环境中(例如开发、暂存、生产和多个地区),并升级单个环境以适应您的需求变化。
就“代码”方面而言,在基础设施即代码领域中,您的代码表达方式因工具而异。有些工具支持像 JSON 或 YAML 这样的标记语言,而其他工具支持特定于该工具的领域特定语言(DSL)。在本文中,我们将使用 Pulumi ,它采用一种独特的基础设施即代码方法,非常适合工程师使用:您可以使用行业标准的通用编程语言,包括 C#、Go、Java、JavaScript、Python 或 TypeScript 来表达您的代码。这种方法非常适合工程师,因为它使基础设施更易于访问,并且让您使用您已经在团队中用于构建其他软件的标准工程工具和实践。
这些优点的例子包括具有丰富的构造,如简单的 if 语句和 for 循环,有助于避免重复和建模复杂的基础设施需求。由于所有这些语言在整个行业广泛支持,因此您使用的任何编辑器都将拥有出色的支持,例如 Visual Studio Code、PyCharm、Sublime Text、IntelliJ,甚至是 vim 或 emacs。这意味着您将获得交互式语句完成,如果您打错字或存在类型检查错误,则会出现红色波浪线,悬停时会有文档,右键单击可转到定义或重构,以及更多功能。这些对于软件工程生产力至关重要,很容易将它们视为理所当然。
除此之外,还有其他的好处,例如 lint 工具、测试工具、使用包管理器共享和重用而不是复制粘贴等。最后,每种语言都有庞大的社区,总共超过 2000 万工程师,这意味着有大量的知识和支持可用。
Pulumi 支持 YAML ,实际上 YAML 中的 L 代表着 Language ,因此这也是一个不错的选择,适用于简单的场景,想要机器自动生成基础设施代码的场景,或者工程师想要让系统管理员也能够进行基础设施即代码。
代码是一个主要的优点。但除了代码的好处外,基础设施即代码还有另一个重要的优势:即使你选择使用像 Go 这样的命令式语言来表达你的代码,它仍然是“声明式”的。
基础设施即代码工具通常使用“期望状态”的概念进行工作。运行代码时,它会生成应用所需基础设施的图像。然后,基础设施即代码工具会根据该信息了解如何将期望状态与实际状态进行比较,并计划采取行动的方案。
如果这是您第一次创建某个环境,Pulumi称之为“堆栈(stack)”,那么当然所有声明的基础设施都需要从头创建。在后续的评估中,这些相同的基础设施可能需要进行更新、删除或甚至重新创建,此外还可能会在首次声明时生成新的基础设施。这个计划在执行任何操作之前就会呈现出来,因此您和您的团队可以审查它,如果行动计划有误,可以先进行更正。
这个过程的一个例子是,首先创建一个微服务环境,其中包括一个第 4 层网络负载均衡器、一个容器化集群和一个复制的容器化服务。接下来,您可以添加一个私有容器注册表,切换到第 7 层应用程序负载均衡器,并将服务从一个副本扩展到三个副本。
这种声明性方法确保我们在进行更改之前可以预览它们,因此我们不会有任何令人不快的部署意外;它为我们提供了完整的审计历史记录,记录了实际基础设施的变更内容和时间,类似于源代码控制对我们的代码工件所做的事情;它允许我们在验证检查(例如测试和策略强制执行)上限制部署,并使其更容易与各种自动化工作流程集成。
正是基础设施的编码和声明式方法的可重复性,让我们可以在许多种自动化工作流中使用基础设施即代码。其中包括手动运行命令行界面(CLI)或作为脚本的一部分。虽然“手动”听起来不好,但实际部署是使用上述所有保护措施完成的,因此基础设施即代码工具以这种方式运行是相当常见的。
然而,大多数团队将采用 CI/CD 模型来处理其最重要的环境,例如生产环境,这将在代码提交时触发实际的部署。这确保所有更改已按照通常的方式进行了审查,并通过标准的 CI/CD 管道。该管道还可能包括持续验证(CV),例如运行测试。
一些基础设施即代码工具仅支持一个云平台,但我们选择的工具 Pulumi 支持多个云平台,包括上述提到的所有云平台,因此可以在所有云平台和服务提供商之间标准化所有这些工作流程。它甚至可以跟踪云服务之间的依赖关系,例如,在 AWS 中预置一个弹性 Kubernetes 服务集群,在其节点上安装 Datadog 代理,部署一些 Kubernetes 工作负载,并在该应用程序前面放置 Cloudflare 内容交付网络,所有这些操作都可以使用一个基础设施即代码程序完成。
Pulumi 的独特方法使用其所谓的“自动化 API”,为运行代码开启了一个更加复杂的工作流程。这种方法将基础设施即代码工作流直接嵌入到更大的软件中,以便可以针对高度动态的场景进行编程。
这解锁了一些场景,例如构建自定义工具和库,这些工具和库构建在基础设施之上并扩展基础设施即代码、内部基础设施配置门户,甚至整个 SaaS 产品需要配置或管理基础设施,作为将其功能交付给自己的最终用户的一部分。
在我们系列的第 2 部分中,我们将带您完成设置基础设施即代码所需的步骤。为此,我们将使用 Pulumi 的免费开源 SDK,可在此处获取。入门很容易,但您现在可能想花时间探索该平台。您可能还想注册 Pulumi Cloud,可以在此处完成。