上个月申请了sel实验室,来到公司。和丁博士沟通了一下,确定方向是边缘计算中的faas,给我布置了下任务,用一周的时间把fission跑起来,熟悉fission的用法,并比较fission和openwhisk。

fission是跑在k8s上的服务,因此要先申请几个公司的虚拟机做集群,在虚拟机上安装k8s,再安装k8s上的包管理工具helm,最后装fission。安装k8s比较麻烦,丁博士让我不懂就问一个前辈,前辈装过minikube,所以让我从minikube开始。
对docker完全真空的我感觉有点懵逼,不过感觉很激动。。就开始啦。

参考 fission官网安装文档

0. 科学上网

科学上网太重要了。这14天学到各种姿势:

  1. 本地设置http代理在浏览器翻

  2. shadowsocks : 转化socks5协议,可以设置pac自动模式访问墙内网站不走代理。

  3. shadowsocks + privoxy:终端翻,每次运行下面的脚本

1
2
3
4
5
6
7
8

sudo /usr/local/sbin/privoxy /usr/local/etc/privoxy/config

export http_proxy='http://localhost:8118'

export https_proxy='http://localhost:8118'

curl www.google.com
  1. ss + privoxy + proxifier :配置所有应用的流量走ss,可以直接docker pull 墙外镜像

  2. 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
2
3
4
5
6
7
8
9
kubectl get svc --all-namespaces 查看所有服务
kubectl get pods --all-namespaces 查看所有pod
kubectl get ns --all-namespaces 查看所有命名空间
kubectl get secrets --all-namespaces 查看所有secret
kubectl get deployment --all-namespaces 查看deployment
kubectl describe kube-dns-1326421443-19zxq 查看某一pod
kubectl describe pod python-39799-58b5b4f844-zwlc6 -n fission-builder命名空间下查看pod
kubectl describe pods kube-dns-1326421443-19zxq -n kube-system
kubectl logs python-39799-58b5b4f844-zwlc6 -n fission-builder —container=builder 查看pod 的logs

安装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中,让本机连上集群。

坑如下:

  1. 部署时默认部署单节点集群,还有高可用集群可选(安装时加参数HA)。单节点集群只有一个master不是只有一个节点,高可用集群有多个master。按默认即可差点装错。
  2. k8s虚拟机里的DNS服务器能ping通,但是ping其他的网站ping不通。因为公司虚拟机的dns服务器是自己搭建的,什么都解析不了。所以无法用docker pull(因为docker官网都不知道是什么)需要自己添加dns服务器

    1
    2
    3
    vim /etc/resolv.conf
    nameserver 8.8.8.8
    /etc/init.d/network restart
  3. 添加了dns服务器好像也不能解析个别地址,比如helm里阿里的repo,所以还要自己添加地址。

    1
    2
    vim /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

需要注意的有:

  1. 安装helm服务端是依然有个拉不下来的gcr镜像tiller。要么拉下来,要么在helm init时直接指定阿里的镜像进行替换。
  2. helm是从repo上给k8s安装服务,但那个repo也被墙了,helm init时也要指定阿里的repo替换默认repo
  3. 通过谷歌云安装helm时要先

    1
    2
    3
    kubectl 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"}}}}'
  4. (隐秘的坑,如果被替换的repo地址无法被k8s的dns服务器解析,白替换了)

3. 安装fission

安装文档上的一行代码往往运行不了的,看起来就是helm从github上直接直接把fission部署在集群上,但总会出现各种诡异的错误,一开始感觉是完全凭运气安装的,后来发现报错基本可以分成4类:无法下载、什么什么已存在、超时、编译出错
解决是这样的

  1. 把项目直接下载到本地,url变为本地绝对路径(虽然我一直感觉这个问题很奇怪,项目很小又不用翻墙为什么有时候会下不下来)
  2. 上次安装到一半出错了,这次安装就会报错,要把所有上次的东西删干净,再新建一个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
  3. 这个错误只在通过公司脚本安装的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
2
3
4
5
6
7
8
传镜像的代码
docker save id(XXX) > XXXXXX.tar
scp XXXXXX.tar root@XX.XX.XX.XX:/images
docker load XXXXXX.tar
docker images | grep XXX
docker images | more
docker tag id(XXX) 原名
docker save id(XXX) > XXXXXX.tar
  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使用

  1. 路径问题:触发函数时curl,FISSION_ROUTER 要换掉,若是minikube安装,直接换成minikube虚拟机地址;若是k8s安装,换成外部ip

    1
    curl http://$FISSION_ROUTER/hello 变成 curl http://35.194.204.59/hello
  2. 顺序问题:下面的每一步之间有依赖关系,顺序不能颠倒:
    创建环境(go,python,js…),创建executors和函数(创建pod),创建trigger(调用函数)

    1
    2
    3
    fission 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 /hello
  3. package打包上传问题:

报错: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源码分析,崔前辈和高前辈带我入门,没嫌弃我各种弱智的问题。

Comments

⬆︎TOP