基于OpenFaaS的无服务器工作流系统设计
2024-07-03甘凌霄
甘凌霄
摘要:无服务器计算以低成本和高灵活性的云计算模式吸引了大量用户,越来越多的无服务器应用程序开发人员倾向于将复杂的应用程序解耦为松耦合函数的工作流。目前,受厂商锁定的限制,无服务器工作流框架存在扩展性不强以及不同平台之间函数应用迁移成本高的问题。文章从减少应用迁移成本和提高系统扩展性角度出发,提出了一个基于OpenFaaS的无服务器工作流系统,旨在方便地扩展不同平台的无服务器计算框架,实现同时使用不同平台无服务器函数的功能。
关键词:无服务器计算;工作流;OpenFaaS
中图分类号:TP311文献标志码:A
0 引言
随着技术的快速发展,云计算已成为一种信息技术领域的变革范式,彻底改变了计算资源的供应、管理和利用方式。随着云计算的发展,细粒度更高和资源更高效的无服务器计算(Serverless Computing)模型已逐渐成为支撑未来信息化系统的云计算范式[1]。这些无服务器计算平台具有可伸缩资源、弹性操作和按量计费的优点,因此出现了大量用户向无服务器计算的转移,特别是对于机器学习[2]、物联网[3]、大数据等场景的应用程序[4]。为了表达这些应用程序复杂的任务执行逻辑,一般将这些松耦合函数以无服务器工作流(Serverless Work-flow)的形式进行组织和部署[5]。
目前,无服务器工作流框架存在厂商锁定、扩展性不强、迁移成本高的问题。不管是主流无服务器计算平台提供商还是开源无服务器计算框架,都有一套自己的实现方式和架构,在任意一个无服务器计算平台上构建函数可能意味着很难迁移到另一个平台,因为代码可能需要重新编写,并且存在于一个平台上的应用程序编程接口(Application Programming Interface,API)可能不存在于另一个平台上,必须投入额外的人力和资金进行迁移。目前,已知的无服务器工作流系统必须深度绑定某个无服务器计算框架,比如阿里云Server-less工作流必须绑定其函数计算FC,因此,当用户使用新系统时,需要重新学习一套云厂商自己的软件开发工具包(Software Development Kit,SDK)。由于未开放扩展,这些平台不能根据场景灵活地测试和调整工作流应用。
为了减少迁移成本并且高效地执行工作流任务,本文设计了一个可自定义规则且可扩展的无服务器工作流系统,以实现不同平台函数之间的调用。
1 关键技术
1.1 OpenFaaS框架
OpenFaaS是一款无服务器计算框架,为用户提供无服务器计算平台。OpenFaaS使用Docker容器简化无服务器计算函数,使开发人员能够轻松地将事件驱动函数和微服务部署在私有或公共云环境中。OpenFaaS整体架构如图1所示,其通过Gateway组件对外提供HTTP服务,当函数调用请求到来时,Gateway验证后将相应的操作转发给faas-provider,faas-provider实现了从镜像仓库拉取函数镜像以及对函数的管理等功能。同时,框架里集成了Prometheus及AlertManager等服务用于实现自动扩缩容功能,使用NATSStreaming实现函数异步调用。相较于其他开源的无服务器计算框架,OpenFaaS具有轻量和便于扩展的优点,能够在公有云或私有云中快速搭建无服务器平台。因此,本文使用OpenFaaS作为基础的无服务器计算平台。
1.2 Otto解析器
Otto是JavaScript解析器和解释器,本文使用Otto作为工作流中函数之间参数的解析引擎。无服务器工作流执行链上前后相连的函数一般都有输入、输出依赖,即后一个函数的输入依赖前一个函数的输出。在大多数情况下,前一个函数的所有输出都作为后一个函数的输入数据,但也存在后一个函数只取前一个函数输出数据里面某个字段或者需要对输出数据的某个字段进行判断的情况,比如执行分支判断操作。因此,工作流系统需要实现输入输出解析功能,通过Otto解释器,系统可以将整个工作流数据作为一个JavaScript对象,结合JsonPath取出对象中的数据,再进一步计算表达式。
2 系统设计
工作流系统采用了B/S架构,整体系统部署在Kubernets集群上,同时,也提供了用户界面用于交互。工作流系统架构如图2所示,主要由函数运行模块、工作流管理模块、资源监控模块、调度模块组成。其中,用户主要在控制台界面通过可视化操作发送请求给工作流系统的工作流管理模块。工作流管理模块主要包括创建和执行工作流,当执行工作流后,命令会发送到调度模块,调度模块会按照工作流任务定义来执行工作流任务。资源监控模块一直监控无服务器计算平台,记录每一次工作流中函数执行的资源消耗和时延等数据。
2.1 工作流任务定义
本无服务器工作流系统使用YAML作为工作流的定义语言来对任务进行编排。YAML有着简洁、可读性强、数据类型丰富以及支持注释等优点。在正式的工作流定义中,具体字段及描述如表1所示。
其中,函数集合包含若干个函数对象,其字段及描述如表2所示。函数名称并未记录在表中,这是因为此时函数名称作为对象中的键而存在。
在本文实现的工作流系统中,可通过上述工作流和函数字段来编写工作流任务的YAML定义,工作流系统会将输入的工作流定义解析并转化为系统内部的结构体进行存储。
2.2 函数运行模块
本文对OpenFaaS进行了二次开发,主要包括修改了函数实例扩缩容的限制以及添加了更多数据指标。OpenFaaS由于社区版功能性不足,不能将函数实例缩为0,且扩缩容指标单一,仅通过Prometheus获取每个函数的调用次数进行扩缩容。因此,在此基础上,本文修改了其中的faas-provider组件,添加了可以将函数实例缩为0的功能。同时,增加了函数冷启动时延、函数当前正在处理的请求、函数请求总数、函数CPU使用量、函数内存使用量的指标,如表3所示。
此外,本文在OpenFaaS函数使用的Watchdog上进行了功能增强,利用cgroups获取每一次函数执行时的CPU和内存使用量。cgroups是Linux内核的一种资源隔离技术,用来限制、控制与分离一个进程组的资源如CPU、内存等。Kubernets使用cgroups来管理Pod和容器使用的资源,其中cgroups主要子系统和作用如表4所示。由于当Kubernets动态修改函数Pod的资源配额时,需要重启函数Pod让配置生效,这导致在调度过程中不能灵活地对资源进行调整。本文通过获取cpuacct子系统的cpuacct.usage和memory子系统的memory.usage__in__bytes数据来获取当前函数执行所消耗的CPU和内存资源量,通过修改CPU子系统里的cpu.cfs__quota__us和memory子系统里的memory.limit_in__bytes来限制CPU和内存使用量。
2.3 工作流管理模块
工作流管理模块主要包括对工作流的创建、删除、修改、查询、验证、调用等操作。这里主要介绍工作流调用过程中涉及的任务运行时和任务输入输出解析功能。
本工作流系统默认的任务执行是调用OpenFaaS函数,这是工作流系统中的一个任务运行时。除了OpenFaaS运行时,还实现了一些内置工作流任务运行时,这些运行时可以极大地方便定义各种复杂的应用程序逻辑,包括循环、分支等,具体内容如下。
(1)openfaas:用于执行OpenFaas函数。
(2)http:用于执行HTTP请求,函数定义中的run字段设置为HTTP的链接地址。
(3)condition:用于执行条件分支语句,可包含多个分支,无条件使用默认值。
(4)parallel:用于执行并行语句。只有所有函数并行执行结束,整个语句才会结束。
(5)foreach:用于执行循环语句。只有所有函数并行执行结束,整个语句才会结束。
(6)sleep:用于任务休眠操作。
(7)print:用于直接打印数据。
(8)compose:用于将多条数据合并为一条数据。
目前,输入输出解析功能主要通过Otto实现,基本表达式如表5所示。其中,使用符号“$”作为数据域的根节点,所有数据的获取都通过以“$”为首的表达式进行操作,而函数表达式则封装了这一层,可以通过传递参数实现更加自由的数据获取形式。
通过函数运行时,本文实现的无服务器工作流不仅可以执行不同的函数任务,还可以利用其他平台的无服务器计算函数。此外,系统中内置了函数运行时接口,只要实现该接口,就可以在系统中实现和OpenFaaS函数运行时相同的功能,达到细粒度更高的控制(预热和关闭函数)。而输入输出解析功能则可以将各种数据进行解析以利于后续功能的实现,方便不同平台之间的数据传输。
2.4 调度模块
调度模块主要对当前提交的所有工作流任务进行调度,同时,调度每个任务中需要执行的函数。对于每个工作流的调用请求,调度器会将工作流中所有的函数根据依赖关系组织为有向无环图(Directed Acyclic Graph,DAG),按照函数历史资源使用数据,依次为DAG中的函数分配资源,这一步需要通过资源监控模块获取集群的资源数据从而进行决策判断,一般取调用历史的平均值,也可以通过配置文件为函数进行配置。随后,每一次调度都会重新将未执行的函数组织为DAG结构,提交运行图中根节点所代表的函数,其中根节点可以为多个,这代表函数是并行的。本文测试调用了一个工作流任务,包含3个函数(fibonacci、linpack、gzipCompression)。用户可以在控制台方便地查看每一次调用的信息。工作流执行结果如图3所示,其中,前两者为OpenFaaS函数,后者为HTTP调用,具体的执行函数实体为Knative框架里的函数,这表明工作流系统可以同时调用OpenFaaS和Knative框架的函数。
3 结语
本文设计并实现了一套简洁易用的无服务器工作流系统,对其中一些技术(如OpenFaaS框架)进行了深度定制化改进,提高了系统性能,实现了与Kubernetes生态系统的整合,确保了系统的高扩展性。本文设计的系统实现了多种函数运行时以丰富工作流的编排能力,同时,提供了接口用于扩展自定义函数,利用开源的无服务器计算框架实现了不同平台的无服务器计算框架功能。此外,工作流还配备了一个直观的可视化界面,便于用户交互。所设计的系统具有很高的实际应用价值。
参考文献
[1]车悦远.无服务器计算[J].计算机与网络,2022(1):36-37.
[2]秦伊玲.基于无服务器计算的分布式深度学习性能保证研究[D].上海:华东师范大学,2021.
[3]石丁.移动边缘计算环境下无服务器框架的研究[D].哈尔滨:哈尔滨工业大学,2021.
[4]谢栋,胡洋,秦利.大数据时代无服务器计算在科技情报服务中的应用[J].中华医学图书情报杂志,2021(7):39-45.
[5]李成志.基于无服务器计算的工作流调度系统设计与实现[D].南宁:广西大学,2022.
(编辑 沈 强编辑)
Design of serverless workflow system based on OpenFaaS
Gan Lingxiao
(Institute of Computer Science and Technology, Nanjing University of Aeronautics and Astronautics, Nanjing 210000, China)
Abstract: Serverless computing, with its low cost and high flexibility, has attracted a significant number of users, leading to an increasing number of serverless application developers favoring the decomposition of complex applications into loosely coupled function-based workflows. Currently, serverless workflow frameworks suffer from limited extensibility and high migration costs between different platforms due to vendor lock-in. This paper proposes a serverless workflow system based on OpenFaaS, aiming at reducing application migration costs and enhancing system scalability. It facilitates the extension of serverless computing frameworks across different platforms, enabling the concurrent utilization of serverless functions from various platforms.
Key words: serverless computing; workflow; OpenFaaS