使用 OpenFunction 在任何基础设施上运行 Serverless 工作负载

news2025/2/25 15:59:57

作者:

霍秉杰:KubeSphere 可观测性、边缘计算和 Serverless 团队负责人,Fluent Operator 和 OpenFunction 项目的创始人,还是多个可观测性开源项目包括 Kube-Events、Notification Manager 等的作者,热爱云原生技术,并贡献过 Keda、Prometheus Operator、Thanos、Loki 和 Falco 等知名开源项目。

王翼飞:青云科技资深软件工程师,负责开发和维护 OpenFunction 项目。专注于 Serverless 领域的研发,对 Knative、Dapr、Keda 等开源项目有深入的了解和实践经验。

来源:2023 上海 KubeCon 分享,公众号后台回复关键词 KubeCon-2023 即可获取 PPT 下载链接。

前言

本文主要包括以下几个部分:

  • 构建开源 FaaS 平台的必要性与可⾏性
  • OpenFunction 简介
  • 冷启动优化:Dapr proxy 模式及 Wasm ⽀持
  • OpenFunction 在⾃动驾驶领域的应⽤
  • 社区、路线图与 Demo

构建开源 FaaS 平台的必要性

什么是 Serverless?加州大学伯克利分校在论文 《A Berkeley View on Serverless Computing》给出了明确定义:Serverless computing = FaaS + BaaS。

对于函数计算平台,函数是不可或缺的,即 FaaS 是主体。同时,FaaS 也需要和后端的 BaaS 服务产生联系,所以丰富的后端服务是函数的重要依托。

云厂商通常提供托管的函数计算(FaaS)和各类后端中间件服务,这样就会把开发者锁定在自己的云平台之上。

现阶段我们也看到,有一些公司因为云上的成本过高,想要下云或者从一个云迁移到另一个云也就是跨云迁移。如果其函数绑定在云的 BaaS 服务上,则不利于跨云的迁移。所以,跨云迁移之后如何去处理各个云厂商 BaaS 服务接口的差异,成了目前较大的挑战。

从另一个角度看,一个 FaaS 平台通常需要支持多种语言,也会利用到众多后端服务。举例来讲,5 种语言需要和 10 种后端服务对接,那么这样做就会有 5×10 即 50 种实现, 还是比较复杂的。

构建开源 FaaS 平台的可行性

如何解决上述问题呢?我们可以引入 Dapr 来简化函数与众多后端服务的交互。

Dapr 是一个分布式应用的运行时,能够把分布式应用的能力抽象成一个个 Building Block。

举几个例子来讲,一般的分布式应用程序都有 service 之间的相互调用,所以会有一个 service 的 Building Block;通常也会有 publish、subscribe 这样的模式,所以也会有一个 publish and subscribe 的 Building Block;此外还会有一些输入输出,所以有一个 Binding Building Block;当然还有其他的,可参考上图。

这些 Building Block 会由一系列的 components 支撑,比如 PubSub Brokers 可以支持各种云上的 MQ、AWS sqs 或者一些开源的中间件如 Redis、Kafka;Bindings 也会支持一些云上的存储和开源组件如 Kafka、MySQL、Redis。

所以 Dapr 就能解决上文提到的问题。FaaS 平台的每一种语言,只需要和 Dapr 交互,Dapr 的 API 再和构成每一个 Building Block 的 component 交互,通过 Dapr 去处理与众多后端服务的交互,这样就把复杂度从 N × M 降为了 N × 1.

另外 Dapr 解耦了 FaaS 平台与各云厂商的 BaaS,做到了云厂商中立,解决了跨云迁移的问题。

OpenFunction 简介

OpenFunction 是什么

OpenFunction 是青云科技在 2022 年初开源的,在 2022 年 4 月成为了 CNCF 的 Sandbox 项目。

  • 云厂商中立
    • 与各个云厂商的 BaaS 服务松耦合
    • 通过 Dapr,简化了与各云厂商或开源 BaaS 服务的集成
  • 同时支持同步与异步函数
    • 同步函数基于 Kubernetes Gateway API 实现了 OpenFunction Gateway 作为函数⼊⼝
    • 异步函数可直接从事件源消费事件,并可根据事件源特有的指标自动伸缩
  • 支持直接从函数代码生成符合 OCI 标准的函数镜像
    • 基于 Cloud Native Buildpacks 实现
  • 支持 0 与 N 之间的水平自动伸缩
  • 既能运行函数,也能运行 Serverless 应用
  • 支持 Wasm Runtime
  • 更完善的 CI/CD

