写点什么

三步实现 Lambda 向 Kubernetes 大迁移

作者:Liav Yona

  • 2023-05-30
    北京
  • 本文字数:3747 字

    阅读完需:约 12 分钟

三步实现Lambda向Kubernetes大迁移

基础设施即代码(IaC)的世界已经掀起了云原生的风暴,如今配置云服务和应用程序时,它已成为一种通用的最佳实践。当云操作呈指数级增长时(这在当今基于 SaaS 和云托管的按需应用程序中发生得相当快),对于仍在利用 ClickOps 的公司来说,很快就会崩溃,ClickOps 通过手动配置,但这在云应用程序中会造成漂移。


值得注意的是,虽然 IaC 是一种最佳实践,并提供了许多好处(包括避免漂移),当我们需要进行重大的基础设施迁移时,我们看到了它的真正价值。我们发现,由于我们很早就利用了 IaC 的强大功能,并在配置方面与最佳实践保持一致,因此以前复杂的迁移过程变得简单多了。(还记得像 VeloStrata 和 CloudEndure 这样的公司吗?它们就是为此目的而建立的吗?)当我们谈论云和供应商锁定时,我们已经了解到如何打包、配置和部署应用程序会直接影响它们的可移植性和可扩展性。


在本文中,我想分享我们在 Firefly 的工作,将作业从 Serverless 迁移到 Kubernetes Job 的伟大旅程、经验教训、以及帮助我们以最小的痛苦实现这一目标的技术。

第一站:Lambda 事件


Serverless(无服务器)正在成为许多新兴甚至成熟公司的热门选择架构,因为它提供了云的所有好处——规模、可扩展性、弹性——以及最小管理和维护开销的附加值。它不仅速度快、可扩展,而且构建起来还非常有趣。


Lambda、函数、连接它们的服务以及基于事件的架构是开发人员试验和快速迭代之前复杂架构的游乐场。对于专为此类工作而构建的TerraformTerraform Modules来说尤为如此。突然之间即可通过 lambda 运行程序在数小时内构建支持大规模、并发操作的基础设施,这过去至少需要几天甚至几周。


然而,随着时间的推移,我们开始遇到事件驱动架构和设计方面的问题。 由于我们的数据和流正常工作所需的服务种类繁多——API 网关、SQS、SNS、S3、事件桥等,事件的数量及其输入/输出开始增加。这就是我们开始触及已知的Serverless超时墙的地方。由于 Serverless 本质上是短暂的运行时,它基本上只有一个 15 分钟的任务完成窗口。如果任务没有及时完成,就会失败。


我们开始意识到,蜜月期可能已经结束了,我们需要根据用例和操作的具体性质来重新思考我们的基础设施选择。当你走上微服务的道路时——在我们的案例中,我们选择了利用Go例程来实现多线程服务(所以我们谈论的是很多服务),你通常会开始失去对正在运行的作业和服务数量的控制。


我们“微服务统治一切!”的心态,在以前我们认为它是令人难以置信的可扩展性的标志,但现在是我们崩溃的根源。我们试图通过添加限制来解决超时问题,但这大大减慢了我们的流程(对 SaaS 公司来说这不是一件好事),这当然不是我们所希望的结果。当我们增加集群时,这带来了巨大的成本影响,这对于一家初创公司来说也不是理想的选择。


技术债的累积使我们开始考虑我们的选择——重写还是迁移?如果不进行重大改革,我们还可以考虑或利用哪些其他技术呢?

第二站:停靠在 ECS


我们旅程的下一站是ECS(Elastic Container Service,弹性容器服务)。选择 ECS 实际上是我们最初选择将应用程序打包并部署到 Serverless 的副产品。我们选择将所有的应用程序进行 docker 化,并通过 Terraform 进行配置。这种早期的选择最终使我们能够选择我们的架构和基础设施。


我们决定尝试一下 ECS,主要是因为它的分析能力,以及处理任务、事件和作业时没有时间限制,就像 Serverless 一样。


ECS 的优势在于它的控制机制——这是它的核心功能,AWS 在其中管理任务调度、优先级、在何处以及何时运行。然而,对我们来说,这也是一把双刃剑。


特定事件的性质要求我们在任务调度方面有更大的控制权,比如更细粒度的优先级排序、任务排序、基于预定义的指标和阈值推动动态配置,而不仅仅是编程限制,还需更具动态性并利用遥测数据的限制。例如,如果我们有一个特定的帐户或租户正在使系统超载或向系统发送垃圾邮件,我们可以更动态地限制该事件,并更好地控制每个租户的自定义配置。


