Function Mesh 基于 KubeVela addon 为应用提供 Serverless 能力

什么是 Function Mesh ?

Function Mesh 是一个 Serverless 框架,专门为流处理(stream processing)应用而设计。它基于 Pulsar Functions 和 Pulsar IO Connectors 为用户的应用及复杂的流处理任务提供了强大的事件流(event-streaming)编排和处理能力。

Function Mesh 以一种更云原生的方式使用 Apache Pulsar 和现代流处理技术(stream processing technologies)来构建事件流应用,其主要组件(概念)如下:(参考 Function Mesh Concept

  • 流(Stream):流是一个可分区的、不可变的、只可追加的事件序列,代表了一系列的历史事实。例如,可以用一个流事件来模拟一个金融交易的序列,如“Jack 给 Alice 寄了 100 美元”,接着“Alice 给 Bob 寄了 50 美元”。

Image

  • 函数(Function):函数是轻量级的事件处理器,它可以从一个或多个输入流中消费事件(消息),将用户提供的处理逻辑应用于一个或多个事件(消息),并将经过逻辑处理后的结果发送至另一个流。

Image

  • 连接器(Connector):连接器是一个事件处理器,用于向流中输入事件或获取流中的事件。在 Function Mesh 中,有两种类型的连接器:

    • Sink 连接器:将事件从流中输出到外部数据系统的处理器。

    Image

    • Source 连接器:从外部数据系统导入事件到流中的处理器。

    Image

Function Mesh(也可称之为 Mesh)是一个函数(Functions)和连接器(Connectors)集合,通过流(Stream)将它们编排在一起以实现强大的流处理逻辑。

一个 Function Mesh 中的所有函数和连接器共享相同的生命周期。它们于 Function Mesh 创建时启动,并随 Function Mesh 销毁而终止。我们可以将 Function Mesh 看作一个有向无环图(DAG),也可以是一个用流连接的函数和/或连接器的循环图。

Image

什么是 KubeVela ?

KubeVela 是一个基于 Kubernetes 的应用交付和管理平台。它实现了 Kubernetes 在应用层面的能力抽象,并提供了跨云多集群环境的应用持续交付的能力。KubeVela 以应用为核心向用户提供可编程的交付工作流程,其主要组件(概念)如下:(参考 KubeVela core-concept)

Image

  • 组件(Component): 组件定义一个应用包含的待交付制品(二进制、Docker 镜像、Helm Chart 等)或云服务。我们认为一个应用部署计划部署的是一个微服务单元,里面主要包含一个核心的用于频繁迭代的服务,以及一组服务所依赖的中间件集合(包含数据库、缓存、云服务等),一个应用中包含的组件数量应该控制在约 15 个以内。
  • 运维特征(Trait): 运维特征是可以随时绑定给待部署组件的、模块化、可拔插的运维能力,比如:副本数调整(手动、自动)、数据持久化、 设置网关策略、自动设置 DNS 解析等。
  • 应用策略(Policy): 应用策略负责定义指定应用交付过程中的策略,比如多集群部署的差异化配置、资源放置策略、安全组策略、防火墙规则、SLO 目标等。
  • 工作流步骤(Workflow Step): 工作流由多个步骤组成,允许用户自定义应用在某个环境的交付过程。典型的工作流步骤包括人工审核、数据传递、多集群发布、通知等。

你可以通过 KubeVela 提供的 Quick Start 部署你的第一个应用。

Function Mesh 与 KubeVela

Function Mesh 目前在使用中存在以下问题:

  • Function Mesh 的底层实现是 Pulsar Functions,这意味着如果用户需要使用 Function Mesh 来构建一个 Serverless 平台的话,需要先部署 Pulsar 集群,并对 Pulsar 消息中间件有一定的了解(操作和维护),这无疑增加了一些用户的学习成本
  • 缺少配置项的抽象,同样会增加维护者和终端用户的学习成本
  • Function Mesh 同时还需要搭配一些其他项目,比如 Cert-Manager 等

KubeVela 可以帮助 Function Mesh 解决这些问题:

  • Pulsar 集群可以通过 FluxCD 插件进行部署(或者提供 Pulsar addon)
  • 通过 Cert Manager addon 部署 Cert Manager 服务
  • 将 Function Mesh Operator 以 addon 形式注册到 KubeVela 的 addon registry 中
  • FunctionMeshSinkFunctionSource 等资源添加到 Component 中,使得用户可以在自己的 OAM Applications 中便捷使用

场景案例

将 Function Mesh 作为企业内部 Serverless 平台解决方案,实施的步骤大体如下:

  1. 部署 KubeVela 并启用以下 addon:
    • FluxCD
    • Cert Manager
    • Function Mesh Operator(即我们需要提供的 addon)
  2. 在组件中部署带有 FluxCD 插件的 Pulsar(或 Pulsar addon)
  3. 用 Cert Manager 插件在组件中部署 Cert Manager
  4. 用 Function Mesh Operator addon 在组件中部署 Function Mesh Operator
  5. 支持在 OAM Applications 定义中使用 MeshSinkFunctionSource 类型的 Component,以完成特定的 Serverless 平台(应用)建设
  6. 在工作流中部署 Pulsar、Cert Manager 和 Function Mesh Operator addon 时,准备好基本信息(如 ConfigMap、Secrets、Ingress 等)
  7. 暂停部署步骤,执行一个简单的函数演示,等待用户验证
  8. 待用户验证后,手动恢复部署步骤
  9. 随后在正式环境中完成整体平台(应用)的建设(过程中会根据 Policy 完成运维特征属性的变更)

Addon

1
2
3
4
5
6
7
8
9
10
11
12
.
|-- LICENSE
|-- README.md
|-- definitions
| `-- meshes.cue
|-- metadata.yaml
|-- parameter.cue
|-- schemas
| `-- myschema.yaml
|-- template.cue
`-- views
`-- my-view.cue

Function Mesh Operator addon 的目录结构如下,其中:

  • template.cue 用于提供 Function Mesh Operator 的部署方案
  • definitions 目录用于存放 Function Mesh 向 KubeVela 提供的资源抽象(此处为 FunctionMesh 类型的 Component)

目前对于 FunctionMesh 类型的 Component,我们提供了较为原始的参数配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
template: {
parameter: {
functions?: [...#Function]
sinks?: [...#Sink]
sources?: [...#Source]

#Function: {
// +usage=Function image.
image: string
name: string
maxPendingAsyncRequests?: *1000 | int
replicas?: *1 | int & >=1
maxReplicas?: int & >=replicas
minReplicas?: *1 | int & <=replicas
logTopic: string
input: #Input
output: #Output
...
}

#Sink: {
...
}

#Source: {
...
}
}
}

用户可以将 Function Mesh 应用的 YAML 配置较为快速地转变为 OAM Applications 资源配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
apiVersion: core.oam.dev/v1beta1
kind: Application
metadata:
name: my-app-v1
spec:
components:
- name: my-mesh
type: meshes
properties:
functions:
- image: "streamnative/pulsar-functions-java-sample:2.9.2.23"
minReplicas: 1
logTopic: "persistent://public/default/logging-function-logs"
input:
topics:
- persistent://public/default/input-java-topic
typeClassName: "java.lang.String"
output:
topic: "persistent://public/default/output-java-topic"
typeClassName: "java.lang.String"
resources:
requests:
cpu: "0.1"
memory: "500M"
limits:
cpu: "0.5"
memory: "1G"
pulsar:
pulsarConfig: "my-pulsar-cluster"
javaRuntimeConfig:
jar: "/pulsar/examples/api-examples.jar"
className: "org.apache.pulsar.functions.api.examples.ExclamationFunction"
name: function1

这使得 Function Mesh 可以非常丝滑地融入用户已有的应用架构体系中,有助于用户轻松启用 Serverless 特性。

image-20221205150317278

演示视频

点击查看演示视频

未来规划

通过 KubeVela,我们弱化了 Function Mesh 的底层实现,让用户可以专注于 Function Mesh 的 Serverless 特性。同时,这种方法增强了 Function Mesh 的产品维度,方便用户单独部署使用。

当前 Function Mesh Operator addon 仍处于起步阶段,我们的演进路线如下:

  • 完善 Addon 使用文档
  • 增加 Trait、Policy 相关的能力,补足 Addon 的能力
  • 持续抽象 Component 中的属性参数,降低用户的学习和使用成本
  • 向 KubeVela 贡献 Addon(注册至 KubeVela addon registry)
  • 结合具体的用户场景,深度优化 Function Mesh 的能力

更多详情,请访问:

Image