Fission
本文主要基于 Fission v1.10.0 版本
最近 release
开始学习之前,先看看本 repo 最近在干什么(截至 2021.06),release note:https://docs.fission.io/docs/releases/
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
安装
安装 client
安装 server
如果目标 k8s 集群没有相应的 pv provision 机制,还需要:
修改 fission-storage-pvc storageClass 为 manual
再建个本地 pv 凑活一下
确认部署组件都已正常工作
验证
卸载
架构
安装完 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 环境
上述命令创建了 go 环境,指定了后续编译、运行的镜像信息。涉及的完整流程是:
fission client 向 controller 发起了创建 env 的请求
controller 收到请求后,创建了 environment CR
buildermgr watch 到 environment CR 后,创建了 builder pod
executor watch 到 environment CR 后,创建了 pod pool
注:
编写 go 代码
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
workflow
fission-workflows 是用于编排函数执行顺序的子项目,参考文档
不过,这个项目应该是凉了,最新的 release 0.6.0 是18年发布的,安装、使用各种问题:
如安装时,helm 里使用的 jaegertracing/jaeger-agent 是 latest 镜像,跟启动参数已经不兼容了,可以手工替换成 1.8.2 版本
如使用时,参考文档案例跑不通,相关的 issue 无人处理
Last updated