写了 30 万行基础设施代码后,我们得出 5 个有用的经验

写了 30 万行基础设施代码后,我们得出 5 个有用的经验

Yevgeniy Brikman


在 Gruntwork,我们创建并维护着一个包含 30 万行基础设施代码的库,有数百家公司在他们的生产环境中使用这个库。在这篇文章中,我将分享我们在开发和维护这个库的实践过程中学到的非常重要的五课。

处于石器时代的 DevOps

虽然这个行业充斥着各种前沿的流行语——Kubernetes、微服务、服务网格、不可变基础设施、大数据、数据湖,等等——但实际情况是,当你在构建基础设施并陷入困境时,它们看起来一点都不前沿。

对我来说,DevOps 感觉更像这样:

构建生产级的基础设施其实很难,压力很大,而且非常耗时。

根据我们在与数百家不同公司合作时收集的经验数据,你大致可以估计你的下一个基础设施项目需要多长时间:

第 1 课:生产级基础设施检查清单

DevOps 项目总是比预期的要长,为什么会这样?

第一个原因是 Yak Shaving(给牦牛撸毛),那么什么是 Yak Shaving?看看这个场景你就明白了:

经理:你不是在开发用户登录功能吗?为什么现在在捣鼓一个我们根本用不到的数据库?

工程师:是啊,我是打算开发用户登录功能。然后我开始评估要用哪个库,我发现一个非常好的库,但它只支持 Postgres。于是我试着搭建一个 Postgres,看看值不值得这样做。但切换数据库会破坏索引,所以我现在在学习如何建立 Postgres 索引……这样才能把用户登录功能做出来,对吧?

第二个原因是构建生产级的基础设施涉及了太多的细节。绝大多数开发人员并不知道这些细节,因此,当你在估算项目时,你通常会忘记关键和耗时的细节。

为避免这个问题,每次你开始使用新的基础设施时,请检查以下清单:

并非每个基础设施都需要检查清单中的每个项目,但你应该有意识地记录你已实现的项目、决定跳过的项目以及相应的原因。

第 2 课:工具集

截至 2018 年,以下是我们在 Gruntwork 中用于构建和管理基础设施的主要工具:

Terraform:我们使用 Terraform 来配置所有的基础设施,包括网络、负载均衡器、数据库、用户、权限以及我们所有的服务器。

Packer:我们使用 Packer 来定义和构建在服务器上运行的虚拟机镜像。

Docker:我们的一些服务器组成了集群,上面运行着托管应用程序作的 Docker 容器。我们使用的主要 Docker 集群工具是 Kubernetes、ECS 和 Fargate。

现在,所有这些工具都很有用,但这不是重点。重点是,光是有这些工具还不够,你还需要改变团队的行为。

特别是,如果你的团队不信赖这些工具,或者你的团队没有足够的时间学习使用这些工具,那么即使是世界上最好的工具都无法为你的团队带来任何帮助。因此,关键的一点是,基础设施即代码是一项投资:需要前期预付成本,但如果你明智地进行投资,将获得长期的巨大好处。

第 3 课:大模块是有害的

基础设施即代码新手通常在单个文件或作为一个单元进行部署的一组文件中定义所有环境(dev、stage、prod 等)的所有基础设施。这是一种糟糕的做法。

以下是这种做法的一些缺点:

速度慢:如果你的所有基础设施都在同一个地方定义,那么运行任何命令都需要很长时间。我们已经看到公司的 terraform plan 需要 5-6 分钟才能运行完毕!

不安全:如果你的所有基础设施都是一起管理的,那么在更改内容时都需要可以访问所有内容的权限。这意味着几乎每个用户都必须是管理员。

风险:如果所有鸡蛋都在一个篮子里,那么任意一个错误都可能会破坏整个系统。你可能正在对 dev 中的前端应用程序进行微小更改,但由于输入错误或运行了错误的命令,可能把生产数据库给删掉了。

难以理解:在一个地方拥有的代码越多,人们理解它们的难度就越大。如果将它们捆绑在一起,你不理解的部分可能会影响到你。

