本文介绍: 构建开源 FaaS 平台的必要性与可⾏性OpenFunction 简介冷启动优化:Dapr proxy 模式及 Wasm ⽀持OpenFunction 在⾃动驾驶领域的应⽤社区路线图与 DemoOpenFunction 是青云科技在 2022 年初开源的,在 2022 年 4 月成为了 CNCF 的 Sandbox 项目。云厂商中立与各个厂商的 BaaS 服务耦合通过 Dapr简化了与各云厂商开源 BaaS 服务集成同时支持同步异步函数

作者

霍秉杰: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 平台的必要性

什么是 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;通常也会有 publishsubscribe 这样的模式,所以也会有一个 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 Blockcomponent 交互,通过 Dapr 去处理与众多后端服务的交互,这样就把复杂度从 N × M 降为了 N × 1.

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

OpenFunction 简介

OpenFunction什么

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

图是 OpenFunction架构图,总体分为:Build,Function,Serving 和 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 的 namespacename 来进行 pathbased访问,也可以基于 OpenFunction Gateway 的 IP 加上 Host 相关的 Headers 来进行 hostbased 访问。

如果我们想在集群外部访问集群内部的 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 平台?

社区路线图与 Demo

OpenFunction 路线

早起贡献及应用

参与 OpenFunction 社区

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

附录:函数示例

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

更多函数示例

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

原文地址:https://blog.csdn.net/zpf17671624050/article/details/134757945

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_48032.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注