当我们分析这种情况时,我们意识到缺少的是一台“计算机”,或者说是 Kubernetes 世界中的操作(operator)。(这是一篇关于如何编写第一个 Kubernetes 操作的好文章,在这里你可以了解更多详细信息)。

第三站:回到 Kubernetes 作业的旅程中


回到使用容器化 lambda 的选择上,我们意识到,由于这个选择,我们并没有局限于基于 AWS 的基础设施,突然间,一个开放的社区标准选项出现了,这对我们和我们的需求来说是正确的选择。


如果我们想看看迁移到 Kubernetes 的好处,有很多需要考虑的因素:

  • 有了 Kubernetes 作业(job),就有了一个可以实现更动态配置的操作(operator)

  • 作为一家以 IaC 为先的公司,Helm是配置应用程序的绝佳方式

  • 在无限规模上进行更大、更细粒度的分析、限制和配置


对我们来说,能够手动配置和管理 CPU 和内存分配,以及通过深度分析对其进行定制和自动化,这一好处是非常重要的。特别是当我们谈论由具有高度不同使用行为的各种客户端组成的规模时,其中一个租户可以运行两个小时,而其他租户只能运行三秒。因此,这种可定制性对我们来说是一个关键特性,也是最终让我们确信这一举措的关键。


接下来是检查应用程序的不同层,以了解这种迁移的复杂性。

如何将 Lambda 转换为 Kubernetes 作业?


现在是我们进行哲学思考的时候了。最终,什么是 lambda?这是一种需要使用特定配置并一次性完成的作业,该配置运行一组 worker 来完成作业。这让我们顿悟,这听起来很像……K8s 的作业。


我们的容器化 lambda 和完全编码的配置使我们能够重用运行时和配置,在不同环境之间移动只需进行很少的调整。让我们来看看其中的一些关键元素。

网络


绝大多数网络要素都是通过容器化来覆盖的,包括安全组等等。另一方面,如果网络未配置为代码或定义不明确,那么可能会发现服务之间的通信崩溃。确保所有安全组及其资源,从 VPC 到其他任何东西,都得到了正确的配置,可以确保更加无缝的过渡,这本质上是民主化基础设施选择的基础。

权限和外部配置


另一个可以促成或破坏这种迁移的关键方面是权限和访问控制。Serverless(AWS)、ECS 和 Kubernetes 与IAM角色一起工作时,问题只在于如何设计角色,使流不会中断,然后就可以轻松地跨环境移植它们。通过这种方式,我们可以确保流程不会在过渡中中断。会存在一些小的更改和优化,例如配置信任关系; 但是,这比从头开始配置所有权限要好的多。


更改 IAM 角色的信任关系:

{    "Version": "2012-10-17",    "Statement": [        {            "Effect": "Allow",            "Principal": {                "Service": "lambda.amazonaws.com"            },            "Action": "sts:AssumeRole"        }    ]}
复制代码


这使其可移植且可重复使用:

{    "Version": "2012-10-17",    "Statement": [        {            "Sid": "",            "Effect": "Allow",            "Principal": {                "Federated": "arn:aws:iam::123456789:oidc-provider/oidc.eks.us-east-1.amazonaws.com/id/XXXXXXXXXXXXXXXXX"            },            "Action": "sts:AssumeRoleWithWebIdentity"        }    ]}
复制代码


我们需要确保所涉及的其他更改也在 Kubernetes 部署中将环境变量转换成了 configmap 格式。这样,就可以连接到首选的运行时和环境上了。

令人不快的运行时流


这并不意味着不会存在另人不快的流。Docker 并不是万能的,在某些情况下会出现兼容性问题,例如基础镜像可能会随着服务的不同而变化,或者在不同的操作系统发行版本之间发生变化,此外还有 Linux 问题,比如文件目录中的依赖关系。


然而,我们可以通过使用尽可能多的抽象来构建自己的 Docker 镜像和依赖关系,从而克服这些挑战。例如,在单独的构建器镜像中编译我们的 Golang 应用程序,并在目标镜像中使用它,或者在具有显式引用的结构中管理我们的环境变量,以避免依赖任何运行时为我们注入,这些都是避免运行时问题的良好实践。

蓝/绿部署


那么最终的发布是什么样的呢?虽然有一些停机时间,但这并不重要。我们团队选择了蓝/绿的方法来进行部署,并对此进行了密切监控,以确保所有数据都能正常接收,迁移也能顺利进行。


