联网图片

取消弹出的图像

我曾在启动在过去的4年里快速扩展。从一开始,我就做出了一些核心决策这家公司在过去四年里,无论好坏,都必须坚持下去。这个帖子将列出一些做出的重大决定,如果我支持你的决定或者如果我对他们感到遗憾并建议你选择其他东西。

美国焊接学会 链接到标题

在Google Cloud上选择AWS 链接到标题

🟩背书

早期,我们同时使用GCP和AWS。在那期间,我不知道我在谷歌云的“客户经理”是谁,同时有一次,我与我们的AWS客户经理定期举行了节奏会议。有一种感觉谷歌以机器人和自动化为生,而亚马逊则以客户为中心。这种支持帮助我们评估新的AWS服务。除了支持,AWS在稳定性方面做得很好和最小化向后不兼容的API更改。

曾经有一段时间,谷歌云是Kubernetes集群的选择,尤其是当AWS是否会投资EKSECS服务器不过现在围绕AWS服务的所有额外Kubernetes集成(external-dns、external-secrets等),这不再是什么问题了。

EKS公司 链接到标题

🟩背书

除非你很吝啬(而且你的时间是空闲的),否则没有理由自己经营控制平面而不是使用EKS。在AWS中使用替代方案(如ECS)的主要优点是,是与AWS服务的深度集成。幸运的是,Kubernetes在很多方面都迎头赶上了:例如,使用external-dns与Route53集成。

EKS公司托管加载项 链接到标题

🟧后悔

我们从EKS管理插件开始,因为我认为这是使用EKS的“正确”方式。不幸的是,我们总是遇到了需要自定义安装本身的情况。可能是CPU请求,图像标签,或者一些配置图。此后,我们转而使用掌舵图来显示附加功能,情况变得更好了与我们现有的GitOps管道类似的促销活动。

无线电数据系统 链接到标题

🟩背书

数据是基础架构中最关键的部分。你失去了网络:这是停机时间。丢失数据:这是一个公司的终结事件。使用RDS(或任何托管数据库)的标记成本值得。

Redis ElastiCache 链接到标题

🟩背书

Redis作为缓存和通用产品运行良好。它速度快,API简单有很好的文档记录,并且实现经过了战斗测试。与其他缓存选项不同,如Memcached,Redis有很多功能,使其不仅仅用于缓存。这是一个“做快速数据”的伟大瑞士军刀。

我部分不确定Redis对于云提供商的状态,但我觉得它被AWS客户广泛使用AWS将继续支持它。

ECR公司 链接到标题

🟩背书

我们最初主办于码头这是一个棘手的稳定问题。由于移动到ECR,情况稳定得多。与EKS节点或开发服务器的深层权限集成大利好。

AWS VPN 链接到标题

🟩背书

CloudFlare等公司提供了零信任VPN替代方案。我相信这些产品能用嗯,但是VPN的设置和理解都非常简单(“简单是最好的”是我的口头禅)。我们使用Okta来管理我们的VPN访问,这是一次很棒的经历。

美国焊接学会高级支持 链接到标题

🟧遗憾

这太贵了:几乎(如果不是更多的话)比另一个工程师的费用还要贵。我想如果我们只有很少AWS的内部知识,这是值得的。

地形控制塔客户工厂 链接到标题

🟩背书

在集成AFT之前,使用控制塔是一件痛苦的事,因为它很难实现自动化。我们从那以后从那时起,将AFT集成到我们的堆栈和旋转帐户中,效果很好。AFT让另一件事变得更容易标准化我们的账户标签。例如,我们的生产账户有一个标签,我们可以使用它来制作同行决策。标签对我们来说比组织工作得更好,因为“属性描述什么”的决定这个帐户“并不总是树形结构。

过程 链接到标题

使用空闲机器人程序自动化事后分析过程 链接到标题

🟩背书

每个人都很忙。感觉就像你是一个“坏人”,提醒人们填写验尸表。制作机器人因为那个坏蛋很好。它通过鼓励人们遵循SEV和验尸程序来简化流程。

一开始并不需要太复杂。仅仅是“已经一个小时没有消息了。有人发布更新”或“这是一个没有日历邀请的日子。有人安排事后会议”可能会有很大帮助。

