4.3 基础设施即代码的 CI/CD 管道

为应用程序分配基础设施的传统方法包括最初用配置参数和持续的任务配置计算和网络资源,如补丁管理(如操作系统和库),建立符合合规法规(如数据隐私),并进行漂移(当前配置不再提供预期的操作状态)纠正。

基础设施即代码(IaC)是一种声明式的代码,它对计算机指令进行编码,这些指令封装了通过服务的管理 API 在公共云服务或私有数据中心部署虚拟基础设施所需的 参数。换句话说,基础设施是以声明式的方式定义的,并使用用于应用程序代码的相同的源代码控制工具(如 GitOps)进行版本控制。根据特定的 IaC 工具,这种语言可以是脚本语言(如 JavaScript、Python、TypeScript 等)或专有配置语言(如 HCL),可能与标准化语言(如 JSON)兼容也可能不兼容。基本指令包括告诉系统如何配置和管理 基础设施(无论是单个计算实例还是完整的服务器,如物理服务器或虚拟机)、容器、存储、网络连接、连接拓扑和负载均衡器。在某些情况下,基础设施可能是短暂的,基础设施的寿命(无论是不可变的还是可变的)不需要继续配置管理。配置可以与应用程序代码的单个提交相联系,使用的工具可以将应用程序代码和基础设施代码以一种合乎逻辑、富有表现力、为开发和运维团队所熟悉的方式连接起来,其中应用程序代码越来越多地定义了云应用的基础设施资源 要求

因此,IaC 涉及编码所有的软件部署任务(分配服务器的类型,如裸机、虚拟机或容器,服务器的资源内容)和这些服务器及其网络的配置。包含这种代码类型的软件也被称为资源管理器或部署管理器。换句话说,IaC 软件可以自动管理整个 IT 基础设施的生命周期(资源的配置和取消配置),并实现一个可编程的基础设施。将这种软件作为 CI/CD 管道的一部分进行整合,不仅可以实现敏捷的部署和维护,还可以实现安全和满足性能需求的强大应用平台。

4.3.1 对 IaC 的保护

当基础设施是 IaC 中的代码时,它可能包括有可能成为漏洞的 bug 和疏忽,因此,就像在应用程序代码中一样被利用。因此,保护 IaC 就是保护基础设施的定义和最终的部署环境。任何一段 IaC 在进入 GitOps 并被合并之前,都必须进行潜在漏洞的扫描。

此外,只有当有一个有条不紊的漂移管理过程时,才能获得安全应用平台的保证。只有当 IaC 中定义的架构是部署环境中实际存在的架构时,才能获得这种保证,因为这种等同性可能会被通过控制台或 CLI 进行的无意或有意的更改所改变,从而绕过 IaC。确保这种对等性必须在部署后立即进行,并在运行期间定期进行,因为对架构的任何改变都可能导致引入安全设计缺陷,并可能需要对 IaC 进行修改。

4.3.2 配置和基础设施之间的区别

基础设施经常与 配置 相混淆,后者将计算机系统、软件、依赖关系和设置维持在一个理想的、一致的状态。例如,将一台新购买的服务器放到机架上,并将其连接到交换机上,使其与现有网络相连(或启动一个新的虚拟机并为其分配网络接口),属于基础设施的定义。相反,在服务器启动后,安装 HTTPS 服务器并对其进行配置属于配置管理。