上图是 OpenFunction 的架构图,总体分为:Build,Function,Serving 和 Events 几个部分。

  • Function:Function 是一个主控模块,控制函数的构建和 serving,Build、Serving 和 Status 等信息也会在 Function 的 CRD 中显示。
  • Build:支持使用 Buildpacks 的方式构建函数的镜像,也支持使用 Dockerfile 的方式构建 Serverless 应用;后端技术是 Shipwright,Shipwright 可以切换构建镜像的引擎,所以可以通过 Shipwright 选择不同的镜像构建工具,最终将应用构建为容器镜像。
  • Serving : 通过 Serving CRD 将应用部署到不同的运行时中,可以选择同步运行时或异步运行时。同步运行时可以通过 Knative Serving 或者 Keda-HTTP 来支持,异步运行时通过 Dapr+Keda 来支持。同时现在也支持 WasmEdgeRuntime 来支持 Wasm 函数。
  • Events : 对于事件驱动型函数来说,需要提供事件管理的能力。由于 Knative 事件管理过于复杂,所以我们研发了一个新型事件管理驱动叫 OpenFunction Events。

OpenFunction Events

EventBus 利用 Dapr 的能力解耦了 EventBus 与底层具体 Message Broker 的绑定,你可以对接各种各样的 MQ。

OpenFunction Gateway

OpenFunction Gateway 是 OpenFunction 0.7.0 增加的新特性,是基于 Kubernetes Gateway API 来实现的。之所以选择 Kubernetes Gateway API,是因为其 CRD 和其下游实现是解耦的,用户可以选择自己喜欢的 Gateway 实现,比如 APISIX、Istio、Contour 等;另外 Kubernetes Gateway API 也提供了一些新的特性,比如 HTTP 流量的分发、跨 Namespace routing 功能。

在之前 OpenFunction 需要把流量转发到 Knative 的 Gateway,然后再路由到 Knative 的 Revision,链路比较长。有了 OpenFunction Gateway,可以直接把流量转发到 Knative 的 Revision。也就是说可以不再依赖 Knative 网络相关的组件,整个流量转发的链路也会变短。

为什么引入 OpenFunction Gateway

通过 Knative Gateway 访问同步函数需指定⼀个由随机串组成的 service url,不可预测且对⽤户不友好。

通过 OpenFunction Gateway 访问同步函数,可通过函数名及 namespace ⽣成函数访问 url。另外还可以通过 Gateway 的 Service 加上 Function 的 namespace 和 name 来进行 path-based 的访问,也可以基于 OpenFunction Gateway 的 IP 加上 Host 相关的 Headers 来进行 host-based 访问。

如果我们想在集群外部访问集群内部的 Function,我们可以在 OpenFunction Gateway 上面配置 domain 相关的字段,配置成 magic DNS,这样我们就可以直接在集群外部通过域名来访问集群内部的 Function。

冷启动优化

冷启动优化一直是 FaaS 平台的难点。

之前我们采用的是 Dapr sidecar 模式,但是会影响 Function 启动的时间。函数很小的情况下,Dapr sidecar 的 container 启动时间以及 Dapr plant 初始化所需要的时间,比 Function 启动时间更长。

我们设计了 Dapr Proxy 模式,就是让所有 Function 的 pod 共享一个 Dapr sidecar。如果我们将 Function 扩容到很大的值,副本数较多,那么 sidecar 也会造成大量的资源开销,采用这个模式将有效避免这种情况。

接下来我们还有一个基于 Pool 的冷启动优化的计划。上文中提到的 Proxy 模式,对 Function 启动时间的优化是有限的。所以我们考虑采用 Pool 的方式来优化冷启动。

引入一个预创建的 Pod Pool,在有调用请求时,可以根据请求的相关信息判断要调用哪个 Function,然后对这个 Function 的 code 热加载,将其变成针对某个 Function 的 Pod,后续的流量就可以直接进入到这个特定的 Function Pod,这个过程不需要 K8s Pod 调度创建等逻辑的参与,所以这个方式对冷启动的时间优化是非常显著的。

