OpenFunction
OpenFunction是一个开源的云原生 FaaS(Function as a Service,函数即服务)平台。Openfunction其实是一个serverless项目,什么是serverless(无服务计算)?
用户和开发人员无需关注服务的运维问题只需要专注于业务逻辑。运维问题完全由第三方来管理。
而faas则是可以支持开发人员只关注于函数,接收到一个输入,对输入的处理,最后发出一个输出。且可以使用各种语言来进行编程。
FaaS中的函数可以通过供应商定义的事件类型触发。对于亚马逊AWS,此类触发事件可以包括S3(文件)更新、时间(计划任务),以及加入消息总线的消息。
下载安装
下载ofn命令行,安装openfunction。
选择组件进行安装。
安装之后会生成如下命名空间。
设置
kourier是一个网关,会为函数访问提供一个入口,该入口是由域名提供的。
Kourier默认创建两个service。
将与函数访问相关域名解析到10.233.62.54即可。
函数的域名虽然不同,但域名后缀都是相同的,kourier的默认域名后缀是example.com,可以通过knative的config-domain来自己配置。
将其修改为penetrate.cn
因为设置了同样的域名后缀,所以可以通过泛域名解析来实现解析与函数相关的所有域名。为了方便集群中的pod访问函数,可以对集群的coredns的配置中添加一段内容,对域名后缀penetrate.cn进行泛解析。
运行示例
首先根据官网给出的示例函数,创建yaml文件
创建secret用来保存docker hub的账号密码
设置docker hub的存储仓库
创建function,查看builder以及pod
Builder会起一个pod来创建function,这个pod里有4个容器
此时可以看到这个pod里主要的内容都是和tekon有关的,说明此阶段还未创建出镜像,只是为了下一步创建镜像做准备。
创建镜像
Docker hub里已经有了这个镜像
再次查看function,此函数已经准备好了
可以查看此时的pod和builder,发现函数创建完成后,创建时所用到的资源pod和builder都会被释放。
而且此时因为未运行此函数,所以Knative Serving会自动伸缩,将deployment的副本数降为0。
查看此function入口的ksvc
在集群的一个pod里访问该函数的访问入口,返回函数值hello!
此时再查看集群的pod
发现集群已经为该函数服务起了一个pod,该pod里有两个容器。
查看此时deployment的副本数,发现已经被自动伸缩为1。
若一段时间后不访问该函数,副本数就又会被缩小为0。
Build:主要负责镜像的制作和推送
Function:是用户交互的唯一入口,其中包含build和serving阶段的定义
Serving:负责运行函数,支持同步和异步两种运行方式
Events:提供了一个对于事件驱动型函数的事件管理框架——OpenFucntion Events
整体结构
Build
创建一个function后,function会根据yaml配置文件中所给的资源自动生成镜像,Function会创建一个Builder,Builder会创建ShipwrightBuild,结合Shipwright的BuildStrategy选择不同的镜像创建工具,然后会生成Tekton的TaskRun。TaskRun中包含多个Step,并在 Tekton 的控制下将function构建为容器镜像。
Serving
Function创建后会自动生成相应的serving,serving会根据function创建时的配置文件来选择同步或异步服务。同步运行时由Dapr的部分组件和Knative Serving支持,异步运行时由Dapr的部分组件和KEDA支持。
自动伸缩
同步函数:
同步函数的自动伸缩功能由Knative Serving中的Autoscaler和Activor提供。简单来说就是当有流量经过pod时,这个流量的大小会被送到Autoscaler,由Autoscaler控制pod的规模。当一定时间内无流量经过时,Autoscaler会负责将副本量缩小为0,由active状态变为reserve状态。如果reserve状态时收到请求,流量会经过Activor,状态再次转为active。
异步函数:
异步函数的伸缩功能由KEDA提供。
总结
Openfunction是一个开源的faas平台,它可以以函数为单位来提供服务。使用的过程中我们可以以github作为我们的函数仓库,灵活地使用yaml文件来创建各种函数,并且由knative serving(同步运行时)和keda(异步运行时)提供的伸缩功能可以在使用函数时把pod起起来,在不使用时自动伸缩,以一个deploy CRD的形式存在。
目前对openfunction中各种组件的理解:
- Build主要是用来制作容器镜像,主要有两个组件
- Shipwright主要是用于选择不同的镜像制作工具,会为下一步控制镜像制作过程的tekton提供taskrun
- Tekton主要负责将函数制作为容器镜像
- Serving是openfunction最关键的部分,主要有三个组件
- Knative serving主要提供了同步进行时函数的伸缩功能和网络端口相关服务。
- Keda主要为异步进行时函数提供了伸缩功能。
- Dapr可以提供一个sdk,这样不同的编程语言都可以先与dapr来对接,再由dapr与openfuction平台对接,极大的简化了复杂度。
- Openfunction Events主要用于管理事件驱动型函数。
- 此部分还没什么了解
此框架本质还是制作镜像,使用的时候再把镜像放到pod中来提供服务,制作好的镜像可以存在docker hub里,优点在于可以自动伸缩,且以函数为单位会更灵活。
下一步的学习方向
- 了解制作函数的yaml配置文件的书写
- 看看函数仓库能不能部署到github以外的位置
- 学习一下异步进行时的函数