0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

AWS的“炮仗”与Serverless

Linux阅码场 来源:YXQ 2019-07-10 09:40 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

Serverless Computing,即”无服务器计算”,这一概念在刚刚提出的时候并没有获得太多的关注,直到2014年AWS Lambda这一里程碑式的产品出现。通过将无服务器计算的概念嵌入到整个云计算服务的整体产品框架中,无服务器计算正式走进了云计算的舞台。2017年,AWS发布了Fargate产品以充实自己的无服务器计算产品线。

今年5月,Google在KubeCon+CloudNative 2018期间开源了gVisor容器沙箱运行时并分享了它的设计理念和原则。随后,今年7月,Google在旧金山举办了2018年度Google Next大会,在这次大会上,Google推出了自己的 Google Serverless Platform。针对App Engine,最重要的更新就是低层的沙箱技术采用了gVisor。当然,我们有足够的理由相信Google指的是gVisor的内部实现版本。

今年的re:Invent 2018上,AWS点(kai)燃(yuan)了Firecracker —— AWS容器安全沙箱的基础组件,用于函数计算服务AWS Lambda和托管的容器服务AWS Fargate[1][7]。

图1 Firecracker microVM

Firecracker利用了Linux KVM来构建专门用于容器的微虚拟机,即Firecracker microVM。并力图提供一种针对容器的,同时满足了安全隔离、性能稳定、高资源利用率的方案。AWS的首席“传教士”Jeff Barr称它:即提供了传统虚拟机对业务负载的安全与隔离特性,也带来了像使用容器一样高效的资源利用率。

Firecracker派生自Crosvm[2] —— 用Rust编写的、开源的、用于Chromium OS的Virtual Machine Monitor。基于Crosvm,AWS于2017年10月开始了Firecracker的研发。但与Crosvm的目标不同,Firecracker聚焦于Serverless,即:专为无服务器计算场景提供安全高效的运行时。近些年,系统安全越发受到重视,Rust语言也变的越来越流行。Firecracker可能也是Rust语言在生产环境中部署的,规模最大的系统软件。

Firecracker目前还没有实现与Docker及Kubernetes对接。但是AWS同时开源了一个对接containerd的原型[9],并表示未来一定会和Kubernetes兼容。

根据AWS的说法,Firecracker微虚机可以在每个主机上以每秒150个实例的速率,在125ms内启动。并宣称VMM组件的内存开销小于5MiB(注:不包括客户内存,vCPU线程占用的内存,和控制平面上API Server线程占用的内存)。因此,可以在一台服务器上部署成百上千个微虚机。

2. AWS Lambda的演进与Firecracker的诞生

Firecracker目前已经用在AWS无服务器计算业务中,包括AWS Lambda和AWS Fargate。AWS认为,使用无服务器计算服务的用户负载的典型特点是“生命周期短”,而Firecracker专为这种场景打造。让我们看一下,Firecracker是如何支撑AWS Lambda的。

Firecracker诞生的内因是AWS Lambda的演进,而要了解Lambda的演进,就需要看一下Lambda对用户请求的执行过程和执行环境。如下图所示,用户请求通过“ALB”转发给“Front End”,“Front End”请求“Worker Manager”,“Worker Manager”初始化“Worker”,“Worker”准备函数沙箱执行环境,完成后,将状态原路返回给“Front End”,然后由“Front End”触发函数执行。

图2 AWS Lambda 执行过程

用户函数运行在“Lambda Runtime”中,在其之下是沙箱。与Linux中跑容器时常用的套路一样,使用了cgroups,namespaces,seccomp,iptables,和chroot等一些列工具以实现操作系统层级上的虚拟化(也称为“容器化”)[11]。再往下一层,是实现安全隔离的重点,即虚拟化技术与设备模拟。全栈如下图所示:

图3 AWS Lambda 执行环境

当AWS刚开始打造Lambda服务时,它始于在一个EC2实例中构建每一个“Worker”。原因很直接:

很好的安全边界;

快速构建好整个系统使业务上线;

这种方式今天依然在使用,并且运行在Nitro平台上面。

图4 基于EC2实例的AWS Lambda

