OpenFunction

        OpenFunction是一个开源的云原生 FaaS(Function as a Service,函数即服务)平台。Openfunction其实是一个serverless项目,什么是serverless(无服务计算)?

   

open func 与public func的区别 open function_微服务

        

        用户和开发人员无需关注服务的运维问题只需要专注于业务逻辑。运维问题完全由第三方来管理。

        而faas则是可以支持开发人员只关注于函数,接收到一个输入,对输入的处理,最后发出一个输出。且可以使用各种语言来进行编程。

        FaaS中的函数可以通过供应商定义的事件类型触发。对于亚马逊AWS,此类触发事件可以包括S3(文件)更新、时间(计划任务),以及加入消息总线的消息。

下载安装

        下载ofn命令行,安装openfunction。

open func 与public func的区别 open function_云原生_02

 

        选择组件进行安装。

open func 与public func的区别 open function_kubernetes_03

 

        安装之后会生成如下命名空间。

open func 与public func的区别 open function_配置文件_04

open func 与public func的区别 open function_微服务_05

 

 

设置

        kourier是一个网关,会为函数访问提供一个入口,该入口是由域名提供的。

        Kourier默认创建两个service。

open func 与public func的区别 open function_后缀_06

        将与函数访问相关域名解析到10.233.62.54即可。

       函数的域名虽然不同,但域名后缀都是相同的,kourier的默认域名后缀是example.com,可以通过knative的config-domain来自己配置。

open func 与public func的区别 open function_后缀_07

open func 与public func的区别 open function_微服务_08

          将其修改为penetrate.cn

open func 与public func的区别 open function_云原生_09

 

        因为设置了同样的域名后缀,所以可以通过泛域名解析来实现解析与函数相关的所有域名。为了方便集群中的pod访问函数,可以对集群的coredns的配置中添加一段内容,对域名后缀penetrate.cn进行泛解析。

open func 与public func的区别 open function_kubernetes_10

 

运行示例

        首先根据官网给出的示例函数,创建yaml文件

open func 与public func的区别 open function_kubernetes_11

        创建secret用来保存docker hub的账号密码

open func 与public func的区别 open function_微服务_12

        设置docker hub的存储仓库

open func 与public func的区别 open function_后缀_13

 

        创建function,查看builder以及pod

open func 与public func的区别 open function_后缀_14

 

        Builder会起一个pod来创建function,这个pod里有4个容器

open func 与public func的区别 open function_微服务_15

 

        此时可以看到这个pod里主要的内容都是和tekon有关的,说明此阶段还未创建出镜像,只是为了下一步创建镜像做准备。

        创建镜像

open func 与public func的区别 open function_云原生_16

 

        Docker hub里已经有了这个镜像

open func 与public func的区别 open function_配置文件_17

 

        再次查看function,此函数已经准备好了

open func 与public func的区别 open function_kubernetes_18

 

        可以查看此时的pod和builder,发现函数创建完成后,创建时所用到的资源pod和builder都会被释放。

open func 与public func的区别 open function_配置文件_19

 

        而且此时因为未运行此函数,所以Knative Serving会自动伸缩,将deployment的副本数降为0。

open func 与public func的区别 open function_微服务_20

 

        查看此function入口的ksvc

open func 与public func的区别 open function_后缀_21

        在集群的一个pod里访问该函数的访问入口,返回函数值hello!

open func 与public func的区别 open function_配置文件_22

 

        此时再查看集群的pod

open func 与public func的区别 open function_kubernetes_23

 

        发现集群已经为该函数服务起了一个pod,该pod里有两个容器。

        查看此时deployment的副本数,发现已经被自动伸缩为1。

open func 与public func的区别 open function_配置文件_24

 

        若一段时间后不访问该函数,副本数就又会被缩小为0。

open func 与public func的区别 open function_后缀_25

 

        Build:主要负责镜像的制作和推送

        Function:是用户交互的唯一入口,其中包含build和serving阶段的定义

        Serving:负责运行函数,支持同步和异步两种运行方式

        Events:提供了一个对于事件驱动型函数的事件管理框架——OpenFucntion Events

整体结构

open func 与public func的区别 open function_配置文件_26

 

Build

open func 与public func的区别 open function_微服务_27

 

        创建一个function后,function会根据yaml配置文件中所给的资源自动生成镜像,Function会创建一个Builder,Builder会创建ShipwrightBuild,结合Shipwright的BuildStrategy选择不同的镜像创建工具,然后会生成Tekton的TaskRun。TaskRun中包含多个Step,并在 Tekton 的控制下将function构建为容器镜像。

Serving

open func 与public func的区别 open function_后缀_28

 

        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中各种组件的理解:

  1. Build主要是用来制作容器镜像,主要有两个组件
    1. Shipwright主要是用于选择不同的镜像制作工具,会为下一步控制镜像制作过程的tekton提供taskrun
    2. Tekton主要负责将函数制作为容器镜像
  2. Serving是openfunction最关键的部分,主要有三个组件        
    1. Knative serving主要提供了同步进行时函数的伸缩功能和网络端口相关服务。
    2. Keda主要为异步进行时函数提供了伸缩功能。
    3. Dapr可以提供一个sdk,这样不同的编程语言都可以先与dapr来对接,再由dapr与openfuction平台对接,极大的简化了复杂度。
  3. Openfunction Events主要用于管理事件驱动型函数。
    1. 此部分还没什么了解

        此框架本质还是制作镜像,使用的时候再把镜像放到pod中来提供服务,制作好的镜像可以存在docker hub里,优点在于可以自动伸缩,且以函数为单位会更灵活。

下一步的学习方向

  1. 了解制作函数的yaml配置文件的书写
  2. 看看函数仓库能不能部署到github以外的位置
  3. 学习一下异步进行时的函数