基础设施是软件开发过程的核心原则之一——它直接负责软件应用程序的稳定运行。这种基础设施的范围从服务器、负载平衡器、防火墙和数据库一直到复杂的容器集群。
对基础设施的考虑不仅要适用于生产环境,因为它们遍及整个开发过程,还包括工具和平台,如CI/CD平台、登台环境和测试工具。随着软件产品复杂度的增加,对这些基础设施的考虑也要随之变化。为了满足DevOps现代快速软件开发周期的需求,手工管理基础设施的传统方法很快就变成了一个无法扩展的解决方案。这就是IaC已成为如今开发中事实上的解决方案的原因。
什么是基础设施即代码?
IaC,Infrastructure as Code,基础设施即代码,是通过代码而非手动定义的基础设施的供应和管理过程。IaC从开发人员那里拿走了大部分资源调配工作,开发人员可以执行脚本以准备好基础设施。这样一来,应用程序部署就不会因为等待基础设施而受阻,系统管理员也无需管理耗时的手动流程。
以下是创建IaC环境工作原理的步骤说明:
- 开发人员用特定于域的语言(DSL)定义配置参数。
- 指令文件被发送到主服务器、管理API或代码存储库。
- IaC平台按照开发人员的指示创建和配置基础设施。
通过将基础设施作为代码,用户不必在每次开发、测试或部署软件时都配置环境。所有基础设施参数都以称为清单的文件的形式保存。
与所有代码文件一样,清单易于重用、编辑、复制和共享,它使构建、测试、准备和部署基础设施更快、更一致。
开发人员对配置文件进行编码,并将其存储在版本控制中。如果有人编辑了一个文件,拉取请求和代码审查工作流可以检查更改的正确性。
IaC最佳实践
基础设施自动化的实施将需要大量的更改和重构,这对组织来说可能是相当繁重的过程。如果想避免大多数的限制,并使过渡尽可能平滑,请遵循下面的最佳实践!
为IaC的版本库使用CI/CD和质量控制
这将帮助您保持代码的良好质量,并从您的DevOps团队或开发人员那里获得快速反馈循环(在应用更改之后)。幸运的是,有一些测试框架,比如Terratest for Terraform,允许我们编写实际的测试。越早尝试用它覆盖所有内容,就越能从中受益,基础设施发生的意外问题也就越少。可以肯定的是,在这里虽无法预测应用程序错误,但至少可以对自己的基础架构更有信心。
让你的基础设施成为模块化的代码
微服务体系结构是软件开发中的一种流行趋势,它通过开发更小、模块化的代码单元来构建软件,这些代码单元可以独立于产品的其他组件进行部署。
同样的概念也适用于IaC。可以将基础设施分解为单独的模块或堆栈,并以自动化的方式将它们组合起来。
这种方法有如下优势:
- 首先,可以灵活控制基础结构代码各部分的访问权限。例如,初级工程师可能不熟悉或不具备基础设施配置某些部分的专业知识,通过模块化基础架构代码,就可以在初级工程师跟上进度之前,拒绝他们访问这些组件。
- 此外,模块化基础设施自然地限制了可以对配置进行的更改数量。较小的更改使bug更容易检测,并使您的团队更加灵活。
如果使用IaC来支持微服务体系结构,那么应该使用配置模板来确保基础设施扩展为大型服务器集群时的一致性。这最终将对配置服务器和指定它们应该如何交互非常有价值。
持续测试、集成和部署
持续的测试、集成和部署过程是管理可能对基础架构代码进行的所有更改的好方法。
测试应该严格应用于您的基础架构配置,以确保没有部署后问题。根据您的需要,应该执行一系列测试。可以设置自动测试,以便在每次更改配置代码时运行。
基础设施的安全性也应该被持续监控和测试。DevSecOps是一种新兴的实践,安全专业人员与开发人员一起工作,在整个软件开发生命周期中不断地整合威胁检测和安全测试,而不是仅仅在最后投入。通过增加测试、安全和开发团队之间的协作,可以在开发生命周期的早期识别Bug和威胁,从而在上线时将其最小化。
通过良好的持续集成过程,这些配置模板可以在不同的环境(如开发、测试和质量保证)中多次使用。然后,开发人员就可以在这些环境中使用一致的基础设施配置。这种持续集成将降低在将基础架构部署到生产环境中时出现可能对应用程序有害的错误的风险。
维护版本控制
这些配置文件将受版本控制。因为所有配置细节都是用代码编写的,所以对代码库的任何更改都可以进行管理、跟踪和协调。
与应用程序代码一样,应该使用Git、Mercurial、Subversion等源代码控制工具来维护IaC代码库的版本。这不仅可以为代码更改提供审计跟踪,还可以在IaC代码上线之前进行协作、同行评审和测试。
代码分支和合并最佳实践也应该用于进一步增加开发人员的协作,并确保对IaC代码的更新得到正确管理。
如果刚刚开始使用IaC,不要试图在一开始就将一切自动化。原因是变化的速度很快。一旦您的平台变得或多或少稳定,您将能够自动化其资源调配和维护。
IaC的挑战
IaC的好处很多,但这种模式确实存在一些需要解决的挑战,可以在实施过程之前了解并妥善解决。
配置漂移
无论您配置服务器的一致性或频率如何,从长远来看,都可能出现配置漂移。这就是在建立IaC工作流程后,需确保没有外部干扰的原因。每次需要修改基础设施时,必须确保按照预先建立的维护工作流程进。这一原则被称为基础设施不变性——即基础设施应完全按照指定的方式运行,如果需要更改,则会提供一套全新的基础设施,并完全替换过时的基础设施。
如果您最终仍然对类似的系统组进行了不一致的更改,其中一些更改将不可避免地与其他更改不同,这可能会导致配置的变化。
错误的潜在重复
尽管IaC的实施过程和机器创建在很大程度上依赖于自动化,但整个过程中仍有某些部分需要手动完成。编写父代码是其中一个过程,而且当涉及人工工作时,总是有可能出错。即使在QA检查定期且一致的环境中,人们也可能犯错误或忽略关键的事情。
作为自动化的副作用,这些错误可能会在多台机器上发生,并且可能会造成尽可能多的安全漏洞。请记住,几乎所有云漏洞都来自错误配置。为了确保自始至终的安全,建议仔细检查生成IaC体系结构的代码,这可以通过严格且极为一致的测试和彻底的审核过程来实现。当然,这些额外的工序往往也会增加相应的费用支出。
对于寻求自动化和更快交付的组织来说,作为代码的基础设施正在缓慢但确定地成为常态。只有通过简化的工作流程和改进的开发环境,才能更快地开发应用程序。