⽀持 WasmEdge 作为 Wasm 运⾏时

在 OpenFunction 1.0.0 中,我们支持 WasmEdge 作为 Wasm 运行时。WebAssembly 作为 FaaS 平台运行时,具有很多优势,比如启动时间短、镜像体积小、安全性比较高。另外 WasmEdge 对 HTTP 支持也比较好。

但是目前 Wasm Function 访问后端服务有一个问题,因为 WebAssembly 程序访问 API 是受限的,所以也需要通过 Dapr 提供相对统一的方式来完成对后端服务的访问。

目前 Dapr、Rust、SDK 以及 Dapr WasmEdge 等相关的项目,还不够成熟,所以我们暂时还没有集成。后续相关生态成熟之后,再进行集成。

OpenFunction 在⾃动驾驶领域的应⽤

下面介绍一个将 OpenFunction 用在自动驾驶领域的案例,来自 OpenFunction 的社区用户——驭势科技。

简单来讲,自动驾驶就是车端会上传很多传感器的数据到云端,云端再对这些数据进行处理。

上图是云端的架构图。举例来说,车端的 MQTT Broker 将云端的数据传到云端的 MQ 上,运维人员会创建多种异步函数和同步函数来处理这些数据。MQTT topic 的数据会由一个函数处理,其他数据由另外一个函数处理,处理完的数据分别存到了不同的后端服务里,因为业务比较多,所以可能是不同的团队去去实现的,那么就需要用不同的语言去实现。

异步:消息队列实时数据 → Prometheus 指标

驭势科技还有一个比较高阶的使用例子。

车端上传 MQTT 的数据,通过异步函数从 MQTT 的数据提取出 Metrics,再将其发送到 Prometheus 的 Pushgateway,这种方式相当于将车端的数据变成了 Metrics 再存储下来。

为什么⾃动驾驶需要云⼚商中⽴的 Serverless 平台?

  • 对于云商中立的需求
    • 不同的客户要求部署到不同的云厂商
    • 一些客户的车端数据比较敏感,要求放到和公有云隔离的环境
    • 不同的云⼚商有不同的后端服务,如果没有⼀个云⼚商中⽴的云平台,对于同⼀处理逻辑则需要为对接的每⼀个云⼚商都实现相似的服务
  • 对于 Serverless 的需求
    • 数据处理逻辑多样同时经常变化,来⾃同⼀数据源的数据在不同场景下的处理逻辑不尽相同
    • ⾃动驾驶涉及的模块较多,不同的模块由不同的团队负责,需要多语⾔⽀持
    • ⼤量⻋端数据需要实时处理;⾃动驾驶⻋辆也有潮汐的特性,数据处理需求有⾼峰和低⾕

社区、路线图与 Demo

OpenFunction 路线图

  • 函数框架
    • ⽀持 Dapr State Management 与 Dapr Workflow
    • ⽀持更多语⾔的异步函数框架包括 Python、Rust
    • ⽀持将 Java 函数编译成 Native 程序运⾏在 Quarkus 环境中
  • 函数运行时
    • 实现 Serverless ⼯作流(Workflow)
    • 预研基于 Pod Pool 的冷启动优化⽅案
    • ⽀持 OpenTelemetry 作为另⼀个函数追踪⽅案
  • 用户工具
    • 增加 OpenFunction 控制台
  • 与 AIGC 结合

早起贡献及应用者

  • 越来越多的社区贡献者
    • 主要 Maintainer 来⾃ KubeSphere 团队
    • SkyWalking PMC 成员 @arugal 实现了 SkyWalking 和 OpenFunction Go Functions Framework 的集成
    • 驭势科技 (UISEE) @webup @kehuili 以及印度的贡献者正在参与 Node.js 和 Python Functions Framework 的开发
    • SAP @lizzze 参与 functions-framework-go 的开发
    • 来⾃阿⾥云 、微众银⾏等社区贡献者也在积极参与
    • 乌克兰的贡献者在帮忙维护 openfunction.dev
  • 越来越多的公司开始采用
    • 国内某电信公司采用 OpenFunction 构建云函数计算平台
    • 驭势科技(UISEE)采用 OpenFunction 处理车云数据
    • 微众银行
    • 某证券公司
    • 喜马拉雅
    • 云学堂

