边缘计算平台与函数计算背景与现状
目前,边缘计算(Edge Computing)是一个新兴的技术方向,边缘计算能够和云计算紧密结合,充分发挥边缘的低时延、安全等特性,具有广阔的应用前景。边缘计算平台是一套基于边缘计算的能力与云计算核心技术,在边缘基础设施之上构建的计算平台,也是在边缘位置形成的计算、网络、存储、安全等能力的全面的弹性云平台。边缘计算平台适用于将云的计算能力延展到距离“万物”十千米的位置,例如乡镇、街道级的计算场景,以及距离“万物”一千米的工厂、楼宇等计算场景。为“万物互联”的终端提供自组织、低时延、可定义、可调度、安全性高、标准开放的分布式云服务。与云计算领域已经具备成熟的计算管理软件平台不同,边缘、物端计算平台在国内外并没有成熟稳定的对应技术。当前各个公司都希望在边缘计算这一新的领域获得先发优势,边缘计算和无服务计算(Serverless Computing)的研究工作仍处于初级阶段,各厂商及开源社区边缘技术路线各不相同,个性体现并丰富着共性,同时个性并不完全包含于共性之中。本文的边缘计算平台基于Nomad,一个轻量级的集群管理及其上的应用编排工具。在边缘计算产业联盟白皮书中将边缘计算产业总体上划分为联接、智能、自治三个发展阶段。第一个发展阶段是联接,一种运行时的支持意味着一种工作负载任务类型和一类技术生态的支持。本文着眼于边缘计算平台的多运行时支持。基于Nomad的边缘计算平台原生已支持Docker、LXC、裸进程等运行时。
但当前基于Nomad的边缘计算平台在运行时方面不能满足业务场景需求。一是有些边缘场景仍需要使用传统虚拟机,包括同时需要支持多个不同OS的场景,业务有更高的安全、隔离需求。借助容器和虚拟机,系统能够更方便地对计算平台上的业务负载进行整合、编排和管理。二是物联网平台和应用使用边缘计算承载已成为共识,但物联网应用存在海量接入、碎片化、边缘化等特点,需要边缘计算提供新的架构和技术手段;边缘应用业务通常具有波峰波谷变化,业务运行具有事件触发特征,且边缘环境资源受限,设备众多,需要考虑更细粒度的动态调整和面向协作的资源管理方式。随着无服务器计算的提出,其中函数计算,即函数即服务(Function as a Service,FaaS)的服务模式以函数为粒度,更加体现了资源复用与灵活调度的核心理念,且符合物联网、边缘应用业务的特点,能够简化边缘应用开发者的工作。
基于以上问题,本文具体基于Nomad的边缘计算平台,研究虚拟机、容器、函数等多粒度多运行时的支持。在该边缘计算平台的基础上,增加Libvirt虚拟机运行时和FaaS函数运行时。并在此基础上,结合无服务器计算的模型,设计和实现边缘计算平台函数计算服务功能,扩展边缘计算平台的服务模式,提供更好的服务质量体验。
边缘计算的背景与现状
边缘计算的提出背景。物联网、工业互联网、车联网、增强现实、虚拟现实、4K/8K高清视频等丰富新型业务应用的快速涌现,对网络的传输容量、数据分发和处理能力等提出了越来越高的要求。同时,应用服务的进一步发展产生了海量的连接和数据。另外,终端用户也越来越渴望获得更高体验质量的网络服务,并愿意为此付出更多的费用。传统云计算模型已经无法有效应对快速增加的数据量、更高的数据传输带宽需求、新型应用数据处理更高的实时性要求。因此,必须对网络进行架构上的调整,以满足超大连接、超低时延以及超大带宽等业务需求。为了应对上述挑战,业界提出在网络边缘提供计算处理与数据存储等能力,即边缘计算,以达到在网络边缘向用户提供优质服务的目的。
边缘计算的发展历史。20世纪90年代,Akamai公司首次定义了内容分发网络(Content Delivery Network,CDN)[1]。在终端用户附近设立传输节点,用于存储图像、视频等缓存的静态数据,其被视为边缘计算最早的雏形。边缘计算通过允许节点参与并执行基本的计算任务,进一步提升了这一概念。1997年,计算机科学家Brian Noble成功地将边缘计算应用于移动技术的语音识别[2]。两年后边缘计算又被成功应用于延长手机电池的使用寿命,这一过程在当时被称为Cyber foraging [3]。1999年,点对点计算(Peer to Peer Computing)出现[4]。2006年,亚马逊公司发布了EC2服务,从此云计算正式问世,并开始被企业采用。2009年汇总的基于虚拟机的Cloudlets移动计算案例中,时延与云计算之间的端到端关系被详细介绍和分析[5]。其中提出了两级架构的概念:第一级是云计算基础设施,第二级是由分布式云元素构成的Cloudlet。这种两级架构在很多方面成为现代边缘计算的理论基础。2013年,雾计算(Fog Computing)由Cisco带头成立的OpenFog组织正式提出,其中心思想是提升互联网可扩展性的分布式云计算基础设施[6]。雾计算和边缘计算概念上相似,如果要区分,两者的主要区别是边缘计算在强调边缘设备和基础设施的同时,更关心边缘智能的体现。2014年欧洲电信标准协会(European Telecommunications Standards Institute,ETSI)成立移动边缘计算规范工作组,推动边缘计算标准化,旨在为实现计算及存储资源的弹性利用,将云计算平台从移动核心网络内部迁移到移动接入边缘[7]。2015年边缘计算进入到Gartner的Hype Cycle(技术成熟曲线)。2016年ETSI提出把移动边缘计算(Mobile Edge Computing,MEC)的概念扩展为多接入边缘计算(Multi-Access Edge Computing,MEC)[8]。自此,MEC成为一个可以运行在移动网络边缘的执行特定计算任务的服务器等设备。
边缘计算的定义。对于边缘计算的定义,目前业界还没有统一的结论。2018年边缘计算产业联盟(Edge Computing Consortium,ECC)对边缘计算的定义是:“在靠近物或数据源头的网络边缘侧,融合网络、计算、存储、应用核心能力的开放平台,就近提供边缘智能服务,满足行业数字化在敏捷连接、实时业务、数据优化、应用智能、安全与隐私保护等方面的关键需求。它可以作为联接物理和数字世界的桥梁,使能智能资产、智能网关、智能系统和智能服务”[9]。网络边缘侧可以理解为从数据源到云计算中心之间的任意功能实体,这些实体搭载着融合网络、计算、存储、应用核心能力的边缘计算平台。
边缘计算的国内外发展现状。近年来,边缘计算已经掀起产业化的热潮,各类产业组织、商业组织在积极发起和推进边缘计算的研究、标准、产业化活动。主要的三大阵营在边缘计算发展上各有优势:互联网企业试图将公有云服务能力扩展到边缘侧,以消费物联网为主要阵地;工业企业试图发挥自身工业网络连接和工业互联网平台服务的领域优势,以工业互联网为主要阵地;通信企业希望盘活网络连接设备的价值,开放接入侧网络能力,挺进消费物联网和工业互联网阵地[10]。
边缘计算技术架构。2018年ECC基于参考架构基于模型驱动的工程方法,设计并发布了边缘计算参考架构3.0。随着研究侧重点的细微差别,边缘计算发展至今已有MEC、微云、雾计算3种业界广泛认可的技术架构[11]。另外,云接入网的研究发展也为边缘计算的发展提供了更多创新的可能。其中,移动边缘计算模型强调在云计算中心与边缘设备之间建立边缘服务器,在边缘服务器上完成终端数据的计算任务,但移动边缘终端设备基本被认为不具有计算能力。相比而言,边缘计算模型中的终端设备具有较强的计算能力,因此,移动边缘计算类似一种边缘计算服务器的架构和层次,作为边缘计算模型的一部分[12]。根据云技术正向跨多云分布和包含各种设备的方向发展,在架构设计上需要轻量级虚拟化解决方案,而容器化目前被讨论为一种轻量级虚拟化解决方案。Pahl[13]等人回顾了边缘云的需求,并讨论了从数据中心到小型设备的一系列网络节点,通过分布式多云平台构建应用程序所需要的适合的容器和集群技术。Kunz[14]等人介绍了一种动态、安全的开放服务边缘网络体系结构OpenEdge(此处不同于百度的OpenEdge)。OpenEdge提供了一个控制体系结构,以类似云的方式自动化边缘网络的配置,以简化新网络服务和应用程序的引入。Pahl[15]等人展示了一种边缘云的PaaS架构。对于边缘云,应用程序和服务编排可以帮助通过容器管理和编排应用程序。以这种方式计算被带到云的边缘,而不是从物联网IoT到云的数据。通过在树莓树派等小型单板设备上实现容器和集群技术,实验表明边缘云可以满足成本效率、低功耗和健壮性等需求。
边缘计算使能技术包括网络功能虚拟化(Network Function Virtualization,NFV)[16]、软件定义网络(Software Defined Networking,SDN)[17]、信息中心网络(Information Centric Networking,ICN)[18]、人工智能、云计算和数据中心网络、大数据、区块链等各种支撑技术。
边缘计算商业化落地。当今,边缘计算市场仍然处于初期发展阶段,目前边缘计算的主要落地形态主要包括云边缘、边缘云和云化网关三种落地形态。云边缘逻辑上仍是云服务;边缘云是边缘侧构建中小规模服务能力,边缘服务能力主要由边缘云提供;云化网关是重构原有嵌入式网关系统,在边缘侧提供协议/接口转换、边缘计算等能力。亚马逊携AWS Greengrass进军边缘计算领域,保持着行业前沿。微软公司在物联网领域进行大量投入,发布了Azure IoT Edge解决方案,该方案通过将云分析扩展到边缘设备以支持离线使用。谷歌公司发布了两款新产品,分别是硬件芯片Edge TPU和软件堆栈Cloud IoT Edge旨在帮助改善边缘联网设备的开发。Apache基金会孵化项目Edgent可以嵌入网关和小型的内存边缘设备中,加速在边缘端的实时数据分析。Dell发起物联网解决方案EdgeX Foundry,成为Linux基金会的首个物联网框架。百度开源了智能边缘计算框架OpenEdge,后加入Linux Foundation Edge更名为Baetyl。阿里巴巴推出了物联网边缘计算平台Link IoT Edge。华为开源了KubeEdge,Kubernetes本地边缘计算框架,加入云原生计算基金会(Cloud Native Computing Foundation,CNCF)孵化。Xiong[18]等人在KubeEdge的论文中介绍了该边缘基础设施允许在边缘采用现有的云服务和云开发模型,并提供边缘和云之间的无缝通信。华为云为边缘云和云边缘分别提供了IEF、IEC解决方案。金山云推出了面向下一代边缘计算的KENC(Kingsoft Cloud Edge Node Computing)平台。OpenStack Foundation推出StarlingX边缘云软件堆栈。基于Nomad的边缘计算平台属于边缘云的落地形态。新兴的边缘计算领域蓬勃发展百家争鸣。
函数计算的背景与现状
函数计算,即函数即服务,无服务器计算的核心。需要结合云平台提供的专门的厂商绑定的后端即服务(Background as a Service,BaaS),满足特定应用的需求。简单地说,Serverless=FaaS+BaaS[20]。FaaS采取事件驱动的方式,由平台托管计算服务。使用函数计算,用户只需编写并打包上传代码,函数计算为开发者准备好计算资源,弹性可靠地运行任务,无需预采购与管理服务器等IT基础设施。
函数计算的提出背景。无服务器架构的兴起是云计算技术的深入发展的产物。云计算发展之初,有两种极端的相互竞争的云虚拟化方法,市场最终选择了亚马逊EC2低级虚拟机方法来处理云计算。这种选择的缺点是,开发人员必须自己管理虚拟机并进行繁琐的配置。随着公共云BaaS云产品的繁荣发展被越来越多的开发者采纳,5G落地、AI爆发、大数据持续突破,云计算已然成为新时代的水电煤,用户使用云计算的主要矛盾发生了转变。AWS随之推出Lambda云服务,其提出了以函数计算为核心的Serverless架构。Serverless提供了一个大大简化云编程的接口。它代表了一种进化,与过去程序员从汇编语言到高级编程语言的转变非常相似的生产力的进步。数据中心和其中的软件平台的快速创新再次改变了开发者构建、部署和管理在线应用程序和服务的方式。无服务器——Serverless,尽管这可能是一个矛盾的说法,因为仍然在使用服务器进行计算,但这个名称之所以流行起来,是因为它表明云用户只是编写代码,并将传统云计算所需的大量服务器系统管理任务委托给云厂商。Serverless和传统云计算之间的三个基本区别是:计算与存储的解耦,它们的规模独立,价格独立;执行一段代码的抽象而不是分配资源来执行代码;为代码执行付费,而不是为分配给执行代码的资源付费。
函数计算的发展历史。2014年AWS推出Lambda云服务,其提出的函数计算为核心的Serverless架构,得到关注和推广。其实,谷歌最初的App Engine也允许开发者部署代码,同时将大部分操作留给云厂商,但在Serverless得到普及的前几年,它基本上遭到了市场的拒绝,市场最终接受了2006年亚马逊发布的EC2的低级虚拟机方法来处理云计算。低级虚拟机成功的主要原因是,在云计算的早期,用户希望在云中重新创建与本地计算机上相同的计算环境,以简化将工作负载迁移到云上的工作,很明显,这种实际的需求优先于仅仅为云编写新程序,特别是在早期云的成功程度尚不清楚的情况下。函数计算的发展历史包含了虚拟化的演进史。早期每个应用程序都在自己的物理机器上运行。购买和维护大量机器需要高额成本,且每台机器经常未被充分使用,导致了一个巨大的飞跃:虚拟化。虚拟化是计算平台的关键技术,虚拟化是一组类似资源提供一个通用的抽象接口集,从而隐藏属性和操作之间的差异,并允许通过一种通用的方式来查看并维护资源。基于虚拟化的高效便捷的管理,有效地提高了资源利用率并降低了能耗。起初是基于硬件的重量级虚拟化,如Kernel-based Virtual Machine(KVM)等。随后出现了更轻量级的操作系统级的容器虚拟化技术,如Docker、Linux Containers(LXC)等。容器是面向服务器的类Unix风格的进程的重新打包,结合Linux内核提供的Namespace资源隔离机制,实现轻量级虚拟化。使用Cgroups控制和隔离资源限制。与Docker之类的分发工具相结合,容器使开发人员能够轻松地启动新服务,而无需使用虚拟机缓慢地启动且有运行时的开销。对于基于硬件和基于容器的虚拟化来说,服务器是核心概念,它们仍然是Serverful的。云计算的核心理念是资源复用和灵活调度,从物理机发展到虚拟机到容器,都是资源粒度不断细化、管理调度不断优化的过程。云计算发展出基础设施即服务(Infrastructure as a Service,IaaS)、平台即服务(Platform as a Service,PaaS)和软件即服务(Software as a Service,SaaS)三个层次三种服务模式。长期以来,服务器一直被用来部署在线应用程序,但众所周知服务器很难配置和管理,服务器启动时间严重限制了应用程序快速伸缩的能力。无服务器计算的新模型的出现注定将改变现代可伸缩应用程序的结构,它的核心是函数计算FaaS。开发人员不再将应用程序视为服务器的集合,而是使用一组可访问公共数据存储的函数来定义应用程序。不同用户的函数处理程序共享由云厂商管理的公共服务器池,因此开发人员不必担心服务器管理,应用程序可以快速扩展。通过这种方式,FaaS服务模式代表了应用程序之间共享演进的逻辑结论,如图1.1所示,这个演讲过程从硬件到操作系统再到运行时环境本身。
图 1.1 Serverless虚拟化发展
函数计算的国内外发展现状。2014年AWS推出Lambda云服务,提出了以函数计算为核心的Serverless架构。随后各个云计算提供商纷纷推出函数计算云服务,谷歌推出Google Cloud Functions,微软推出Azure Function,IBM推出了IBM Cloud Functions并开源了Apache OpenWhisk,2017年4月,阿里云推出Function Compute,腾讯云推出无服务器云函数。函数计算2017年成为当年增长最快的云服务。业界认为,使用函数计算,云的费用可减少10%至90%。自2009年加州大学伯克利分校预测的当时云计算所面临的挑战将会被逐一解决,云计算将会繁荣起来[21],如今已一一实现。2019年2月,伯克利再次发表论文预测Serverless将成为下一代云服务的主流形态[22]。
函数计算服务的原理抽象出来,一般包含事件源、函数计算以及定义与管理事件源如何触发函数计算的规则。开发者编写函数代码上传至函数计算,以及配置好函数触发规则。如图1.2所示,当事件源有事件发生时,便会按照配置好的函数触发规则自动触发函数,函数计算会根据业务运行的波峰波谷情况,自动进行弹性伸缩。触发规则管理根据事件源类型或各个云厂商的规定放在函数计算或放在事件源内。每个云计算提供商的函数计算都有会规定允许触发函数计算的事件源/触发器。事件源一般支持网络与内容分发、存储、数据分析与定时事件,有些云厂商支持的事件源覆盖IoT、数据库、机器学习、消息队列等集成服务,并支持用户自定义事件源。
图 1.2 函数计算原理示意图
函数计算的特点优点。当前云计算的抽象粒度大多在机器级别,函数计算则将计算服务的抽象粒度细化到了函数级别,以事件驱动的方式触发应用响应用户请求。以企业计划采购服务器开发一款短视频社交应用为例,那么需要考虑很多的问题,例如如何构建和运维一套弹性的稳定的视频处理后端服务;需要采购多少台服务器;服务器采用什么规格;如何配置网络和操作系统;如何部署环境;如何负载均衡;如何动态伸缩;如何升级配置;如何应对服务器宕机;如何应对用户请求峰值;如何应对系统监控报警……。而使用函数计算,无需考虑这些问题,用户构建应用和服务十分快速和便捷。使用函数计算,无需采购和管理底层的基础设施,运维成本低;只需要将代码部署到函数计算,并以事件驱动的方式触发函数执行,服务就可以平稳运行。此外,函数计算的主要优点是当负载突然增加时,能够快速地弹性伸缩应对峰值压力。用户无需再为环境部署、服务器扩容、服务器宕机等问题烦恼。函数计算采用按量付费的业务模型,尤其适合明显有波峰波谷的情形。此外,函数计算应辅助提供日志查询、性能监控和告警等功能,帮助开发者快速定位问题、排查故障。借助函数计算构建的应用,符合无服务器概念的应用设计模式。2019年是Serverless云原生的普及元年,双十一表明,无服务器应用架构是禁得起流量洪流考验的。
函数计算适合的应用场景。适合使用函数计算的业务与应用都可以通过函数计算较好地解决成本、效率、联通问题,这些业务与应用一般具有以下特点:第一,业务具有波峰波谷变化。第二,业务运行具有事件触发特征。第三,应用需要关联多种云服务。第四,应用数据更新大,一台服务器的处理能力已不能满足,开发者需要考虑如何配置负载均衡来应对处理请求。第五,应用版本迭代速度快,业务开发、部署、升级、扩容要求高。第六,一些低频的、维护性的后台任务等。根据上述应用特点分析,适合函数计算的典型应用场景主要有四大类:第一,事件触发类场景,例如定制图片,定制事件,IoT中的低频请求,音频转换文字处理,自动程序消息传递,基于定时器处理/定时器任务,日志处理,SaaS事件处理,批量任务。第二,流量突发类场景,例如弹性扩展应对突发流量,转码和流量扩容,多媒体(视频、图片等)数据备份,图片上传、裁剪、分享等。处理大数据类场景,例如数据驱动后续分发,实时文件处理,实时数据流处理,数据库数据提取、转换、加载。第四,后端类场景,例如Web应用程序、IoT后端、移动后端、人工触发。
Nomad运行时的背景与现状
Nomad是一个轻量级的工作负载编排工具,提供了多集群管理、应用部署、弹性伸缩等基础功能。Nomad支持包括非容器的不同的任务负载类型,具体通过驱动的概念接入运行时。根据欧洲电信标准化项目SuperFluidity交付成果D5[23]中,涉及早期Nomad的NFVM功能与OpenStack和OpenVIM的比较,相对于两者,在实例化方面具有显著的低时延优势。
在v0.9版本前,Nomad支持的运行时有Docker、LXC、裸进程Exec、Rkt等运行时,此时的运行时方案有如下缺陷:
l 功能特性:有相同的运行时生命周期,部分运行时功能相近,差异化较小,实现的接口很少。不支持可插拔的运行时驱动。
l 代码管理:对接不同运行时的驱动代码均存放在主仓库中,运行时本身的代码更新会相互影响,运行时类型的增多,导致管理和维护复杂。
l 支持更多运行时:社区开放的需要,以及各类业务场景下包括容器或非容器化的工作负载类型的支持的需求。每次新增一个运行时驱动都需要重新编译。这类需求会导致代码仓库代码过多,应当分离出来,由第三方独立支持和维护。
为了解决这些问题,Nomad社区在v0.9版本进行了代码重构,设计了一套基于C/S架构的插件化机制,包括运行时驱动插件化、硬件设备插件化,便捷和规范化第三方运行时的接入。可以动态注册运行时驱动而无须重新编译Nomad二进制文件。部分常用运行时驱动插件内置化,做到开箱即用。不同的工作负载类型可以基于同一套标准的运行时驱动接口实现任务相关的运行时驱动进行对接,该接口使用Protocol Buffer,基于gRPC。运行时驱动接口使得第三方运行时分离出来,作为一个独立的项目,独立于Nomad进行开发和发布。这套接口也使得社区生态变得更加开放。
在本文研究进行之初,正值v0.9刚刚发布,社区中基于运行时驱动接口的项目仅有官方主仓库分离的LXC。后来社区生态中支持的驱动陆续出现了Singularity、Jails、Pot、Firecracker等。
由上可知,Nomad运行时的支持种类仍有待丰富,缺少虚拟机运行时和函数运行时,不能满足一些边缘计算场景的需要。运行时驱动接口是工作负载类型接入的方式之一,本文中的Libvirt虚拟机运行时便是基于该运行时驱动接口实现。基于Nomad的边缘计算平台作为PaaS平台层,在其上支持函数运行时,函数工作负载是构建并运行在容器里的,同时函数运行时相关的组件可以通过容器运行,尽量减少大幅修改代码的侵入性。