难以测试:测试基础设施代码很难,测试大量基础设施代码几乎是不可能的。

难以评审:诸如 terraform plan 之类的命令的输出变得毫无用处,因为没有人想要查看数千行输出。代码评审也变得毫无用处。

你应该使用小型、独立、可重用、可组合的模块来构建代码。这不是什么有争议的新观点。你之前可能已经听过无数次了:

“一次做一件事,并把它做好”——Unix 哲学。

“函数的第一条规则是它们应该很小。函数的第二个规则是它们应该比小更小。”——《整洁代码之道》

第 4 课:没有自动化测试的基础设施代码太脆弱

如果你的基础设施代码没有经过自动化测试就很容易出问题。你只是不知道一些暗藏的问题。也就是说,测试基础设施代码很难。你没有“localhost”(例如,你无法在笔记本电脑上部署 AWS VPC),也没有“单元测试”(例如,你无法将“Terraform”代码与“外部”隔离开来,因为 Terraform 所做的事情就是与外界交互)。

因此,要正确测试你的基础设施代码,通常需要将代码部署到真实环境,运行真实的基础设施,验证它们做它们该做的事情(对于这种测试方式,请参考 Terratest,一个开源库,包括用于测试 Terraform、Packer 和 Docker 代码的工具)。因此,对于基础设施测试,你必须重新定义一些术语:

单元测试是指部署和测试来自一种基础设施的一个或少量密切相关的模块(例如,测试单个数据库模块)。

集成测试是指部署和测试来自不同类型的基础设施的多个模块,以验证它们是否能够正常协同工作(例如,测试 Web 服务模块和数据库模块)。

端到端测试是指部署并测试整个架构。

这张图是一个金字塔,我们有很多单元测试、较少数量的集成测试和极少数的端到端测试。为什么?这是由每种类型的测试所需要的时间来决定的:

基础设施测试的周期时间很慢,特别是金字塔越往上就越慢,所以你会想尽可能多地在金字塔底层捕捉到错误。这意味着你应该:

构建小巧、简单的独立模块,并为它们编写大量单元测试。

将这些小型、简单、经过实战检验的构建块组合在一起,创建更复杂的基础设施,并进行少量的集成和端到端测试。

第 5 课:发布过程

现在让我们把这一切都放在一起。以下是你从现在开始应该采用的构建和管理基础设施的方法:

对照生产级基础设施检查清单,确保你正在构建正确的东西。

使用 Terraform、Packer 和 Docker 等工具将你的基础设施定义为代码。确保你的团队有时间掌握这些工具。

使用小型、独立、可组合的模块构建代码(或使用基础设施中的现成模块作为代码库)。

使用 Terratest 为你的模块编写自动化测试。

提交拉取请求,让别人来评审你的代码。

发布新版本代码。

将你的代码从一个环境推到另一个环境。

英文原文:https://blog.gruntwork.io/5-lessons-learned-from-writing-over-300-000-lines-of-infrastructure-code-36ba7fadeac1

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • Docker — 云时代的程序分发方式 要说最近一年云计算业界有什么大事件?Google Compute Engi...
    ahohoho阅读 15,505评论 15 147
  • Docker工具分类列表 编排和调度 持续集成/持续部署(CI / CD) 监控 记录 安全 存储/卷管理 联网 ...
    Anoyi阅读 3,719评论 1 44
  • Docker工具分类列表 编排和调度 持续集成/持续部署(CI / CD) 监控 记录 安全 存储/卷管理 联网 ...
    guanguans阅读 698评论 0 17
  • 容器生态系统正以前所未有的速度不断增长和扩大,并且拥有这么多的Docker工具和服务,仅仅了解这些工具有用的选项,...
    运维前线阅读 888评论 0 5
  • 上周工作总结:1.网站改版的原型图完成一半;2.微期权还没有想好怎么改版;3.设计心里学也没有看完。 (一)当一个...
    小苤阅读 322评论 0 0