FaaS分析之 Fission说明


【编者的话】FaaS是一种更细分的服务化形态,在云计算、边缘计算和IoT都将会体现其重要的能力。本文介绍Fission的架构、通过操作来介绍Fission的设计和逻辑。

Fission介绍

Fission 是一个构建在 Kubernetes 之上的 FaaS框架。Fission 利用Kubernetes 集群管理、调度、网络管理等,将容器编排功能留给 Kubernetes,而 Fission 就专注于 FaaS 特性。Fission通过函数轻松的在 Kubernetes 上创建服务。Fission工作在源码级别函数和抽象的容器镜像之上,简化了 Kubernetes 的学习曲线,让你不用深入了解 Kubernetes 就能创建出有用的服务。

Fission架构

QQ截图20180511171808.png

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: Get
http://localhost:8080/api/v1/n ... 5%21D(MISSING)TILLER:
dial tcp [::1]:8080: connect: connection refused
解决方案:https://blog.csdn.net/lindao99 ... 77702
helm安装成功后,使用helm安装Fission,首先下载Fission的安装包。
$ 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访问Kubernetes
API,所以Kubernetes需要开启ServiceAccount。另外官方部门的Fission内部通信是通过Service的DNS域名进行访问的,所以Kubernetes需要安装skydns。
Fission部署成功后,可以查询Pod。
$ 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等开源社区,贡献代码和撰写技术文档。
邮箱:wlh6666@qq.com

0 个评论

要回复文章请先登录注册