云原生时代,不可不知的基础设施即代码(IaC)


何为 IaC?
 
基于 Thoughtworks 公司云实践领导人 Kief Morris 在《基础设施即代码》一书中对基础设施即代码的定义:
 
基础设施即代码 (Infrastructure-as-Code,IaC) 指的是通过代码而不是手动流程,来管理和配置基础设施。它把基础设施、工具和服务以及对基础设施的管理本身作为一个软件系统,采纳软件工程实践 (SRE),以可重复的、可靠的方法来设计、改变和部署软件环境,以声明性的方式取代手工操作。
 
IaC 发展至今,从概念到落地,从小众到普及,随之诞生了许多 IaC 流行工具(如下图),帮助 DevOps 团队以最佳方式自动化基础设施部署和管理。
 
 
为什么 IaC 很重要?
 
大数据和云计算时代下的新挑战
 
SRE 的职责之一是为业务提供基础资源,维护各种服务的性能和稳定性。
 
在传统工作流程中,业务方向运维团队提供一个资源需求工单,运维团队根据需求工单,手动配置软硬件基础资源给业务方。在企业规模小、业务变化小的前提下,可能一台虚拟机就可以支撑公司的所有业务,该方式可以基本满足需求。
 
随着大数据和云计算时代的到来,依靠分布式服务器构建起来的 “云” 集群带来了强大的计算能力;资源的动态伸缩、高扩展性也使得集群的架构变得更加复杂多元,给 SRE 的工作带来了新的挑战:
 
 
➤ 日益增长的需求
企业信息化和数字化程度不断提升,IT 基础设施规模和复杂度也在不断增加。
 
➤ 手动操作瓶颈
大规模复杂集群给手动操作带来瓶颈,通过人力运维必定是不可取的,依靠自动化工具进行管理成为必然。
 
➤ 脱离的反馈
长期以来,开发者和运维人员的协作方式是分裂的,沟通反馈环是相互脱离的,导致生产效率低、故障排除慢。
 
➤ 手动操作错误
手动操作不可避免地会有失误,规模扩大导致更大的人为失误。
 
IaC 帮助企业降本增效,并实现 GitOps 目标
 
GitOps 是一个软件开发框架,它使组织能够持续交付软件应用程序,同时使用 Git 作为单一事实来源有效地管理 IT 基础设施。
 
GitOps 是 DevOps 的一个子集,它结合了 IaC 和 DevOps 最佳实践,创建了一个操作模型,用于管理架构并根据 Git 存储库的状态即时复制系统
的云基础架构。
 
IaC 协助企业以多种方式管理其 IT 基础设施需求,基于以下主要优势,帮助企业降本增效;同时,结合 Git 的代码管理与版本控制,和 CI/CD 自
动化,可以实现更高一级的 GitOps 目标。
 
➤ 自动化
通过自动化加快基础设施配置速度,并借助可见性优势帮助企业内的其他团队提升工作速度、强化工作效率。
 
➤ 声明式
以声明式方式,直接指定定基础设施的理想状态,如想要的资源、必需的属性等,而不是过程。IaC 工具会自动配置理想的基础设施,可多次执
行且结果相同,无需人为干预。
 
➤ 可重用性
可轻松使用同一份代码多次创建和销毁多个资源。
 
➤ 可验证
可集成单元测试或端到端测试,验证理想状态与当前状态的基础设施的差异。如果结果与预期不一致,就对代码进行迭代,直到结果通过测试并
与预期一致。
 
➤ 提高一致性
基于代码化实现环境创建的单一可信来源,使得每次均能提供相同环境,实现基础设施配置的全面标准化,消除配置漂移。
 
「不可变基础设施」时代来临
 
  • 可变基础设施:指在生产中改变基础设施组件,而整个服务或应用继续正常运行的做法。其好处是在基础设施中有更多的一致性和可靠性,以及更简单更可预测的部署过程。它可以缓解或完全防止可变基础设施中常见的问题。
  • 不可变基础设施:指基础设施和应用结合在一起,创建成一个完整的服务或应用程序。如果任何组件需要改变,它不会被改变或重新配置,它们都被更新并有效地重新部署在一个实例中。一个新的迭代被组装、测试、验证和启动,而旧的迭代则被停止,其资源被释放以重新使用。
 
不可变的基础设施已经获得了青睐,特别是在云和微服务环境中,这些环境具有高度的可扩展性,涉及更多相互依赖的组件和服务。与打补丁和
重新配置单个基础设施组件相比,重新发布成套的不可变的服务和组件更有效率和效果。
 
使用 IaC 可以实现「不可变基础设施」这种新的运维逻辑。以数据库升级为例:
 