参与 OpenFunction 社区

欢迎各位小伙伴参与社区!

  • OpenFunction: https://github.com/OpenFunction/OpenFunction
  • Website: https://openfunction.dev/
  • Samples: https://github.com/OpenFunction/samples

附录:函数示例

同步函数触发异步函数示例

  • 同步函数:https://github.com/OpenFunction/samples/tree/main/functions/knative/with-output-binding

  • 异步函数:https://github.com/OpenFunction/samples/tree/main/functions/async/bindings/kafka-input

更多函数示例

  • Keda HTTP Engine: https://github.com/OpenFunction/OpenFunction/blob/main/config/samples/function-kedahttp-sample-serving.yaml

  • Wasm 函数: https://github.com/OpenFunction/samples/tree/main/functions/knative/wasmedge/http-server

  • Redis state store:

    • https://github.com/OpenFunction/java-samples/blob/main/src/main/resources/functions/redis-state-store.yaml
    • https://github.com/OpenFunction/java-samples/blob/main/src/main/java/dev/openfunction/samples/StateStore.java
  • Serverless Applications:

    • with a Dockerfile: https://github.com/OpenFunction/samples/tree/main/apps/buildah/go
    • without a Dockerfile: https://github.com/OpenFunction/samples/tree/main/apps/buildpacks/java

本文由博客一文多发平台 OpenWrite 发布!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1278834.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32F407-14.3.8-01强制输出模式

强制输出模式 在输出模式(TIMx_CCMRx 寄存器中的 CCxS② 位 00)下,可直接由软件将每个输出比较信号(OCxREF④ 和 OCx⑥/OCxN⑦)强制设置为有效电平或无效电平,而无需考虑输出比较寄存器和计数器之间的任何…

springboot 整合 Spring Security 上篇

1.创建springBoot 项目工程(spring6.0的底层、JDK17) 1.添加依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency>配置完成启动访问controller会出现登录…

JS 实现一键复制文本内容

1、演示&#xff1a; 2、代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>一键复制</title&g…

如何用Java实现扑克牌(附源码)

目录 一.扑克牌的数据结构 二.买牌(扑克牌的初始化) 三.洗牌 四.发牌 五.完整代码 Card.java CardList.java 六.测试 输出结果 一.扑克牌的数据结构 首先&#xff0c;扑克牌是一幅一幅的&#xff0c;除去大小王以外一共有52张&#xff0c;我们可以考虑用数组来存储…

常用装备生产ERP有哪几种?有哪些作用

装备生产业务涉及原材料采购、车间排产、班组生产评估、派工单、接单报价、委外发料、库存盘点、设备台账、图纸设计等诸多环节&#xff0c;而各环节数据的共享问题普遍存在于装备生产企业内部&#xff0c;同时也直接影响企业的生产效率和整体效益等。 企业外部环境的变化和行…

linux安装KingbaseES(人大金仓数据库)

KingbaseES V8 数据库简介 金仓数据库管理系统[简称:KingbaseES]是北京人大金仓信息技术股份有限公司[简称人大金仓]的核心产品&#xff0c;具有大型通用、"三高"&#xff08;高可靠、高性能、高安全&#xff09;、"三易"&#xff08;易管理、易使用、易扩…

记录华为云服务器(Linux 可视化 宝塔面板)-- 防火墙篇

文章目录 前言安装防火墙防火墙设置防火墙操作1.设置开机启动防火墙2.查看防火墙开放哪些端口3.重载防火墙配置&#xff08;修改配置后重新启动才生效&#xff09;4.查看防火墙状态5.开启防火墙6.关闭防火墙 若遇到无法开启查询已开放的端口查询端口是否开放&#xff08;80&…

springBoot整合task

springBoot整合task 文章目录 springBoot整合task开开关设置任务&#xff0c;并设置执行周期定时任务的相关配置 开开关 设置任务&#xff0c;并设置执行周期 Component public class MyBean {Scheduled(cron "0/1 * * * * ?")public void print(){System.out.prin…

