WRY

Where Are You?
You are on the brave land,
To experience, to remember...

0%

Fission 使用体验

Fission 特性

Fission主要特性是函数化部署,用户无需关心容器的编译和Docker集群的管理,只需专注于核心代码的编写。主要有如下几点:

  • Fission是Apache许可下的开源软件,可以在任何地方的K8s集群上运行。
  • Fission维护了一个可以配置的容器池,因此函数可以有非常低的冷启动延迟,通常为100ms。
  • 声明式规范,可以实现定义完一个功能后,将其部署在任何地方。
  • 集成了Fluentd日志管理框架和Prometheus时序数据库,可以详细的跟踪Fission资源运行状况。
  • 集成了Istio微服务管理框架,可以监视功能的使用情况和函数的延迟情况。(和Prometheus维护的指标之间的差异?)
  • 多编程语言支持,Python, NodeJS, Go, C#, PHP等,也可以定制运行环境。
  • 自动缩放资源,实现高效的弹性伸缩

Fission 架构

Fission 触发方式

  • Fission 通过HTTP请求的方式,触发函数调用。函数内可以继续向后访问有状态服务。
img
  • 通过Webhooks的方式进行调用,思想和HTTP请求触发类似,此处强调的是和现有的第三方服务的Webhooks相结合十分便捷。
img
  • 通过Kubernetes watch事件触发,方便在Kubernetes上实现自定义的自动化,实现对Pod和Services等资源监听,在资源发生更改时执行任意的功能。
img

Fission 使用简记

Fission 安装

使用helm2 进行安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# helm install 参考 https://helm.sh/docs/intro/install/
# 准备工作 helm2 国内安装,注意下面镜像的版本需要和helm客户端的版本一致
# 创建tiller服务账号,并授予集群管理权限
$ kubectl create serviceaccount --namespace kube-system tiller
$ kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
# 使用国内的镜像源安装helm的server端
$ 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
# 若上述步骤出错了,需要手动删除helm在kube-system命名空间中部署的tiller-deploy

# fission server install
$ FISSION_NAMESPACE=fission
$ kubectl create namespace ${FISSION_NAMESPACE}
# 带istio安装,rancher安装istio后,可以自动进行关联
$ 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
# github不可用时,若您需要passwd请与我联系
$ 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
# 参数说明 https://github.com/fission/fission/tree/master/charts

安装客户端

1
2
# fission cli install 
$ 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安装 参考链接 https://hub.helm.sh/charts/stable/grafana
$ 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安装
$ 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
# 创建env环境
$ 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
# http调用
$ export FISSION_ROUTER=127.0.0.1:8888
$ curl http://$FISSION_ROUTER/hellopy
# 压力测试 20个并发,2000次请求
# hey install
# $ wget https://storage.googleapis.com/hey-release/hey_linux_amd64 -O /usr/local/bin/hey
$ 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
# 因为还没有配置路由,所以back返回的都是404错误
# 配置路由
$ 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 监视效果

image-20200525194656976
image-20200525194637012

Fission 存在的问题

函数更新时,旧函数没有直接删除掉

在允许函数空闲的时间比较短的时候,旧函数的删除没有感知上的问题。但在允许函数空闲的时间比较长的时候,就会出现更新函数之后就Pod一直存在的问题。使用的是poolmgr调度策略。

解决方案:修改environment的删除等待时间,可以有效解决上述问题。

参考链接

Fission 官网