通过AWS Lambda长期以来的生产实践和客户的需求反馈,AWS意识到,基于EC2实例的Lambda并不适合今天的无服务器计算场景。并总结出无服务器计算的典型特征应该是:“启动快,密度高,水平扩展”。但要达到以上这三个点,不能损失一点安全性。基于这些因素,AWS决定对Lambda进行改进,并在此过程中开发了Firecracker微虚机。由此,AWS Lambda有了另一种跑在微虚机中的“Worker”。

图5 基于Firecracker的AWS Lambda

为了进一步加固安全隔离,AWS在微虚机外面又套了一层沙箱(使用运行容器时常用的工具)。由此可见,安全隔离是对外提供服务的基本前提。

当启动变快,内存开销变低时,实例部署密度也自然有了更大的提升空间。但实际上,实例部署密度不仅与CPU、内存相关,还涉及到与业务相关的一整套资源,比如:ENI网卡,IP地址资源等。随着部署密度从一百提升到一千甚至更高的时候,相关资源的供给及使用的问题随之而来。

当Lambda创建和启动一个函数服务时,它需要经历在用户VPC网络中创建EC2 ENI网卡,并将该网卡添加给“Worker”。这个添加网卡的过程比较费时,并且每个ENI网卡需要在用户子网中消耗一个IP地址。有些情况下,这种模型还不错,简单并且支持VPC的所有特性。但最大的弊端,也是特别被某些用户所诟病的,就是等待VPC启动所耗费的时间过长。因此,AWS将ENI从“Worker”中移出,在“Worker”与ENI之间做了NAT,在多个不同的“Worker”间复用同一个ENI。本质上,这意味着在多个租户间复用数量有限的ENI网卡。这样改进后,带来的直接好就是可预期的VPC启动延时,快速的水平伸缩,低服务延时,和高易用性。

3. Firecracker的设计

3.1 内部架构

Firecracker微虚机的创建用到两个组件,Jailer和Firecracker,前者负责利用Linux提供的seccomp、cgroup、chroot、net/pid/user namespaces来创建沙箱环境,然后在其创建的沙箱环境中启动后者。后者利用Linux KVM创建设备模型极度精简的微虚拟机。结构如下:

6 firecracker结构框图

一个Firecracker进程就是一个微虚拟机,其内部主要有三个组件:

API Server

API Server以Unix domain socket的方式对主机提供了一个API endpoint,接口采用RESTful API格式,详见接口规范[10]。

通过这个API Endpoint,可以对微虚机进行管理和控制,包括:

规格配置:比如vCPU个数,用户内存大小;

网络配置:添加一个或多个网卡;

存储配置:

添加“只读”或“读写”虚拟盘,每个虚拟盘盘是一个基于文件的块设备;

运行时触发“re-scan”;

更换后端文件;

QoS:通过带宽限制和iops限制进行流控;

日志与遥测配置;

启动配置:内核及其参数,根文件系统;

关闭微虚机;

Firecracker以一个单独的线程运行API Server。

Virtual Machine Monitor

VMM负责构建Firecracker定制的虚拟机模型。其中包括:

最小化的老式设备模型;

微虚机元数据服务(microVM metadata service/MMDS);

VirtIO虚拟网络设备和块设备;

QoS流控;

串口控制台和半功能键盘;

VMM采用单线程事件驱动模型,对各种I/O请求进行服务。

vCPU Threads

根据规格配置,通过KVM接口创建vCPU结构,为每个vCPU启动一个线程,执行vCPU事件循环,并执行同步I/O和基于内存映射I/O的操作。

3.2 微虚机模型

Firecracker利用了硬件辅助虚拟化,同时使用一个极简的设备模型。从系统虚拟化角度看,可分解为如下几个方面:

CPU/Memory: 利用VT-x进行CPU虚拟化和内存虚拟化

系统总线:移除PCI系统总线模

设备模拟:

virtio-net

virtio-block

console

keyboard

irqchip

clock source

KVM in kernel devices

in VMM

3.3 社区及路线图

在Firecracker代码库中的文档里面公布的路线图上[8]可以看出,目前它主要部署在Intel的平台,计划还会支持AMDARM平台,及存储加密等特性。

