越来越多的企业将主要应用或服务托管在云平台上,也使得基础架构即代码(IaC)变得越来越流行。
为什么需要基础架构作为代码?
在传统基础设施上,当你需要一台服务器资源,则需要运维团队去创建一个虚拟机实例或为应用准备物理服务器,配置中需要使用到脚本或手动安装的方式。
当有了更多应用需求,则需要更多的虚拟机,用于DNS,邮件服务器,数据库等等。还有要对操作系统,Web服务器,JVM和其他所有相关架构进行持续的更新。而且随着时间的发展,它们彼此之间的配置会发生变化,带来配置的漂移,从而产生了雪花服务器(snowflake servers)。跟踪配置更改是很大的挑战。
如果服务器很少且使用周期较长,那么还可以接受。
随着AWS等公有云服务的广泛使用,企业对计算资源的选择发生了很大变化。许多企业没有了在硬件和数据中心上的投资,而是开始将其应用程序迁移到云中。在云端,可以在数分钟内部署服务器。
为了保持最佳性能和可用性,可能必须部署更多实例来满足需求。然后,不需要时对资源弹性释放来节省成本。当按小时付费时,可能需要每天按比例弹性的缩放,所以如果每天多次手动进行操作,显然具有挑战性。
通过自动化的方式,获取代码中部署或终止实例,以及其他基础结构组件所需的配置步骤,云可以帮助更快,更可靠地交付价值。
什么是基础架构即代码?
所以,基础设施即代码是使用软件开发原则和实践的基础设施自动化。
简单理解,就是基础架构像软件一样来对待,然后编写,测试和执行代码以定义,部署,更新和释放基础架构。通过编写代码来管理服务器,数据库,网络,日志,应用程序的部署和配置。当要更改基础结构时,可以更改代码,对其进行测试,然后将其应用于系统中。
基础架构即代码与手动配置相比,优势显而易见:
1. 自助服务
由于将基础架构定义为代码,因此整个过程和部署可以自动化,并且可以由DevOps团队中的任何人启动,有基础架构需求的用户可以在需要时获得所需的资源。
2. 幂等性
幂等性意味着你定义了所需的状态,并且无论运行脚本多少次,结果都是相同的。它检查当前状态和所需状态,并仅应用所需的更改。而使用bash脚本很难做到这一点。
Ansible和Terraform之类的工具具有内置功能,可以使代码具有幂等性。
3. 降低成本
与手动配置相比,降低了配置所需的时间和精力。
4. 更快的软件交付
快速为开发,测试和生产配置基础架构,使企业能够更快地交付软件。由于部署过程是自动化的,因此它也是一致且可重复的。
5. 自我记录
基础结构的状态由任何人都易于阅读的代码来定义。
6. 版本控制
传统上,更改生产系统被认为是有风险的,但往往改变不可避免。但添加新功能时,可能需要添加新数据库,可能需要向集群添加新服务器或存储。基础架构即代码减少了对基础架构进行更改的工作量和风险。
可以在版本控制中载入源文件,这意味着你可以跟踪对基础结构所做的所有更改,并在出现问题时快速恢复到以前的版本。
7. 验证与测试
基础架构即代码可以连续测试和应用小的更改。一切都是代码,因此可以使用静态分析和自动化测试来检查错误。
8. 提升安全性
向基础架构即代码的转变能够从一开始就嵌入安全性,然后就可以可靠,安全地应用更改。
基础架构即代码的工具
尽管有许多工具可用,但选择一种工具可能并不容易。以下是一些注意事项,可能对大家帮助。基础架构即代码的工具大致上可分为两类:配置管理工具和配置工具。
配置管理工具是用户管理在现有服务器上安装和管理的工具。比如,Chef,Puppet,Ansible和SaltStack都是主要的配置管理工具。可以使用配置管理工具在服务器上安装和更新软件。
Terraform,CloudFormation,OpenStack Heat是配置工具,即用于创建服务器,数据库服务器,负载均衡,队列,子网,防火墙以及基础架构的所有其他组件。这些工具对提供程序进行API调用以创建所需的基础结构。
1. 可变与不可变基础架构
可变基础架构是一种在配置后即可修改的基础架构。Chef,Ansible,Puppet和SaltStack能够在现有服务器上安装或更新软件。在服务器的生命周期中,这可能会发生很多次。经过多次更新后,每台服务器可能与其他服务器略有不同,从而导致配置漂移。例如,某些在测试服务器上正常运行的更改,可能无法在生产服务器上运行。
Terraform和CloudFormation之类的工具能够每次通过计算机镜像或容器镜像创建新服务器。如果需要更新服务器,就用用新服务器替换它们。新服务器启动后,可以终止旧服务器。每个部署都使用不可变的镜像来创建服务器,因此避免了配置漂移。不过,效率可能有点慢。
2. 命令式与声明式工具
命令式工具类似于脚本,列出了达到所需状态所要采取的步骤。声明性工具可以指定结束状态,并且工具将制定实现该状态的步骤。
Chef是主要的命令式工具,而Ansible使用混合方法并支持命令式和声明式技术。
Terraform,CloudFormation,Puppet,OpenStack Heat和SaltStack都属于声明性工具类别,可以在其中声明所需的最终状态。
3. 使用多种工具
尽管这些工具中的每一个都可以单独使用,但是一种通用的方法是将它们一起使用。例如,可以使用Terraform来构建VPC,子网,网关,负载均衡和虚拟机,然后使用Ansible在这些实例上配置和部署服务。