使用寻呼机值班事件模板 链接到标题

🟩背书

为什么要重新发明轮子?PagerDuty发布了一个事件发生时要做什么的模板。我们对它进行了一些定制,这就是Notion的灵活性发挥作用的地方,但它是一个很好的起点。

定期检查寻呼机值班票 链接到标题

🟩背书

向公司发出警报是这样的:

  1. 根本没有警报。我们需要警报。
  2. 我们有警报。警报太多,所以我们忽略了它们。
  3. 我们已对警报进行了优先级排序。现在,只有关键的问题才能唤醒我。
  4. 我们忽略非关键警报。

我们有两层警报设置:关键和非关键。严重警报会唤醒人们。非关键警报希望ping调用异步(电子邮件)。问题是非关键警报经常被忽略。要解决我们定期(通常每两周)召开PagerDuty审查会议,审查所有警报。对于关键警报,我们讨论它是否应该保持关键。然后,我们重复非关键警报(通常在每次会议中选择几个)并讨论我们可以做些什么来消除这些问题(通常调整阈值或创建一些自动化)。

每月成本跟踪会议 链接到标题

🟩背书

早些时候,我设立了一个月度会议,讨论我们所有的SaaS成本(AWS、DataDog等)。以前,这只是从财务角度来看,他们很难回答关于“这是否需要成本”的一般性问题数字似乎正确”。在这些通常由财务和工程人员参加的会议中,我们审查了每个软件我们收到了相关的账单,并对“这个成本合理吗?”。我们深入研究每一笔高额账单的数量试着把它们分解。

例如,使用AWS,我们按标记对项目进行分组,并按帐户将其分隔开。这两个维度与一般服务名称(EC2、RDS等)让我们很好地了解了主要的成本驱动因素。我们用这些数据做的一些事情深入了解spot实例的使用情况,或者哪些帐户对网络成本的贡献最大。但不要停留在仅AWS:调查公司所有的主要支出汇。

管理数据狗或寻呼机职责中的验尸 链接到标题

🟥后悔

每个人都应该做事后检查。两者都有数据狗和PagerDuty有集成来管理验尸后的写作,我们尝试过每个。不幸的是,这两种方法都很难定制事后分析过程。考虑到wiki-ish工具的强大功能像Notion一样,我认为最好使用这样的工具来管理事后分析。

不再使用功能即服务(FaaS) 链接到标题

🟥后悔

对于运行GPU工作负载,没有很好的FaaS选项,这就是为什么我们永远无法完全使用FaaS的原因。然而,许多CPU工作负载可以是FaaS(λ等)。人们提出的最大反面观点是成本。他们会的比如说“这个EC2实例类型全天候运行比Lambda运行便宜得多”。这是真的,但这也是一个错误的比较。没有人以100%的CPU利用率运行服务继续他们的生活。它总是出现在一些定标器上,上面写着“永远不要达到100%。在70%时,再放大一个”。而且总是不清楚何时缩减规模,相反,这是一种“如果我们已经在10%的水平上坚持了10分钟,就缩减规模”的启发式方法。然后,当人们不总是在市场上时,他们会假设现场实例。

Lambda的另一个潜在好处是,它很容易以高精度跟踪成本。部署服务时在Kubernetes中,成本可能隐藏在其他每节点对象或在同一节点上运行的其他服务后面。

GitOps(GitOp) 链接到标题

🟩背书

到目前为止,GitOps扩展得相当好,我们将其用于基础设施的许多部分:服务、,地形和配置等等。主要缺点是面向管道的工作流清楚地显示“这是表示您进行了提交的方框,这是从将盒子放在管道的末端”。有了GitOps,我们必须投资工具来帮助人们回答问题像“我做了一个提交:为什么还没有部署”这样的问题。

尽管如此,GitOps的灵活性还是取得了巨大的成功,我强烈建议贵公司使用它。

将团队效率置于外部需求之上 链接到标题

🟩背书

很可能,您的公司不是在销售基础设施本身,而是在销售另一种产品。这给团队交付功能,而不是扩展您自己的工作量。但就像飞机告诉你戴上自己的口罩一样首先,你需要确保你的团队是高效的。除了极少数的例外,我从未后悔把事情轻重缓急花时间编写一些自动化或文档。

