基础设施即代码:初学者的视角
地形
结论
资源
最初发表于WyeWorks 博客。
几个月前,我意识到自己可能真的喜欢 DevOps。我当时不确定该怎么做,于是就和 WyeWorks 的工程副总裁聊了聊。聊完之后,我们找到了一个机会,让我在 DevOps 岗位上工作几个月,尝试一下。
我辞去了当时正在做的项目,并获得了一个月的时间来学习一些基础知识,以便能够在 DevOps 工作中有所作为。我的确这么做了。从今年 1 月 2 日开始,我每周 5 天、每天 7 个小时都在阅读和实践 DevOps 相关知识。
在本文中,我将讨论我对 IAC(基础设施即代码)的看法,它解决了哪些问题以及如何实现它。我还会分享一些进一步学习的资源,并简要介绍一款 IAC 工具 Terraform。
基础设施即代码是什么意思?
顾名思义,IAC 指的是编写描述基础设施的代码,类似于用高级语言编写程序。它允许您使用经过验证的工具来自动化配置基础设施的过程。
它对你有什么帮助?
IAC 允许您自动化、测试和重用与您正在使用的基础设施相关的代码。您还可以选择对基础设施代码进行版本控制,并将其与将要管理的代码一起进行检查。您还可以审查和测试代码,并且通常遵循您在代码库中通常会遵循的所有良好实践。
您可能会想: 好吧,这听起来很棒,但是您能给我一个具体的用例吗?
我可以给你两个。😁
案例 1 - 简单的 Web app_1、app_2、app_3、...、app_n
假设你在一家为客户构建基础 Web 应用的公司工作。那么,一个基础的 Web 应用需要什么呢?一台 Web 服务器和一个数据库(我这样说有点简化)应该会很方便。每次你的 Web 应用获得一个新客户时,你都会访问 AWS(或你使用的任何云提供商),在浏览一些资源后,你会得到两个虚拟机:一个用于运行你的应用,另一个用于运行相关的数据库。
哦,等等,我忘了,您至少需要这个基础设施的两个副本:一个用于生产,一个用于登台。
现在您拥有相同基础架构的两个副本,您可以开始为该客户端部署代码。
两个月过去了,您又有另一个客户需要相同的基础设施,因此您再次在 AWS 中点击以启动并运行它。
相反,使用 IAC,您可以拥有一个模块来为您完成所有繁重的工作。到时候,您只需运行这段代码,几分钟后就可以开始使用了。需要一次性更新所有客户端基础设施吗?没问题,只需更新模块,运行它,一切就绪!
如果您已经在 AWS 上手动执行过此操作,那么您可能已经看到了 IAC 的优势。但如果您还不相信,请阅读下一个用例。
案例 2 - 复杂的应用程序让人抓狂
你想出了一个很棒的点子——一个非常酷的 Web 应用——一开始很简单,但现在你有很多客户依赖于这个应用。在这种情况下,一台 Web 服务器和一个数据库显然不够用。
首先添加一个负载均衡器和另一台 Web 服务器,并记录整个过程。一段时间后,您需要添加另一台服务器,然后按照文档中的流程操作即可完成。
接下来的一个月,您意识到仅运行一个数据库服务器是不够的,因此您添加了一个副本。
然后,你需要将部分工作负载从主服务器上移出,这意味着你需要一个消息队列和一个运行工作进程的服务器。你手动完成了所有操作,却忘记更新文档了。
几个月过去了,你终于需要添加更多队列和工作器了,但由于上次忘记更新文档,所以用之前的方法做起来就没那么容易了。虽然完成了,也运行正常,但现在队列和工作器的配置略有不同。这被称为配置漂移。
稍后,您决定为应用添加一些缓存级别,由于需要使用 Redis/Memcached,因此需要为这些服务添加更多服务器。您还需要为静态文件配置 S3,为全球静态文件配置 CDN,并为 DNS 配置 Route53。
此时,公司已经发展壮大,是时候为新开发人员创建 IAM 角色和用户,然后赋予他们正确的访问权限。
你还希望提高可靠性,所以你考虑在不同的数据中心分配更多服务器。最后,你疯了,关掉了公司。
诚然,最后这个例子的结论有点灾难性,但想象一下,手动维护这么多的服务器会是什么样的体验。这显然无法很好地扩展。
您应该利用 IAC 吗?
正如科技领域的一切一样,这个问题的答案是视情况而定。我个人无法想象哪个项目不能通过使用 IAC 而变得更好。在我看来,如果你有机会运用它,你应该尝试一下,亲自体验一下!
如果您已经在使用类似 Heroku 的工具来开发非常简单的应用程序,那么实现 IAC 可能会产生过多的开销。但是,如果您的 Heroku 项目规模超过一定规模,您或许也能从这类工具中受益。例如,您可以参考Terraform: Heroku Provider 。
地形
Terraform 是 Hashicorp 推出的一款 IAC 工具,可以解决上述案例中出现的问题以及更多其他问题。正如他们在网站上所说,
Terraform 使您能够安全且可预测地创建、更改和改进基础架构。它是一个开源工具,可将 API 编码为声明式配置文件,这些文件可在团队成员之间共享、视为代码、进行编辑、审阅和版本控制。
例如,您有一个连接了 5 个虚拟机的负载均衡器。运行以下简单代码,即可每次都返回到相同的状态。
resource "aws_elb" "frontend" {
name = "frontend-load-balancer"
listener {
instance_port = 8000
instance_protocol = "http"
lb_port = 80
lb_protocol = "http"
}
instances = ["${aws_instance.app.*.id}"]
}
resource "aws_instance" "app" {
count = 5
ami = "ami-408c7f28"
instance_type = "t1.micro"
}
太棒了!想象一下,如果要手动操作,你得点击多少次。肯定不少!
利用类似的代码,我仅用一周时间就重现了之前提出的第二个案例,这真是太神奇了!我敢肯定,如果手动操作,我至少要花两倍的时间。
结论
您的基础设施与其运行的代码一样重要,因此我建议您以应有的方式对待它;您应该完成审查、版本控制、测试等。
即使你纪律严明、记录所有细节,手动管理基础设施也并非易事。毕竟,你只是凡人——总有一天你可能会忘记一些事情,到那时你就会后悔没有使用 IAC 工具。
您可以先使用 IAC 工具管理应用程序中的一些简单内容,然后逐步迁移其他内容。
如果您有机会使用 Terraform 或任何其他 IAC 工具,请将其视为改进基础架构管理方式的绝佳方法。它能让您快速成就伟业!
如果您有任何问题或意见,请在下面发表!