Firecracker的开发者与社区的互动还是比较积极的。由此看来,他们希望借助社区的力量以实现与k8s很好的集成。在它的版本库上,还提供了一个与containerd对接的原型“firecrack-containerd”。Firecracker的维护者Anthony Liguori(前QEMU社区维护者)也表示出与Kata Containers社区合作的意愿。

4. 总结

注意到许多关于Firecracker的评论中,不少人对“容器运行时”与Firecracker之间的差别存在误解,在此强调下:Firecracker是一个virtual machine manager,QEMU也是一个virtual machine manager。Kata Containers使用QEMU。因此,Firecracker是AWS用于构建无服务器计算场景下的“容器运行时(Runtime)”(也叫“容器安全沙箱”)所用到的一个组件,作用是替换掉QEMU。当然,更谈不上是新型虚拟化技术,它依然使用Intel VT-x,依然需要机器模型和设备模型,只不过,它做的很精简(当然,为什么不呢?)。

为什么要替换QEMU?原因有很多,比如:庞大的代码体积;近年来高发的漏洞数量[12];对基本上用不到的传统设备、总线、机器模型的模拟。虽然某些情况下,对各种硬件协议的真实模拟还是不错的,但是,针对无服务器计算(Serverless)这样的场景,需要业务启动快,密度高,可快速水平扩展,这种方式显然就不适合了,需要一种更敏捷的容器运行环境。

除了Firecracker,Kata Containers和gVisor也致力于提供安全可靠的容器运行环境。它们之间存在哪些差异呢?

Firecracker与Kata Containers

首先,Kata Containers使用QEMU作为VMM,使用Linux作为Guest OS,通过配置QEMU的编译选项来裁剪掉一些不用的功能,通过配置Linux的编译选项裁剪掉不用的设备驱动、子系统和一些功能。但是,QEMU中的传统机器模型始终存在,还有一些“设备模拟”的功能没有编译选项,因此无法被裁剪掉;而Linux的子系统,如SMP,调度,内存管理,ACPI,PCI总线等也都依然假定活在真实物理机上。对于无服务器计算场景,这些都是没有意义的,因为在这种场景下,Guest OS完全由我们来提供。不需要考虑其他情况,如Windows或其他老的Linux版本。但凡对业务运行没有用的设备都不需要,甚至是设备模型和机器模型。Firecracker走的方向与我们正在走的设计方向很相似,即:极简的机器模型,拿掉PCI总线,替换掉QEMU。我们也曾考虑用Rust语言构建容器沙箱,但AWS动手更早,并已经大规模部署了。回头来考虑我们的容器实例场景,Aliyun ECI,试想下我们用Firecracker替换了QEMU,并且对Guest OS做进一步的优化,比如页表预分配,vCPU直接64bit分页模式启动等,沙箱的启动可以更快。

Firecracker与gVisor

对比Firecracker与gVisor的设计,不难发现一个很有意思的话题:“虚拟化的界面”,即:对Guest而言,它与Hypvervisor之间的接口是什么?_与“虚拟机”模型不同,gVisor采用了与Dune[13]类似的“进程虚拟化”模型,将虚拟化的界面画在了“系统调用/syscall”这个边界上。因此,彻底去掉了机器模型和设备模型。这不仅意味着减轻了虚拟化的“开销”,还意味着可以更加灵活高效的利用主机上的系统资源。gVisor就通过host-guest(vmx-root/nonroot)镜像内核地址空间的内存布局设计,使得它可以既作为host上的hypervisor,又作为guest中的supervisor,因此可以在vCPU调度上内外打通,使得vCPU“协程”可以按需增减。此外,gVisor自然的享受了Go Runtime中的concurrent garbage collector带来的好处,比如当执行完“用户负载/函数”时,或当Guest中的“工作集”缩小时,Go的GC的会立即把多余的内存回收并还给主机系统。这就使得gVisor在vCPU和内存资源的使用上都很有“弹性”。

