Fission
Last updated
Was this helpful?
Last updated
Was this helpful?
本文主要基于 v1.10.0 版本
开始学习之前,先看看本 repo 最近在干什么(截至 2021.06),release note:
1.13.1 [2021.06]
Support for prefix-based routes for functions
Support for multiple HTTP verbs for a function
RequestsPerPod and OnceOnly fields are added for pool manager
1.12.0 [2021.02]
Support for Keda 2.0
Multi-Architecture Build: you can deploy fission on ARM architecture
1.11.2 [2020.10]
Concurrency in PoolManager
Autoscaling for MQT integrations with Keda
A new lightweight JVM environment
1.10.0 [2020.06]
S3 as a backend for Storage Service
Disabling env variable based discovery in Functions
Kube Context flag in Fission CLI
1.9.0 [2020.05]
Go 1.14 support
Function Level timeout
External Nats streaming
PodSecurityPolicy for Logger
1.8.0 [2020.02]
Go 1.13 support
Dry option to view the generated spec
Resource setting for fetcher
大部分是一些功能的补充和增强,值得注意的是,1.11 版本 fission 开始与 Keda 集成
结合实战来学习本 repo
如果目标 k8s 集群没有相应的 pv provision 机制,还需要:
修改 fission-storage-pvc storageClass 为 manual
再建个本地 pv 凑活一下
确认部署组件都已正常工作
安装完 Fission 之后,来梳理下安装的组件
pod
容器
命令
源码 repo
buildermgr
buildermgr
fission-bundle --builderMgr ...
Fission
controller
controller
fission-bundle --controllerPort ...
Fission
executor
executor
fission-bundle --executorPort ...
Fission
router
router
fission-bundle --routerPort ...
Fission
storagesvc
storagesvc
fission-bundle --storageServicePort ...
Fission
注:
kubewatcher 和 timer 虽然缺省安装了,但不是 core 组件,暂不说明
除此之外,函数生成的 pod 还自带一个 fetcher 容器,该容器也是 Fission repo 编译而来
整体架构是:
其中:
fission client 封装了网络调用
controller 处理函数相关对象的 crud,并转化为 k8s 里的 CRD 操作
router 负责处理函数的寻址、触发
buildermgr 处理函数编译相关工作
executor 负责函数实例化管理
storageSvc 负责存储函数代码的编译包
直接对着架构图解读,比较抽象,在使用小节会结合实例来详细说明
Fission 引入了 environment、package、function、trigger 四类 CRD。其中:
environment 记录了函数运行环境、编译环境相关的信息
package 记录了函数源码、编译包相关的信息
function 记录了函数运行相关的信息
trigger 记录了函数触发相关的信息
在使用小节会结合实例来详细说明
本小节会按照“从零开始写一个 go 函数”的流程,来串联所有组件,梳理功能
上述命令创建了 go 环境,指定了后续编译、运行的镜像信息。涉及的完整流程是:
fission client 向 controller 发起了创建 env 的请求
controller 收到请求后,创建了 environment CR
buildermgr watch 到 environment CR 后,创建了 builder pod
executor watch 到 environment CR 后,创建了 pod pool
注:
fission go 代码的编写比较常规,没什么特殊要求,接口参数保持规范即可
上述命令指定 go env 以上述代码创建了 fission 函数。涉及的完整流程是:
fission client 向 controller 发起了创建 fn 的请求
controller 收到请求后,创建了 function CR 和 package CR
其中,package 里存储了 hello.go 的源码
buildmgr watch 到 package CR 后,向上面创建的 builder pod 发起编译请求
builder container 从 package 里获取源码,开始编译
builder container 编译完成后,通知 fetcher container 将编译包上传至 storagesvc
builder container 将编译日志和编译包的 url 等信息都存储于 package 中
上述命令测试了刚刚创建的函数。涉及的完整流程是:
fission client 向 router 发起了触发 fn 的请求
router 收到请求后,请求 executor 提供函数地址
executor 从 pool 中选出一个 ready 的 pod,通知 pod 里的 fetch 容器
fetch 容器从 storagesvc 中获取编译包,取完通知 env 容器
env 容器加载函数,加载完成返回函数地址给 router
router 返回函数地址到 fission client
fission client 发起函数调用请求
在 PoolMgr 模式下,同一个函数最多实例化 pool size 个 pod,长时间没有访问时,pod 会销毁,除此之外,并没有其它的扩缩容能力。Fission 的自动扩缩,主要是针对 NewDeploy 模式
当上述函数第一次被触发时,会创建一个 HPA,实际的伸缩能力也是由 HPA 提供的。不过,HPA 并不具备缩容到0的能力,"scale up from zero" 和 "scale down to zero" 的能力是 executor 补足的
Fission、Kubeless、OpenFaas 3个 faas 实现里,Fission 是唯一一个有冷启动优化的,也就是 PoolMgr 模式,省去了镜像拉取、容器启动的时间。而 Kubeless 直接没有提及,OpenFaas 只有最佳实践的建议,也就是不要配置扩缩容时,最小副本数低于1
上述小节以命令行的形式,手工触发函数调用,而在生产环境,Fission 提供了以下几种触发方式:
http trigger
message queue trigger
Fission 支持多种 message queue,包括:NATS、Kafka、KEDA,不过因为需要额外安装组件,这里就不再演示了
timer trigger
不过,这个项目应该是凉了,最新的 release 0.6.0 是18年发布的,安装、使用各种问题:
如安装时,helm 里使用的 jaegertracing/jaeger-agent 是 latest 镜像,跟启动参数已经不兼容了,可以手工替换成 1.8.2 版本
executor 有两种 pod 管理模式,(pod 资源池) 和 (每次新建 pod)。缺省是 pool,本流程解读都会以 pool 来说明
是用于编排函数执行顺序的子项目,
如使用时,参考文档案例跑不通,相关的 无人处理