TCP连接为什么是三次握手,而不是两次和四次

答案 阻止重复的历史连接同步初始序列号避免资源浪费 原因 阻止重复的历史连接&#xff08;首要原因&#xff09; 考虑这样一种情况&#xff1a; 客户端现在要给服务端建立连接&#xff0c;向服务端发送了一个SYN报文段&#xff08;第一次握手&#xff09;&#xff0c;以表示请…

Oracle(2-10) User-Managed Backups

文章目录 一、基础知识1、Terminology 术语2、User-Managed Backup/Recovery 用户管理的备份/恢复3、Get DB File Information 获取数据库文件信息4、Consistent Whole DB Backup 一致的整个数据库备份冷备份热备份 二、基础操作1、查找需要备份的各种文件2、整备操作冷备份热备…

【Element-ui】Link 文字链接 与 Radio 单选框

文章目录 前言一、Link 文字链接1.1 基础用法1.2 禁用状态1.3 下划线1.4 图标 二、Radio 单选框2.1 基础用法2.2 禁用状态2.3 单选框组2.4 按钮样式2.5 带有边框2.6 Radio Eventsinput事件 2.7 Radio-group Attributes 总结 前言 在前端开发中&#xff0c;用户界面的元素设计和…

Certum SSL证书

为了确保在线交易的安全性&#xff0c;以及保护敏感信息免受网络威胁&#xff0c;使用SSL&#xff08;Secure Socket Layer&#xff09;证书成为了必要选择。其中&#xff0c;波兰认证机构Certum提供的SSL证书以其高度的安全性和可信赖性&#xff0c;得到了全球用户的广泛认可。…

基于运算放大器的电压采集电路

一、运算放大器 运放推导的两个重要概念&#xff1a;虚短、虚断。 1、差分放大器 以差分放大器为例进行推导分析。 虚断–运放的"-“端、”“端的引脚电流接近为0&#xff1b; 根据基尔霍夫电流定律可知&#xff1a;iR1iRF&#xff0c;iR2iR3&#xff1b; iR1(Ui1-(V-…

二分查找边界问题——排序数组找元素第一次出现和最后一次出现

二分查找的边界逼近问题&#xff1a; 下面的代码&#xff0c;第一个函数会向左边界逼近&#xff0c;第二个函数会像右边界逼近&#xff01; 考虑left5,right6这种情况&#xff0c;如果5&#xff0c;6的值都是满足的条件的怎么办&#xff1f; 如果mid(leftright1)/2&#xff0c;…

Qt将打印信息输出到文件

将打印信息&#xff08;qDebug、qInfo、qWarning、qCritial等&#xff09;输出到指定文件来以实现简单的日志功能。 #include "mainwindow.h" #include <QApplication> #include <QLoggingCategory> #include <QMutex> #include <QDateTime>…

面试数据库八股文十问十答第二期

面试数据库八股文十问十答第二期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1.MySQL的主从复制 MySQL的主从复制是什么&#xff1f;MySQL主从复制是一种常见的…

Hdoop学习笔记(HDP)-Part.09 安装OpenLDAP

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

Java语法之字符串类型

String类 在Java中&#xff0c;使用String类定义字符串类型&#xff0c;如下&#xff1a; String s1"hello";System.out.println(s1); 字符串拼接 只要s1s2即可 在字符串中&#xff0c;如果俩个字符串进行相加&#xff0c;那他就是字符串拼接的意思 补充 如上&am…

Leetcode—704.二分查找【简单】

2023每日刷题&#xff08;四十七&#xff09; Leetcode—704.二分查找 实现代码 int lower_bound(int* arr, int numsSize, int tar) {int left 0, right numsSize;int mid left (right - left) / 2;while(left < right) {mid left (right - left) / 2;if(arr[mid] …

网页开发 JS基础

目录 JS概述 基本语法 数据类型内置方法 DOM对象 查找标签 绑定事件 操作标签 jQuery 查找标签 绑定事件 操作标签 Ajax请求 数据接口 前后端分离 ajax的使用 JS概述 一门弱类型的编程语言,属于基于对象和基于原型的脚本语言. 1 直接编写<script>console…