多个应用程序共享一个数据库 链接到标题

🟥后悔

像大多数科技债务一样,我们没有制作这个决定,我们只是没有做出这个决定。最终,有人希望产品做一件新事情,并制作一个新表。这感觉很好,因为现在之间有外键这两张桌子。但是自从一切属于某人还有那个某人是桌子上的一排,你有整个堆栈中所有对象之间的外键。

由于数据库由使用每个人,它由没有人初创公司没有DBA的特权,拥有的一切没有人属于基础设施最终。

共享数据库的最大问题是:

  • 积垢积累在数据库中,不清楚是否可以删除。
  • 当出现性能问题时,基础架构(没有深入的产品知识)必须调试数据库并确定重定向到谁
  • 数据库用户可以将做坏事的坏代码推送到数据库。这些坏事情可能会引起PagerDuty的警觉基础设施团队(因为他们拥有数据库)。为另一支球队的问题叫醒一支球队感觉很糟糕。对于应用程序拥有的数据库,申请团队是第一响应者。

尽管如此,我也不反对希望共享单个数据库的堆栈。请注意上面的权衡并为你如何管理他们提供一个好故事。

软件即服务 链接到标题

早期未采用身份平台 链接到标题

🟥后悔

一开始我坚持使用谷歌工作区,用它为员工创建组,作为分配权限的一种方式。它只是不够灵活。回想起来,我真希望我们能奥克塔更快。它工作得很好,几乎所有方面都有集成,并解决了许多法规遵从性/安全方面的问题。尽早采用身份解决方案,只接受SaaS与之集成的供应商。

概念 链接到标题

🟩背书

每个公司都需要一个放置文档的地方。Notion是一个很好的选择,而且工作起来比实际情况容易得多我过去使用过(维基、谷歌文档、Confluence等)。他们的页面组织数据库概念还包括允许我创建相当复杂的页面组织。

松弛(Slack) 链接到标题

🟩背书

谢天谢地,我不必再使用HipChat了。松懈是一种很好的默认沟通工具,但可以减少压力和噪音我建议:

  • 使用线程压缩通信
  • 传达人们可能不会快速回复信息的期望
  • 不鼓励私人信息,鼓励公共渠道。

离开JIRA公司到上面线性的 链接到标题

🟩背书

甚至没有接近。JIRA太臃肿了,我担心在一家AI公司中运行它会让它变得非常敏感。什么时候?我在使用线性,我经常会想“我想知道我是否能做X”,然后我会尝试,我能!

不使用地形云 链接到标题

🟩巾帼枭雄之义海豪情

早些时候,我试图将我们的地形迁移到地形云。最大的缺点是我无法证明成本。我后来把我们搬到了亚特兰蒂斯,而且它已经足够好了。亚特兰蒂斯在哪里不足之处在于,我们在CI/CD管道中编写了一些自动化程序来弥补这一不足。

GitHub操作用于CI/CD 链接到标题

🟧背书-ish

与大多数公司一样,我们在GitHub上托管代码。在最初使用CircleCI时,我们切换了CI/CD的Github操作。可用于工作流的操作市场是大且语法易于阅读。Github操作的主要缺点是它们的支持对于自托管工作流来说是非常有限的。我们正在使用EKS和操作-运行控制器为我们的自我托管跑步者托管在EKS中,但集成通常有缺陷(但没有我们无法解决的问题)。我希望GitHub在未来更加重视Kuberentes的自托管。

数据加密狗 链接到标题

🟥后悔

Datadog是一个很棒的产品,但它很昂贵。我担心的不仅仅是昂贵他们的成本模型对Kubernetes集群和AI公司来说尤其糟糕。库伯内特斯当您可以快速上下旋转许多节点时,集群最具成本效益作为使用点实例。Datadog的定价模型基于您的实例数量有,这意味着即使我们一次启动的实例不超过10个,如果我们启动在那一小时内,我们减少了20个实例,然后支付20个实例的费用。同样,AI公司倾向于大量使用GPU。虽然一个CPU节点可以同时运行数十个服务,在多个用例之间分摊每个节点的Datadog成本,GPU节点可能会只有一个服务使用它,使每个服务Datadog的成本要高得多。

