观看完本文后,你将能够定义基础设施即代码,描述临时性基础设施,并阐述通过容器实现的不可变交付。
基础设施即代码是指以文本格式描述基础设施的实践。这里我说的可不是文档,而是一种可执行的文本格式,也就是代码。你可以使用一种文本描述来配置基础设施,然后交给工具去执行。
实现这一过程的工具被称为配置管理系统,比如 Ansible、Puppet 和 Chef 这类工具,它们能让你将基础设施描述为代码,然后创建该基础设施并使其保持在相应状态。
永远不要手动对软件配置进行系统更改,这种方式不可重现且极易出错。你应该使用模板和脚本来描述如何安装并自动配置系统、设备、软件和用户等元素。
然后,你可以将这些文本代码存储在版本控制系统中,这样就能记录所有的更改历史。如此一来,每个人都知道哪个版本是最新版本,以及基础设施应该是什么样的。
像 Docker、Vagrant、Terraform,甚至 Kubernetes 这样的技术,也能让你将基础设施描述为代码,而且这些代码应该提交到版本控制中。
这一点之所以如此重要,是因为服务器配置漂移是导致故障的一个主要原因。随着时间的推移,服务器会因各种原因进行更新,而且进行更新的人也并不总是同一批。这就导致它们偏离了最初的配置。有时,这些更改的累积会以不可预测的方式引发故障。更糟糕的是,有些服务器本应是相同的,但其中一台却因某个地方的配置错误而不断出现故障。
“服务器是牲畜,不是宠物” 这句话说的是对待服务器的方式。假设你有一千头牛,你不会花时间给每头牛都取个名字。当有一头牛生病时,你会让它不再痛苦,并用另一头牛来替换它。而宠物呢?当它们生病时,你会悉心照料并护理它们恢复健康。
这里传达的理念是,不要精心打造服务器,当服务器出问题时也不要花太多时间去调试。你应该能够用一台正常工作的相同服务器来替换它。这意味着你必须把基础设施视为临时性或短暂存在的东西。它只在你需要的时候存在,当不再使用时就将其移除。
例如,过去搭建测试环境需要数周时间。所以,你会让它们持续运行数月,因为搭建需要花费数周时间。但是,当你采用基础设施即代码的方式时,部署一组新的测试服务器只需几分钟。你可以启动一个测试环境,使用一段时间后再将其销毁。如果改天你还需要,就再创建一个新的。你不用让它一直运行着,只在需要的时候启动,不再需要的时候关闭,它是短暂存在的。
这也让我们能够通过并行基础设施进行发布。例如,我可以搭建一台与生产环境中一模一样的服务器。我可以部署应用程序的新版本并进行监测,看它是否能正常工作。如果看起来运行正常,我就关闭生产环境中的服务器,将新服务器设为生产服务器。通过并行基础设施,我可以让服务持续运行。
基础设施即代码让我每次都能创建相同的基础设施。临时性基础设施可以使用后丢弃,因为服务器是通过自动化、利用基础设施即代码技术按需构建的。
像 Docker 这样的工具,有助于我们实现不可变交付。Docker 是一种打包技术,它能让我们在一个名为容器的隔离环境中,以一致的方式启动和关闭应用程序。Docker 支持基础设施即代码,它允许你通过一个名为 Dockerfile 的代码指定如何构建镜像。这些 Dockerfile 每次都以相同的方式构建相同的镜像。然后,Docker 每次部署时都会以相同的方式从该镜像创建容器。这意味着在生产环境中运行的容器,也能在开发人员的笔记本电脑上运行,实现了开发环境与生产环境的完美一致。这是因为运行应用程序所需的所有依赖项都被打包在容器内部,这就限制了任何差异或可能的副作用。除了像 Docker 这样的容器运行时环境,运行容器不再需要其他东西。
像 Docker 这样的工具还能让你进行滚动更新并立即回滚。你不用先安装应用程序看它是否能正常工作,不行的话再卸载。你只需启动一个包含新版本应用程序的 Docker 容器,如果它开始出现问题,你就停止并关闭它,然后启动之前已安装在其自身容器中的旧版本。这真的只需要几秒钟。
对于开始出现问题的容器,你也可以用同样的方式处理。删除该容器,再创建一个新容器来替代它。新容器在启动第一天会和旧容器完全一样。如果存在某种损坏,很明显这种损坏会使整个系统恢复到初始状态。这是一种截然不同的工作方式。你永远不要像对待正在运行的服务器那样对正在运行的容器进行更改。记住:“服务器是牲畜,不是宠物”。你不要为修复漏洞而给容器打补丁或以任何方式修改它们。要进行任何更改,你需要对创建容器的镜像进行更改,然后重新部署新容器来替换旧容器。原因很简单:如果你给一个容器打了补丁但它崩溃了,新启动的容器将不会有这些补丁。这就是为什么必须修改镜像,镜像是创建容器的模板,必须保持镜像为最新状态,而不是正在运行的容器。
在本文中,你了解到基础设施即代码是以可执行的文本格式描述基础设施;临时性基础设施可以使用后丢弃,服务器是通过自动化按需构建的;不可变交付不是对正在运行的容器进行打补丁,而是对容器镜像进行更改,然后重新部署新容器。
基础设施即代码
最新推荐文章于 2025-07-23 22:07:58 发布