但是,在系统调用这个边界上提供虚拟化意味着:为Guest提供大量的POSIX接口支持。从安全隔离的角度,这开出了很大的口子,因此,出于安全和性能的考虑,gVisor不得不将一些系统调用的实现放在它的内核里面,并在整个进程外面套一层沙箱环境(cgroups,namespaces,seccomp)。一直以来,我们也在讨论这个话题,这个“界面”越往上,虚拟化的开销越低,但同时,接口数量也变得越大,含义越丰富,严谨性越弱,即:“攻击面”越大。_那么,将“界面”画在哪里才是合理的呢?_可能没有一种完美的设计可以满足所有用户场景。但在针对无服务器计算这个场景,AWS给出的选择是接口数量小、含义确定的“虚拟机”模型,不同的是采用极简的机器模型和设备模型来降低开销。当然,这也就是说,无论在vCPU还是内存方面,firecracker都跟普通虚拟机一样,没有gVisor那样的“弹性”。这也说明,当在安全隔离和其他因素之间做取舍时,AWS首选前者。

此外,Go runtime并不是“免税”的,它带来“弹性”的同时也引入了一些不利的影响,Cody Cutler[14]在他paper中对用Go语言编写的内核进行了详细分析,在此不展开了。最后,我们也看到,自Google开源gVisor以来,已经存在几个漏洞,如[15][16]。可见开发一个稳定的内核很不容易,需要严谨的设计和长时间的打磨。

Firecracker的核心设计准则

无服务计算(Serverless)到底需要什么样的平台呢?根据前面的分析,其实不难看出,AWS已经给出了它的答案。

一、对外服务的前提是安全隔离,而硬件辅助虚拟化是在多租户间进行安全隔离的最低标准。在安全和性能面前, 安全第一

二、无服务器计算场景下,典型的业务特征是生命周期短,因此需要它的平台提供:

启动快:极简设备模型,没有BIOS,没有PCI,甚至不需要设备直通;

密度高:内存开销低;

水平扩展:因为容器的生命周期短;甚至不需要热迁移;

三、在提高服务器资源利用率方面,AWS也给出了答案,即:基于统计数据搞混部。例如AWS Lambda,它将不同用户、不同函数运行在同一组硬件资源上,利用用户负载的波峰波谷互补(与我们搞混部的思路也是一致的)。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 服务器
    +关注

    关注

    13

    文章

    10093

    浏览量

    90890
  • AWS
    AWS
    +关注

    关注

    0

    文章

    443

    浏览量

    26311
  • serverless
    +关注

    关注

    0

    文章

    65

    浏览量

    4849

原文标题:AWS的“炮仗”与Serverless

