FaaS踩坑之fission安装
上个月申请了sel实验室,来到公司。和丁博士沟通了一下,确定方向是边缘计算中的faas,给我布置了下任务,用一周的时间把fission跑起来,熟悉fission的用法,并比较fission和openwhisk。
fission是跑在k8s上的服务,因此要先申请几个公司的虚拟机做集群,在虚拟机上安装k8s,再安装k8s上的包管理工具helm,最后装fission。安装k8s比较麻烦,丁博士让我不懂就问一个前辈,前辈装过minikube,所以让我从minikube开始。
对docker完全真空的我感觉有点懵逼,不过感觉很激动。。就开始啦。
0. 科学上网
科学上网太重要了。这14天学到各种姿势:
本地设置http代理在浏览器翻
shadowsocks : 转化socks5协议,可以设置pac自动模式访问墙内网站不走代理。
shadowsocks + privoxy:终端翻,每次运行下面的脚本
1 |
|
ss + privoxy + proxifier :配置所有应用的流量走ss,可以直接docker pull 墙外镜像
ssh到虚拟机(比如k8s)一直没实现有些遗憾不然又能跳过一堆坑
1. 安装minikube
minikubi是只有一个节点的,可以看成是单机版的k8s,用来编排docker(类似虚拟机,感觉像是运行在镜像上的进程)的工具,可以在minikube上面运行各种跑在docker上的服务(比如fission)。
每一个服务有一个namespace用于防止服务间命名冲突,服务由各种deployment组成,deployment负责启动相关pod,pod可以看成包含很多豆子(docker/image)的豆荚,里面的豆子包括跑着服务的组件和fission里起来的函数。
通过命令行kubectl可以对相关deployment,pod,namespace进行操作如查看或删除等。之后安装fission会经常有pod没起来,用kubectl查看或删除fission重新安装。常用命令有:
1 | kubectl get svc --all-namespaces 查看所有服务 |
安装minikube,就是安装一个linux,并在上面安装minikube的相关组件,当所有pod跑起来之后就可以了。
参考了其他博客,感觉写的很好,按照博客安装的。
https://blog.csdn.net/aixiaoyang168/article/details/78331847?locationNum=6&fps=1
因为minikube在墙内,安装所需的gcr镜像没有拉下来,通过阿里的镜像库和公司的私有库把镜像docker pull下来传到本机,在本地虚拟机加绝对路径直接docker load进来(感觉非常神奇,不知道本机和本机虚拟机怎么交流的)
或者 1. 安装k8s
申请三台虚拟机(4c8g50g)。
参考观云台部署文档+脚本一键部署k8s,很快就装好了。
然后把k8s的~/.kube/admin.conf传入本机/etc/kubernetes中,让本机连上集群。
坑如下:
- 部署时默认部署单节点集群,还有高可用集群可选(安装时加参数HA)。单节点集群只有一个master不是只有一个节点,高可用集群有多个master。按默认即可差点装错。
k8s虚拟机里的DNS服务器能ping通,但是ping其他的网站ping不通。因为公司虚拟机的dns服务器是自己搭建的,什么都解析不了。所以无法用docker pull(因为docker官网都不知道是什么)需要自己添加dns服务器
1
2
3vim /etc/resolv.conf
nameserver 8.8.8.8
/etc/init.d/network restart添加了dns服务器好像也不能解析个别地址,比如helm里阿里的repo,所以还要自己添加地址。
1
2vim /etc/hosts
116.62.99.172 https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com
再或者 1. 申请谷歌云
在谷歌云上建k8s集群。终端连到谷歌云的集群上。
完全无坑,如果只玩fission的话强烈安利,不用拉镜像换repo也没有各种诡异的问题(处理安装helm时多了一步,见安装helm)。但是自己用着玩可以,不能移植到边缘设备如网关,长远看做不成边缘计算的项目。1
2启动集群:gcloud container clusters create example-cluster
关闭集群:gcloud container clusters delete example-cluster
2. 安装helm
helm是k8s上的包管理工具,可以方便的从repo源(相当于yum源)中的chart(相当于rpm包)安装在k8s。分客户端helm和服务端tiller,分别部署在本地和k8s内部上(也可以客户端也部署在k8s中),版本号要一致。客户端直接下载到本地,服务端通过helm init 自动安装到本机连接的k8s集群中。1
helm init --upgrade -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.8.7 --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
安装参考博客:https://blog.csdn.net/weiguang1017/article/details/78045013
需要注意的有:
- 安装helm服务端是依然有个拉不下来的gcr镜像tiller。要么拉下来,要么在helm init时直接指定阿里的镜像进行替换。
- helm是从repo上给k8s安装服务,但那个repo也被墙了,helm init时也要指定阿里的repo替换默认repo
通过谷歌云安装helm时要先
1
2
3kubectl create serviceaccount --namespace kube-system tiller
kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
kubectl patch deploy --namespace kube-system tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}'(隐秘的坑,如果被替换的repo地址无法被k8s的dns服务器解析,白替换了)
3. 安装fission
安装文档上的一行代码往往运行不了的,看起来就是helm从github上直接直接把fission部署在集群上,但总会出现各种诡异的错误,一开始感觉是完全凭运气安装的,后来发现报错基本可以分成4类:无法下载、什么什么已存在、超时、编译出错
解决是这样的
- 把项目直接下载到本地,url变为本地绝对路径(虽然我一直感觉这个问题很奇怪,项目很小又不用翻墙为什么有时候会下不下来)
上次安装到一半出错了,这次安装就会报错,要把所有上次的东西删干净,再新建一个ns fission,最好写个shell,每次直接执行:
1
2
3
4
5
6
7
8
9
10
11
12
13
14#!/bin/bash
kubectl delete clusterrolebindings fission-builder-crd
kubectl delete clusterrolebindings fission-fetcher-crd
kubectl delete clusterrolebindings fission-crd
kubectl delete ns fission-function
kubectl delete ns fission-builder
kubectl delete ns fission
kubectl delete secrets influxdb -n fission这个错误只在通过公司脚本安装的k8s上遇到了,因为部署fission需要的镜像没拉下来,应该是k8s拉镜像有问题。于是需要镜像较少的精简版fission-core。
先通过fission的源码查到需要镜像 fission/fission-bundle:0.6.0 和 fission/fluentd:0.6.0。拖进去发现还是不行,在谷歌云集群安装了一次fission-core发现上面还跑了一个镜像fission/alpinecurl,load进来把fission跑起来了。记得3个节点都要load,因为fission不一定在哪个节点跑着。
1 | 传镜像的代码 |
- 安装fission-core有个奇怪的错误,如下,结果是fission源码错误
1
release harping-dragonfly failed: Deployment.apps "router" is invalid: [spec.template.spec.containers[0].livenessProbe.httpGet.port: Invalid value: "8888": must contain at least one letter or number (a-z, 0-9), spec.template.spec.containers[0].readinessProbe.httpGet.port: Invalid value: "8888": must contain at least one letter or number (a-z, 0-9)]。
。。感觉还是靠运气的。
4. 安装fission ctl
按文档安装没错的
5. fission使用
路径问题:触发函数时curl,FISSION_ROUTER 要换掉,若是minikube安装,直接换成minikube虚拟机地址;若是k8s安装,换成外部ip
1
curl http://$FISSION_ROUTER/hello 变成 curl http://35.194.204.59/hello
顺序问题:下面的每一步之间有依赖关系,顺序不能颠倒:
创建环境(go,python,js…),创建executors和函数(创建pod),创建trigger(调用函数)1
2
3fission env create --name nodejs --image fission/node-env:0.6.0
fission fn create --name hello --code hello.js --env nodejs --executortype poolmgr
fission route create --function hello --url /hellopackage打包上传问题:
报错:Build timeout due to environment builder not ready ,builder组件有问题
更多关于fission的问题在后面写
参考
https://docs.fission.io/0.6.0/installation/installation
http://www.jdon.com/48109
https://www.jianshu.com/p/51a19ef5f8cf
https://www.cnblogs.com/Leo_wl/p/6055252.html
https://www.kubernetes.org.cn/3096.html
https://www.kubernetes.org.cn/3280.html
http://www.dockone.io/article/932
http://blog.csdn.net/moshenglv/article/details/55806421
http://blog.csdn.net/aixiaoyang168/article/details/78331847?locationNum=6&fps=1
https://blog.csdn.net/weiguang1017/article/details/78045013
感谢刘吉安学长虽然不在边缘计算组还每天教我填坑到晚上11点,丁博士教我k8s相关和fission源码分析,崔前辈和高前辈带我入门,没嫌弃我各种弱智的问题。