佩格杜伊 链接到标题

🟩背书

Pagerduty是一款很棒的产品,价格也很合理。我们从不后悔选择它。

软件 链接到标题

按差异进行架构迁移 链接到标题

🟧背书-ish

无论你怎么做,模式管理都很难,主要是因为它有多可怕模式迁移可以删除数据。在所有解决这个难题的可怕方法中,我对这个想法很满意将整个模式签入git,然后使用工具生成将数据库同步到架构的SQL。

用于开发服务器的Ubuntu 链接到标题

🟩背书

最初,我尝试将开发服务器设置为与Kubernetes节点运行时相同的基本操作系统,我认为这将使开发环境更接近生产。回想起来,这种努力是不值得的。我很高兴我们坚持下去使用Ubuntu开发服务器。它是一个支持良好的操作系统,拥有我们需要的大多数软件包。

AppSmith公司 链接到标题

🟩背书

我们经常需要为内部工程师自动化一些流程:重启/升级/诊断等。这很容易让我们制作API来解决这些问题,但调试某个特定安装的CLI/os/dependencies/etc.能够为工程师制作一个简单的UI来与我们的脚本交互是非常有用的。

我们自行托管AppSmith。它工作得很好。当然,有些事情我们会改变,但这已经足够了“免费”价格。我最初探索了与修整,但我无法证明价格的合理性这一点在当时只是一些集成。

链接到标题

🟩背书

Helm v2名声不佳(这是有充分理由的),但Helm v3已经运行得很好了。还有一些问题通过部署CRD和教育开发人员为什么他们的掌舵图没有正确部署。然而,总的来说,helm作为打包和部署版本化Kubernetes对象和Go模板语言的一种方式,工作得很好很难调试,但功能强大。

ECR中的舵图(oci) 链接到标题

🟩背书

最初,我们的舵图托管在S3中,并通过插件下载。主要缺点是需要安装自定义helm插件并手动管理生命周期。我们已经切换到OCI存储的掌舵图,但还没有此设置有任何问题。

巴泽尔 链接到标题

🟧不确定

公平地说,很多聪明人喜欢bazel,所以我肯定这不是坏的要做出的选择。

在部署Go服务时,bazel个人觉得太夸张了。我认为Bazel是一个很好的选择,如果你的上一家公司用过bazel,你会觉得想家。否则,我们的构建系统只有少数工程师能够深入研究,与GitHub Actions相比,似乎每个人都知道如何弄脏自己的手。

未使用open遥测早期的 链接到标题

🟥遗憾

我们开始使用DataDog的API直接向DataDog发送度量。这使得很难把它们撕下来。

开放式遥测技术在4年前还不成熟,但现在已经好多了。我认为计量遥测仍在进行有点不成熟,但追踪效果很好。我建议任何公司从一开始就使用它。

拣选翻新机器人结束依赖者 链接到标题

🟩背书

我真希望我们早点考虑“让你的依赖关系保持最新”。当你等待太久时,您最终得到的版本太旧了,升级过程很长,不可避免地会出现错误。Renovatebot与根据您的需要定制它的灵活性。最大的缺点是它非常复杂设置和调试。我想这是所有坏选择中最好的。

库伯内特斯 链接到标题

🟩背书

你需要某物托管长期运行的服务。库贝伦特斯是一个受欢迎的选择,对我们来说效果很好。Kubernetes社区在将AWS服务(如负载平衡器、DNS等)集成到Kubernetes生态系统。任何灵活系统的最大缺点是有很多使用方法,而且任何有很多使用方法的系统都有很多使用错误的方法。

任何有很多使用方法的系统都有很多使用错误的方法

  • 杰克·林达莫德

购买我们自己的IP 链接到标题

🟩背书

如果您与外部合作伙伴合作,您将经常需要为他们发布您的IP白名单。不幸的是,您可以稍后开发更多需要自己IP的系统。购买自己的IP块是避免这种情况的好方法给外部合作伙伴一个更大的CIDR块以加入白名单。

拣选通量用于k8s GitOps 链接到标题

🟩巾帼枭雄之义海豪情

