Fission分析
Fission介绍
Fission 是一个构建在 Kubernetes 之上的 FaaS框架。Fission 利用Kubernetes 集群管理、调度、网络管理等,将容器编排功能留给 Kubernetes,而 Fission 就专注于 FaaS 特性。Fission通过函数轻松的在 Kubernetes 上创建服务。Fission工作在源码级别函数和抽象的容器镜像之上,简化了 Kubernetes 的学习曲线,让你不用深入了解 Kubernetes 就能创建出有用的服务。Fission架构
Fission 被设计为一系列的微服务。Controller 负责追踪函数、HTTP 路由、事件触发器和环境镜像。poolmgr 负责管理空闲的环境容器池、将函数加载到这些容器当中、以及杀死空闲的函数实例。Router 接收 HTTP 请求,并将他们路由到函数实例上,如果需要会向 poolmgr 请求新的实例。
Controller 提供 Fission API,所有其他组件通过关注 Controller 来更新。Router 被暴露为 Kubernetes 的服务,可能是 LoadBalancer 类型或 NodePort 类型,依赖于 Kubernetes 集群在哪里托管。
当 Router 获得请求,它会查找缓存,看是否有一个路由过去的服务。如果没有,它会查找匹配请求的函数,并且向 poolmgr 请求一个新的实例。poolmgr 有一个空闲 pods 池,它会选择一个 pod,将函数加载进去(将请求发送到 pod 的容器中),并将 pod 地址返回给 Router。Router 将请求代理到这个pod。这个 pod 也会被缓存给随后的请求,如果空闲了好几分钟,那就会被杀掉。
Fission部署
本文部署的是Fission 0.7.2版本,环境采用的是Centos7。Fission是基于Kubernetes的,所以你需要部署一套Kubernetes,本文采用的是Kubernetes1.7.6版本。
Fission官方提供了Helm的安装包,所以需要先安装Helm。
$ curl -LO https://storage.googleapis.com/kubernetes-helm/helm-v2.7.0-linux-amd64.tar.gz $ tar xzf helm-v2.7.0-linux-amd64.tar.gz $ mv linux-amd64/helm /usr/local/bin $ helm init
备注:如果helm安装完执行报错: Error: Gethelm安装成功后,使用helm安装Fission,首先下载Fission的安装包。
http://localhost:8080/api/v1/n ... 5%21D(MISSING)TILLER:
dial tcp [::1]:8080: connect: connection refused
解决方案:https://blog.****.net/lindao99 ... 77702
$ wget https://github.com/fission/fission/releases/download/0.7.2/fission-all-0.7.2.tgz $ tar zxvf fission-all-0.7.2.tgz
如果Kubernetes没有配置PSV,可以修改Fission的配置文件values.yaml
## Persist data to a persistent volume. persistence: enabled: false //改成false ## If defined, storageClassName: <storageClass> ## If set to "-", storageClassName: "", which disables dynamic provisioning ## If undefined (the default) or set to null, no storageClassName spec is ## set, choosing the default provisioner. (gp2 on AWS, standard on ## GKE, AWS & OpenStack) ## # storageClass: "-" accessMode: ReadWriteOnce size: 8Gi
部署Fission。
$ helm install --namespace fission /path/to/fission-all
备注:官方提供的Fission需要通过ServiceAccount访问KubernetesFission部署成功后,可以查询Pod。
API,所以Kubernetes需要开启ServiceAccount。另外官方部门的Fission内部通信是通过Service的DNS域名进行访问的,所以Kubernetes需要安装skydns。
$ kubectl get pods --namespace fission NAME READY STATUS RESTARTS AGE buildermgr-3874540323-hsq2d 1/1 Running 0 2h controller-3683511688-cgn0c 1/1 Running 0 2h executor-3903360216-nwqdp 1/1 Running 0 2h influxdb-80493873-1n0rq 1/1 Running 0 2h kubewatcher-2231011853-mpqsn 1/1 Running 0 2h logger-4hztq 1/1 Running 0 2h mqtrigger-3872772923-2vnw2 1/1 Running 0 2m nats-streaming-1411412910-75mtd 1/1 Running 0 2h router-3276981854-w40r1 1/1 Running 0 2h storagesvc-1407456361-756w4 1/1 Running 0 2h timer-1701838563-4w7fs 1/1 Running 0 2h
最后安装Fission客户端。
$ curl -Lo fission https://github.com/fission/fission/releases/download/0.7.2/fission-cli-linux && chmod +x fission && sudo mv fission /usr/local/bin/
Fission使用
1.创建Environment,Environment是Function的执行环境,Fission 选择了一种混合的方法—-容器镜像包含函数所需的动态装载器。这种方法允许大多数用户纯粹从源码级别来使用 Fission,但需要时也允许他们自定义容器镜像。在 Fission 中,这些镜像被称作“环境镜像”,包含了编程语言(比如说 NodeJS 或者 Python) 所需的运行环境,一系列通用的依赖和为函数准备动态加载器。通过命令创建一个node的环境,并且设置资源限制,
$ fission env create --name node --image fission/node-env:0.4.0 \ --mincpu 40 --maxcpu 80 --minmemory 64 --maxmemory 128 --poolsize 4
这创建成功后可以通过命令查询:
$ fission env list NAME UID IMAGE POOLSIZE MINCPU MAXCPU MINMEMORY MAXMEMORY EXTNET GRACETIME node 55e... fission/node-env:0.4.0 4 40m 80m 64Mi 128Mi false 360
另外可以查询到Kubernetes创建了相关的Pod
$ kubectl get pods --namespace fission-function NAME READY STATUS RESTARTS AGE node-55e8485e-54f5-11e8-bb42-00266cff0048-yhircw03-1820297p7jdw 2/2 Running 0 4m node-55e8485e-54f5-11e8-bb42-00266cff0048-yhircw03-1820297r97kw 2/2 Running 0 4m node-55e8485e-54f5-11e8-bb42-00266cff0048-yhircw03-1820297s7vs0 2/2 Running 0 4m
2.创建Function,Function是Fission的核心,Function就是需要执行的业务代码。
准备一个简单的node代码hello.js。
module.exports = async function(context) { return { status: 200, body: "Hello, world!\n" };}
调用命令指定代码来创建Function:
$ fission fn create --name hello --code hello.js --env node --executortype poolmgr
最好可以测试下Function
$ fission fn test --name hello Hello, world!
3.创建Trigger,FaaS是一种事件驱动框架,Trigger也就是事件的触发器,Fission中支持HTTP触发器、Time触发器和MQ触发器。其中HTTP触发器类似AWS APIGateway+Lambda。
创建一个HTTP访问触发,。
$ fission ht create --url /hello --method GET --function hello
然后访问router
$ curl 10.254.61.137/hello Hello, world!
参考
作者简介
吴龙辉,现任网宿科技云计算架构师,致力于云计算PaaS的研究和实践,《Kubernetes实战》作者,活跃于CloudFoundry,Docker,Kubernetes等开源社区,贡献代码和撰写技术文档。邮箱:[email protected]