文章出处:【微信号:LinuxDev,微信公众号:Linux阅码场】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    亚马逊云科技推出Amazon DocumentDB Serverless,简化数据库管理并大幅节省成本

    北京2025年8月15日 /美通社/ -- 亚马逊云科技日前宣布,Amazon DocumentDB Serverless已正式可用,这是Amazon DocumentDB(兼容MongoDB
    的头像 发表于 08-15 13:11 424次阅读

    Tata Communications与AWS达成合作

    Communications与Amazon.com, Inc.旗下公司Amazon Web Services(AWS)联合宣布,双方将在印度构建先进的AI就绪网络。 此次战略合作将建立连接AWS三大基础设施节点
    的头像 发表于 07-30 21:47 649次阅读

    Grameenphone参与爱立信与AWS Gen-AI实验室项目

    爱立信×AWS 「Gen-AI实验室」旨在推动运营商在OSS/BSS中的AI应用突破。通过结构化、结果导向的协作方式,实验室将爱立信在OSS/BSS产品组合和行业专业知识方面的深厚积累,与AWS
    的头像 发表于 07-16 10:49 1.6w次阅读

    请问55912是否支持WLAN卸载和AnyCloud(AWS+MQTT) 功能吗?

    我可以知道 55912 是否支持 WLAN 卸载和 AnyCloud(AWS+MQTT) 功能吗? 如果是的话,我可以知道什么时候计划在 ModusToolbox 系统上线吗?
    发表于 07-09 06:42

    【新品发布】艾为车规级AWS79062SPR-Q1,高带宽轨到轨运算放大器的新巅峰

    近年来随着新能源汽车的发展,汽车行业呈现智能化、更安全发展趋势,对芯片性能、适配性、可靠性、安全性等方面提出了更高要求。艾为推出的AWS79062SPR-Q1车规级低噪声CMOS双通道运算放大器
    的头像 发表于 05-29 18:03 702次阅读
    【新品发布】艾为车规级<b class='flag-5'>AWS</b>79062SPR-Q1,高带宽轨到轨运算放大器的新巅峰

    HarmonyOS5云服务技术分享--Serverless抽奖模板部署

    手把手教你部署HarmonyOS Serverless抽奖活动模板(附贴心提醒) 嘿,小伙伴们!今天给大家分享一个超实用的教程——如何用华为HarmonyOS的Serverless模板快速搭建抽奖
    发表于 05-22 20:25

    HarmonyOS5云服务技术分享--Serverless搭建抽奖

    ✨【实战指南】手把手教你用华为AGC Serverless模板快速搭建抽奖活动✨ 嗨各位开发者小伙伴!今天给大家分享一个超实用的技巧——用华为应用市场AGC的Serverless模板三分钟搞定抽奖
    发表于 05-22 20:20

    HarmonyOS5云服务技术分享--自有账号对接AGC认证

    。不用重复造轮子,还能享受AGC的安全保障和Serverless生态,简直不要太方便!? 下面直接上干货,步骤超详细,包教包会! ? ​​一、什么是自有账号对接?​​ 如果你的应用已经有一套成熟的账号
    发表于 05-22 16:32

    Arm+AWS实现AI定义汽车 基于Arm KleidiAI优化并由AWS提供支持

    文中介绍的车载生成式 AI 应用演示由 Arm KleidiAI 进行优化并由 AWS 所提供的服务进行支持,展示了新兴技术如何帮助解决汽车行业的实际挑战。该解决方案可实现 1 至 3 秒的响应时间并将开发时间缩短数周,证明更高效且离线可用的生成式 AI 应用不仅能够实现,而且非常适合车载部署。
    的头像 发表于 04-03 19:24 1673次阅读
    Arm+<b class='flag-5'>AWS</b>实现AI定义汽车  基于Arm KleidiAI优化并由<b class='flag-5'>AWS</b>提供支持

    在Amazon Web Services* Compute Cloud实例中运行时Benchmark_App失败了的原因?

    AWS* EC2 实例上使用 [i]-infer_precision CPU:bf16 参数时,ran Benchmark_App 失败,但未能完成。
    发表于 03-05 10:08

    AWS Graviton4处理器上运行大语言模型的性能评估

    亚马逊云科技 (AWS) 新一代基于 Arm 架构的定制 CPU —— AWS Graviton4 处理器已于 2024 年 7 月正式上线。这款先进的处理器基于 64 位 Arm 指令集架构的 Arm Neoverse V2 核心打造,使其能为各种云应用提供高效且性能强
    的头像 发表于 02-24 10:28 1236次阅读
    在<b class='flag-5'>AWS</b> Graviton4处理器上运行大语言模型的性能评估

    伟创力珠海B11工厂荣获AWS Core Level认证

    近日,伟创力珠海B11工厂在国际可持续水管理领域取得了重大突破,成功获得国际可持续水管理联盟(Alliance for Water Stewardship,简称AWS)Core Level认证。这一
    的头像 发表于 01-21 14:42 1119次阅读

    芯享程半导体发布高性能运算放大器AWS8611

    上海芯享程半导体有限公司近日宣布,正式推出其最新研发的4.5V到60V零温漂低失调电压低噪声运算放大器——AWS8611。这款高性能运算放大器芯片以其独特的技术优势和创新设计,成为精密数据采集
    的头像 发表于 12-27 14:15 1295次阅读

    Arm Neoverse 驱动 AWS Graviton4,加速云计算新时代

    满足性能提升、成本降低以及符合监管和可持续发展目标的新能效基准。 近日,Arm与亚马逊云科技(AWS)的长期合作,正致力于通过专用芯片和计算技术,推动云计算向更高性能、更高效和更可持续的方向发展。在AWS re:Invent 2024大会上,
    的头像 发表于 12-23 17:38 963次阅读

    Arm与AWS合作深化,AWS Graviton4展现显著进展

    Arm与亚马逊云科技(AWS)的长期合作关系,一直致力于为云计算领域带来性能更强劲、更高效和可持续的解决方案。双方通过专用芯片和计算技术的结合,不断推动云计算的发展。 在近期举行的AWS re
    的头像 发表于 12-18 14:17 848次阅读