在我们进一步深入探讨之前,先简单介绍一下监控和日志记录。这是在部署任何内容之前需要确保正确迁移的另一个方面。当涉及到监控时,我们需要确保正确地转换了一些元素。如果我们之前监控过 lambda,那么现在就需要将它们转换为监控集群和 pod。我们需要验证日志是否能正常发送和到达——CloudWatch 与 fluentd。


一旦我们把所有这些都准备好了,就可以按照蓝/绿部署来重新路由我们的流量了。我们通过 SQS 将一些事件流路由到新的基础设施,并进行持续的完整性检查,以确保业务逻辑没有中断,一切都在传输,并且监控和日志记录都在正常工作。一旦我们检查了这个流程,并在没有任何中断的情况下将流量从以前的基础设施缓慢增加到新的基础设施上,我们的迁移就已经完成了。


这可能需要几个小时或几天的时间,具体时间取决于部署规模以及操作、SLA、数据等的敏感程度。唯一明确的建议是要确保我们有适当的可见性来了解它是否在有效地工作。


原文链接:

https://www.infoq.com/articles/lambda-migration-k8s-jobs/


相关阅读:

更便捷地迁移+开发:3年时间,鲲鹏 DevKit真的做到了

迁移至云端:真的像看上去那样让人望而生畏吗?

使用 Rspack 构建真实开源项目,实测迁移成本和性能收益

2023-05-30 10:048780

评论

发布
暂无评论
发现更多内容

OAuth2.0授权码模式实战

码农参上

OAuth 2.0 8月日更

爱了!Alibaba技术官甩出的SpringCloud笔记,GitHub已标星81.6k

Java~~~

Java 面试 微服务 Spring Cloud 架构师

Java书单-比较全的一篇

汤圆学Java

程序员

从平台到生态,钉钉、飞书和企业微信的巨头之争

ToB行业头条

钉钉 企业微信 飞书

完美!腾讯技术官发布Java零基础就业宝典,不用再怀疑人生了

Java~~~

Java spring 面试 微服务 架构师

快速发展的互联网通信,站在开发者背后的融云

融云 RongCloud

堡垒机价格与什么有关?价格差别大吗?

行云管家

云计算 堡垒机

企业上云之前选择服务器类型的几点建议

九河云安全

IOS技术分享| 互动连麦场景实现

anyRTC开发者

ios 音视频 移动开发 视频直播 直播连麦

2021 年云安全:基本工具和最佳实践业务指南

九河云安全

针对不同场景的Python合并多个Excel方法

Python研究者

Python Excel 8月日更

从外卖员到程序员,自学3年终于转行成功,三面“拿下”拼多多

Java~~~

Java spring 面试 微服务 JVM

Alibaba开发十年,写出这本“MQ技术手册”,看完我愣住了

Java~~~

Java kafka 面试 MQ 架构师

史上最全的服务器选择指南,这六点你必须知道!

九河云安全

前端性能优化|什么是防抖和节流?

青云技术社区

JavaScript 大前端 防抖节流 函数防抖

保险=诈骗?区块链赋予保险的“四个机会”

旺链科技

区块链 保险业 信任构建

如何利用FL Studio进行听湿录干的声音录制

懒得勤快

耗时三年才总结出了这份Alibaba(P5-P9)学习进阶路线图

Java架构追梦

Java 阿里巴巴 架构 面试 架构成长路线

市场战略再升级 解析融云的生态平台+纵深发展

融云 RongCloud

FastApi-09-模型嵌套

Python研究所

FastApi 8月日更

浪潮云洲智造直播间,继续开讲!

云计算

七牛云霍锴:实时音视频 SDK 设计实践

七牛云

七牛云存储 音视频 ECUG

【等保测评】江西等保测评机构只有3家吗?都在哪里?

行云管家

等保 等级保护 等保测评 等保评测

如果用柔性屏做雨伞,那雨伞就不仅仅是雨伞了

船医特拉法尔加

开发者工具

Qunar 大讲堂问题排查

Qunar技术沙龙

问题处理 问题排查 管理系统 开发管理 问题总结

网络攻防学习笔记 Day101

穿过生命散发芬芳

态势感知 网络攻防 8月日更

高防服务器在使用过程中可以做到高效、稳定的防止钓鱼攻击

九河云安全

Alibaba内部出品“Java初学者宝典”,让你就业没压力

Java~~~

Java 面试 JVM 多线程 架构师

限量!Alibaba首发“Java成长笔记”,差距不止一点点

Java~~~

Java spring 面试 微服务 架构师

不安全的服务器和云服务器:远程工作如何增加了黑客可以攻击的攻击面

九河云安全

企业架构概述

涛哥 数字产品和业务架构

三步实现Lambda向Kubernetes大迁移_软件工程_InfoQ精选文章