Kubernetes早期的GitOps选择是在ArgoCD和Flux之间做出决定:我选择了Flux(v1当时)。它工作得很好。我们目前正在使用Flux 2。唯一的缺点是我们不得不自己的工具来帮助人们了解他们的部署状态。

我听说了关于ArgoCD的好消息,所以我确信如果你选择了它,你也很安全。

卡彭特用于节点管理 链接到标题

🟩背书

如果你正在使用EKS(而不是完全在Fargate上),你应该使用Karpenter。100%完全停止。我们使用了其他自动标尺,包括默认的Kubernetes autoscaler和SpotInst公司在他们中间,卡彭特是最可靠、最具成本效益的。

使用密封的秘密管理k8s机密 链接到标题

🟥遗憾

我最初的想法是将秘密管理推向GitOps风格的东西。使用的两个主要缺点密封的秘密是:

  • 对于知识不足的开发人员来说,创建/更新秘密更为复杂
  • 我们失去了AWS在旋转秘密方面的所有现有自动化设备(例如)

使用外部机密管理k8s机密 链接到标题

🟩背书

ExternalSecrets很好地同步了AWS->Kubernetes机密。该过程对于开发人员来说很简单理解并让我们利用地形,轻松创建/更新AWS内部的秘密为用户提供用于创建/更新机密的UI。

使用外部DNS管理DNS 链接到标题

🟩背书

ExternalDNS是一个很棒的产品。它同步我们的Kubernetes->Route53 DNS条目,给我们的信息很少过去4年的问题。

使用证书管理员管理SSL证书 链接到标题

🟩背书

配置非常直观,运行良好,没有问题。强烈建议使用它来创建Let's EncryptKubernetes的证书。唯一的缺点是我们有时会遇到ANCIENT(SaaS问题,对吗?)技术堆栈不信任Let’s Encrypt的客户,您需要为此获得付费证书。

瓶装火箭用于EKS 链接到标题

🟥后悔

我们的EKS集群过去是靠Bottlerocket运行的。主要缺点是我们经常遇到网络CSI问题与调试标准EKS AMI相比,调试瓶装火箭图像要困难得多。使用EKS优化我们的节点的AMI没有给我们带来任何问题,而且当出现以下情况时,我们仍然有一个后门来调试节点本身奇怪的网络问题。

拣选地形结束云层形成 链接到标题

🟩背书

任何公司都必须将基础设施用作代码。在AWS中,两人主要选择是云层和地形。我都用过了,但没有后悔坚持使用Terraform。很容易扩展到其他SaaS提供商(像Pagerduty一样),语法比CloudFormation更容易阅读,而且还没有对我们来说是阻碍或减速。

不使用更多的代码化IaC解决方案(普卢米,CDK公司等) 链接到标题

🟩巾帼枭雄之义海豪情

而Terraform和CloudFormation是描述您的基础设施、解决方案(如Pulumi或CDK)允许您编写做同样的事。代码当然很强大,但我发现Terraform的HCL具有降低复杂性的优点。不是这样的不可能写出复杂的地形:只是当它正在发生。

其中一些解决方案,如普卢米,是多年前发明的地形缺乏今天的许多特征。Terraform的新版本已经集成了许多可以用来降低复杂性的功能。相反,我们使用一个中间地带,为我们想要抽象的部分生成Terraform代码的基本框架。

不使用网络网格(国际标准化组织/链接器/等) 链接到标题

🟩不后悔

网络网眼真的很酷,许多聪明人倾向于支持它们,所以我确信它们是好主意。不幸的是,我认为公司低估了事物的复杂性。我的一般基础设施建议是“越少越好”。

Nginx公司EKS入口的负载平衡器 链接到标题

🟩巾帼枭雄之义海豪情

Nginx很老,很稳定,经过了考验。

自制软件用于公司脚本 链接到标题

🟩背书

您的公司可能需要一种方法来分发脚本和二进制文件,供您的工程师使用。自制软件奏效了足够好了对于linux和Mac用户来说,这是分发脚本和二进制文件的一种方式。

去吧用于服务 链接到标题

🟩背书

Go对于新工程师来说很容易掌握,总体来说是一个不错的选择。对于主要是网络的非GPU服务IO绑定,Go应该是您的默认语言选择。