在不可变基础设施逻辑下,不是直接在原有数据库环境上进行升级,而是通过打包软件,打包到虚拟机镜像当中,通过逐个替换原有集群中的镜
像的方式,将服务逐步升级。
 
 
IaC 工具有哪些?
 
目前,市面上有很多流行的 IaC 工具,它们具有一些共性:
 
  • 使用 Yaml、Json、Jsonnet、HCL2 等 DSL 语言代码化定义;
  • 以声明式编程模式为主;
  • 完全开源或开放基本组件模式,并有额外的商业服务帮助企业从产品中提取额外价值的功能;
  • 支持多云/混合云模式,无云厂商绑定。
 
 
上述工具在解决不同问题上,各有所长:
 
  • 创建/改变/销毁基础设施资源,如计算、存储、网络组件或平台服务,如数据库、Kubernetes 集群等;
  • 在基础设施之上部署/更新应用程序;
  • 管理应用程序所使用的配置。
 
那么如何选择 IaC 工具呢?需要根据实际情况参考以下维度进行选择:
 
  • 使用哪种操作系统来构建云资源:Windows 或 Linux?
  • 在使用哪个云供应商?AWS、Azure 和谷歌云还是国内云厂商。
  • 将使用哪种编程语言?Yaml、Json、Python、Golang?
 
同时,各个工具在使用范畴范围上也有所不同,如下图:
 
 
极狐GitLab 上的 IaC 实践
 
极狐GitLab 也提供了 7 大功能支持 IaC,包括:
 
代码管理及版本控制
 
IaC 本身是代码。极狐GitLab 作为一体化安全 DevOps 平台,管理代码是基本功能,十分擅长。
 
极狐GitLab SRE 团队即将 IaC 全部托管于极狐GitLab 上。
 
 
CI/CD
 
极狐GitLab 提供基于 Terraform 的 IaC 流水线模板,支持以 Pipeline as Code 的方式引用,无需任何额外配置即可实现 IaC 自动化流水线的创建
和运行,降低用户的使用门槛,快速支撑用户实现基础设施的代码化和自动化。
 
 
合并请求 (MR)
 
IaC 使得用户能够摆脱传统基础设施变更中复杂和繁重的流程,通过采用软件研发中最经典的代码检视(Code Review)实践,从代码维度对基础
架构的更改进行验证、审核与协作,确保基础环境的服务连续性。
 
极狐GitLab 为此提供了基于合并请求 (MR) 的解决方案,通过在合并请求页面中可视化 Terraform 的代码更改、测试结果和预期效果,大幅提升基
础变更管理提交和审批的协作效率。
 
 
基础设施注册表
 
有了极狐GitLab 基础设施注册中心,你可以将极狐GitLab 项目作为基础设施包的私有注册中心,用极狐GitLab CI/CD 创建和发布包,然后从其他
私有项目中消费。
 
 
基础设施即代码(IaC)扫描
 
基础设施即代码(IaC)扫描可以扫描你的 IaC 配置文件的已知漏洞。
 
目前,IaC 扫描支持 Terraform、Ansible、AWS CloudFormation 和 Kubernetes 的配置文件。
 
 
管理 Terraform 状态
 
代码与实际资源之间还有状态文件的映射,进行对比即可得知目标状态与实际状态的差距。极狐GitLab 提供状态文件托管,确保版本一致。
 
 
极狐GitLab SaaS 基础设施架构
 
极狐GitLab SaaS 的基础设施架构,目前已经实现了 100% 的 IaC 管理,基本没有手动操作。IaC 工具链路关系如下图所示:
 
 
极狐GitLab SaaS IaC 开发流程与其他软件开发流程一致,如下图所示:
 
 
  • 当产生需求时,创建 Issue ,同时创建 Merge Request(后续代码变更在此 Merge Request 上进行),提交 commit 进行相关修改;
  • 一旦有代码提交,就会触发 CI/CD,完成从构建、测试、安全扫描到部署整个流程,从而完成 Issue 和 Merge Request 的一一关联。
 
IaC 最佳实践
 
IaC 实践,同样遵循代码开发最佳实践,包括:
 
  • 模块化、高内聚、低耦合、抽象
  • 分层,比如对一些服务提供模块,对另一些服务使用模块,对代码进行隔离;
  • 自动测试少不了,确保线上代码都是经过 Staging 环境验证 de;
  • 代码可读性,便于 Review 和协作;
  • Code Review
  • CI/CD
 
以模块化与分层为例,如下图,极狐GitLab Terraform 项目分成了专门提供模块的项目(左)与专门应用模块的项目(右)
 
 
完成了模块包装,在后续使用中,只需要指定目标与版本,即可引用整个封装好的模块。