软件部署使开发商和开发人员常常需要花费大量的时间来管理和维护服务器基础设施,并且还需要关注应用程序所需的操作系统和配置信息等。软件部署的发展可以划分为四个时期:裸金属时期、虚拟机时期、容器化时期、Serverless时期(无服务器时期)。
1)裸金属时期。此时期的系统管理员要为部署的软件准备物理服务器,这涉及安装操作系统和相关的设备驱动程序、确保有足够的内存/磁盘/处理器可用,还要负责硬件升级等。物理硬件和部署的软件之间存在强烈耦合,相互依赖性很强。在这里,部署单元是一个实际的服务器。
2)虚拟机时期。此时期的物理服务器上托管多个虚拟机,开发人员无须直接部署到给定的硬件,而是提供给一个虚拟机(Virtual Machine, VM)。这给升级和迁移带来了很大的灵活性,使得部署更加可重复和灵活,而此时软件与硬件开始分离。如果出现硬件故障,系统管理员可以将虚拟机迁移到其他硬件并避免出现问题。在这里,部署单元是虚拟机。
3)容器化时期。这个时期诞生了许多容器化技术,如Docker、OpenVZ、LXC、FreeBSD Jail和Solaris zones等。这些技术使系统管理员能够“分割”操作系统,在同一系统上运行不同的应用程序,而不会相互干扰。它们还可以让开发人员拥有与生产环境紧密匹配的轻量级环境,从而使不同环境之间的操作更加一致。此外,此时期还开发了许多工具来简化容器的创建和维护,许多公司使用它们来加快开发和部署的节奏。在这里,部署单元是一个容器。
4)Serverless时期。开发人员不需要考虑服务器,只需要专注自己的业务逻辑。一切服务器的配置均交给平台执行。业务执行是按需收费的,这让计算资源从固定成本变为了可变成本。这对于那些流量波动大的业务来说很有吸引力。
从软件部署层面看,在这几个时期,都有软件在“他处”执行的概念,无论是在本地物理服务器上,还是在云主机的虚拟机上或者是容器上。此外,无服务器从另一个方面给出了一个抽象层次:代码本身。有了这种新的抽象层次,就不必担心代码托管在“哪里”。图1—1所示是软件部署发展历史的一个缩略图。
图1—1 软件部署发展历史
Serverless又称无服务器计算,它允许开发人员构建应用程序,而无须管理基础设施,描述了一个更细粒度的部署模型,当应用程序被上传到平台后,系统会根据所需要的资源进行执行、扩展和计费。无服务器计算并不意味着不需要服务器来托管和运行代码,也不意味着不再需要运维工程师,而是指不需要花费时间去维护服务器的配置、更新、扩展及下线等相关操作。这样,开发人员就可以专注于编写应用逻辑,运维工程师可以专注于提升关键业务。这种方式解放了团队,使他们能够集中精力加速创新。Serverless因简单性和成本效应,已经从前沿技术发展成为主流技术。
Serverless平台包含FaaS和BaaS的一部分或两部分。
1)功能即服务(FaaS):通常提供事件驱动计算。开发人员使用函数运行和管理应用程序代码,由事件或HTTP请求触发。开发人员编写并部署FaaS函数代码。FaaS函数代码的执行和伸缩由无服务器平台管理,开发人员无须管理服务器或任何其他底层基础架构。
2)后端即服务(BaaS):一种云服务模型。在该模型中,开发人员将Web或移动应用程序的所有幕后工作外包,只需要编写和维护前端即可。BaaS供应商为发生在服务器上的活动提供预先编写的软件,例如用户身份验证、数据库管理、远程更新和推送通知(用于移动应用程序),以及云存储和托管。
BaaS和Serverless有一些重叠也有一些区别,这就是上面说Serverless平台包含FaaS、BaaS的一部分或两部分的真正含义。
Serverless有两个主要角色。
1)开发人员:为Serverless平台编写代码并从中获益。Serverless平台提供了没有服务器而代码始终在运行的视角。
2)平台提供商:为外部或内部客户部署Serverless平台。
1.Serverless的优点
1)降低服务器成本:Serverless改变了原来固定服务器成本的计费方式,它采取按需收费模式,只有在真正使用服务器时才进行收费。没有服务器硬件,不需要监控,维护和人工成本相对较低,这些方面都由平台方进行保证,简化了操作。
2)提高生产力:Serverless没有维护硬件及监控等要求,因此开发人员可以把精力聚焦在编码上,从而开发出更好的应用程序;而且开发人员有更多的时间从事其他项目,以锻炼提升自己的技能,从而能更好地服务于工作。
3)具有灵活的可扩展性:Serverless平台具有资源“无限”属性,资源会随着业务流量扩大或缩减而进行相应的扩缩容。
2.Serverless的缺点
1)冷启动:在Serverless中,函数不会一直持续运行,在设置规定的事件内没有请求或资源消耗时,函数关闭。所以当请求再次或首次到达时,需要启动休眠的函数代码再进行处理,这可能会导致延时。尤其对于时延敏感的业务,这会成为一个致命缺点。再有就是第三方供应商会限制资源,这意味着Serverless不太适合高性能计算的操作。
2)安全问题:计费安全问题。开发人员为使用方便,经常将一些函数的API(应用程序接口)公开,这样会导致一些API非正常调用从而获取用户数据。一些黑客会利用DDoS攻击恶意调用函数,引发巨大经济损失。如果开发人员引入的第三方依赖库存在安全漏洞,黑客有可能会利用漏洞攻击系统。
3)配套工具不成熟:用于测试、调试和部署的可用工具不成熟,这是进入无服务器领域的一大障碍。工具短缺是Serverless的一个核心问题,尤其是测试工具和开发人员用于本地调试的IDE(集成开发环境)工具短缺。
对于上面的这些问题,业界在积极探索相关的解决方案,如对于冷启动问题可以采取温启动或者WebAssembly,甚至常驻函数的方式解决。
2021年,云原生计算基金会(Cloud Native Computing Foundation, CNCF)发布的调查报告表明,39%的受访者正在使用Serverless,其中75%的用户采用托管平台,比2020年增长了24%。2021年,DataDog发布的Serverless研究报告表明,从云原生初创公司到大型企业都在关注Serverless,Serverless生态已经超越了FaaS,包含数十种服务,可以帮助开发人员构建更快、更动态的应用程序。
亚马逊Serverless服务平台Lambda是目前较成熟和使用较广泛的Serverless产品,50%以上的亚马逊用户使用了Lambda。微软Serverless解决方案Azure Functions的使用率增长到36%。而谷歌Serverless解决方案Google Cloud Functions也有近25%的用户在使用。
各大厂商(如亚马逊、微软、谷歌、阿里、华为、腾讯)和开源社区都部署了自己的Serverless解决方案,但是目前Serverless还没有一个统一的标准,因此应用之间会比较难迁移。阿里云函数计算(Aliyun Function Compute)、腾讯Serverless云函数(Tencent Serverless Cloud Function, SCF)、华为云函数工作流(Huawei Cloud FunctionGraph)是国内几个商用的Serverless产品。
在开源Serverless解决方案中,Nuclio算是使用比较早的,它于2017年就开始使用了,后来陆续产生了很多优秀的开源解决方案,例如Openfass、Knative、OpenWhisk、Kubeless、Fn、Fission等。
虽然目前Serverless已经被广泛应用,但它仍然是一个比较新的技术,也有其局限性。一般来说Serverless比较适用于以下场景。
1)异步并发,服务组件可独立部署和扩展,尤其是无状态服务应用。
2)需要应对突发或服务器的使用量不可预测的业务。主要是为了节约成本,因为Serverless应用在不运行时不收费。
3)短暂、批处理、周期等服务应用,且对冷启动时间不敏感的业务。
4)需要快速开发迭代的业务。因为无须提前申请资源,因此可以加快业务上线速度。
CNCF Serverless白皮书提出以下Serverless适用场景如下:
1)Web应用程序后端。
2)移动应用程序后端。
3)物联网(IoT)后端。
4)实时文件数据处理。
5)实时流式处理。
6)计划定时任务的自动化。
7)扩展SaaS应用程序。
8)持续集成管道。
9)业务逻辑,如支付、订单、股票交易等。
10)聊天机器人。