Fission 特性
Fission主要特性是函数化部署,用户无需关心容器的编译和Docker集群的管理,只需专注于核心代码的编写。主要有如下几点:
- Fission是Apache许可下的开源软件,可以在任何地方的K8s集群上运行。
- Fission维护了一个可以配置的容器池,因此函数可以有非常低的冷启动延迟,通常为100ms。
- 声明式规范,可以实现定义完一个功能后,将其部署在任何地方。
- 集成了Fluentd日志管理框架和Prometheus时序数据库,可以详细的跟踪Fission资源运行状况。
- 集成了Istio微服务管理框架,可以监视功能的使用情况和函数的延迟情况。(和Prometheus维护的指标之间的差异?)
- 多编程语言支持,Python, NodeJS, Go, C#, PHP等,也可以定制运行环境。
- 自动缩放资源,实现高效的弹性伸缩
Fission 架构
Fission 触发方式
- Fission 通过HTTP请求的方式,触发函数调用。函数内可以继续向后访问有状态服务。
- 通过Webhooks的方式进行调用,思想和HTTP请求触发类似,此处强调的是和现有的第三方服务的Webhooks相结合十分便捷。
- 通过Kubernetes watch事件触发,方便在Kubernetes上实现自定义的自动化,实现对Pod和Services等资源监听,在资源发生更改时执行任意的功能。
Fission 使用简记
Fission 安装
使用helm2 进行安装
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
$ kubectl create serviceaccount --namespace kube-system tiller $ kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
$ helm init -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.14.3 --service-account tiller --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
$ FISSION_NAMESPACE=fission $ kubectl create namespace ${FISSION_NAMESPACE}
$ kubectl label namespace $FISSION_NAMESPACE istio-injection=enabled $ helm install --namespace $FISSION_NAMESPACE --set enableIstio=true --name helm-fission https://github.com/fission/fission/releases/download/1.9.0/fission-all-1.9.0.tgz
$ helm install --namespace $FISSION_NAMESPACE --set enableIstio=true --name helm https://aria:passwd@aria.jingtao.fun/fission-all-1.9.0.tgz
|
使用helm3 进行安装
1 2 3 4 5 6
| $ export FISSION_NAMESPACE="fission" $ kubectl create namespace $FISSION_NAMESPACE $ helm install --namespace $FISSION_NAMESPACE --name-template fission \ --set analytics=false \ https://github.com/fission/fission/releases/download/1.9.0/fission-all-1.9.0.tgz
|
安装客户端
1 2
| $ curl -Lo fission https://github.com/fission/fission/releases/download/1.9.0/fission-cli-linux && chmod +x fission && sudo mv fission /usr/local/bin/
|
安装grafana
1 2 3 4
| $ helm repo add stable https://kubernetes-charts.storage.googleapis.com/ $ helm install --namespace $FISSION_NAMESPACE --name-template fission-grafana \ stable/grafana --version 5.2.0 --set persistence.enabled=true
|
安装kafka
1 2 3 4
| $ helm repo add incubator http://storage.googleapis.com/kubernetes-charts-incubator $ helm install --name-template kafka --namespace kafka-dev incubator/kafka --set persistence.enabled=false $ helm upgrade kafka --namespace kafka-dev incubator/kafka --set replicas=1,...
|
Fission 简单使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| $ fission env create --name python --image fission/python-env
$ fission fn create --name hellopy --env python --code hello.py
$ fission function test --name hellopy
$ fission route create --function hellopy --url /hellopy
$ kubectl --namespace fission port-forward $(kubectl --namespace fission get pod -l svc=router -o name) 8888:8888 --address 0.0.0.0
$ export FISSION_ROUTER=127.0.0.1:8888 $ curl http://$FISSION_ROUTER/hellopy
$ hey -n 2000 -c 20 -m GET http://$FISSION_ROUTER/hellopy
|
hello.py 文件
1 2 3
| import sys def main(): return "hello, I am from fission!"
|
若想更佳充分的使用python镜像的功能,请参考。
Fission 搭建应用
此处在Fission的简单使用的基础上搭建一个略微复杂的应用:有一个入口Function hello,调用另两个Function back_a 和 back_b,搭建完成后,尝试添加Istio的功能,例如权限管理等。
Fission函数之间的相互调用
参看Fission中的一个issue,函数之间的调用通过HTTP请求来进行调用,函数的地址格式如下
1
| http://router.<fission router namespace>/<function>
|
函数服务部署
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| $ fission env create --name python --image fission/python-env
$ fission fn create --name hello --env python --code hello.py $ fission fn create --name back-a --env python --code back_a.py $ fission fn create --name back-b --env python --code back_b.py
$ fission function test --name hello
$ fission route create --function hello --url /hello $ fission route create --function back-a --url /back/a $ fission route create --function back-b --url /back/b
$ fission function test --name hello
$ hey -n 2000 -c 20 -m GET http://$FISSION_ROUTER/hello
|
函数代码
hello.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| import flask import requests
def main(): params = { "a":"This is a Message to a!", "b":"This is a Message to b!" }
msg_a = requests.get('http://router.fission/back/a', params=params) msg_b = requests.get('http://router.fission/back/b', params=params) resp = flask.Response("I am hello, back_a says: \n %s \n back_b says: \n %s \n" % (msg_a.text, msg_b.text) ) resp.status_code = 200 return resp
|
back_a.py
1 2 3 4 5
| from flask import request
def main(): msg = request.args.get('a') return "This is a response from back_a!, Your input is %s" % msg
|
back_b.py
1 2 3 4 5
| from flask import request
def main(): msg = request.args.get('b') return "This is a response from back_b!, Your input is %s" % msg
|
Istio控制
Istio挂了,下次再来吧~
Istio 监视效果
Fission 存在的问题
函数更新时,旧函数没有直接删除掉
在允许函数空闲的时间比较短的时候,旧函数的删除没有感知上的问题。但在允许函数空闲的时间比较长的时候,就会出现更新函数之后就Pod一直存在的问题。使用的是poolmgr调度策略。
解决方案:修改environment的删除等待时间,可以有效解决上述问题。
参考链接
Fission 官网