基于 K8s 的 Serverless 架构搭建
随着 Serverless 的风逐渐在前端圈子盛行,许多人(包括我)都想一窥 Serverless 的风貌。在传统的后端服务中,通常一个服务会对多个事件进行响应,而采用 Serverless 则是通过构建一个微服务或者微功能来对一个事件进行响应。
我首次是在小程序的云函数中接触的这种 Faas 的模式,我只需要编写对应的函数功能,然后提交,就形成了一个后端服务,完全免去了构建发布的流程,也就是 Serverless 为代表的 NoOps 的概念,后来基于此,我在 egg 上通过动态运行代码,提供了各个函数的运行模式,也能够免去构建、发布流程,从而快速的开发一个功能,但是问题是,代码运行在 egg 之上,只能提供整个 egg 框架提供的能力,不能单独安装独立依赖,需要依赖 egg 服务的稳定性等等。
Docker 和 k8s
鉴于我们前端在关注点上更靠前,对 Docker 和 K8s 可能不太了解, 这里简单的介绍一下 Docker 和 K8s,当然我也是前端,如有描述不当的地方,还望指出。
Docker
Docker 作为一种应用的容器引擎,能够提供一种独立且隔离的应用运行环境,通过打包成 Docker 镜像,能够让快速的让代码运行在安装了 Docker 的机器上。
kubernetes
Kubernetes,简称K8s,8 用来代替中间的 8 个字母,K8s 是一种容器编排引擎,它能够自动的将容器部署在指定的机器上、以及对应用的重启、升级、伸缩、负载等等。
安装 K8s
k8s 的一个特点之一,我认为就是安装起来特费劲,作为生产环境,可以采用 kubeadm
一键安装部署,或在采用二进制的方式安装,由于篇幅关系,这里不展示这两种部署方式的安装过错,而是采用更为简单的 minikube
进行安装,如果各位有时间和精力可以试一试采用二进制的方式进行安装,既能对 k8s 有所了解,出现问题也容易定位到是哪个环节。
Minikube
正常情况,应该会见到成功的提示,但是还需要检查一下各个 pod 是否运行正常:
如果各项正常,就可以在 k8s 上部署函数了。
安装 Kubeless
Kubeless
是 Kubernetes
原生无服务器架构之一,这里采用它来实现 Faas 的功能,
这里简单的介绍一下上面两个命令:
•创建一个 namespace
, 接下来创建 kubeless
的资源对象需要依赖这个 namespace
•通过 kubectl create
创建所有 kubeless
依赖的资源对象
通过 sudo kubectl get po -n kubeless
查看是否已经安装成功了,如果不出意外大概等 5 分钟左右就成功运行了,如果中途出现问题,可通过: sudo kubectl describe pod [pod 名] -n kubeless
查看原因。
安装完后继续安装 kubeless
的命令行工具:
安装好之后,通过 sudo kubectl get functions
或者 kubeless function ls
查看函数,现在可以看到还没有任何的函数正在运行。
创建首个 Faas: Hello World
1.创建函数
这是一个最基础的功能,简单的演示一下获取参数和使用依赖的功能。
1.部署函数
解释一下上述参数:
1.env NPM_REGISTRY 设置拉取依赖的 npm 源2.配置依赖文件 package.json
3.设置 handle ,格式为: 文件名
.导出的方法
4.from-file
文件路径
首次部署的时候时间可能有点久,因为需要下载 nodejs 运行时。
1.调用函数
部署完后,通过:sudo kubectl get po
查看函数的 ready 状态是否已经成功了,接下来开始调用刚刚创建的函数:
通过上图中命令行调用,可以看到输出结果和函数的输出是匹配的。
但是正常情况下,我们部署的云函数不可能只用在服务器的命令行调用。kubeless
提供了丰富的触发机制,基本满足日常需求,包括:http
、crob 定时器
等等。
配置 Ingress
Ingress 是用于暴露内部 Server 的一种方式,Ingress 由 Ingress Controller
和 Ingress 服务组成,Ingress Controller
用于监听集群中的 ingress
和 service
,然后动态的刷新配置,从而达到动态管理访问域名与集群中内部服务的关系。
kubeless
支持多种类型的 ingress
, 由于本文采用的是 minikube
搭建的集群,就可以直接通过 minikube addons enable ingress
来启动 ingress,对于其他的 ingress
, 部署起来也不难,这里就不再多讲。
绑定域名
启动完 ingress
之后,就可以直接绑定域名:
然后为了测试优先,修改本地 Hosts 之后测试输出结果:
部署 kubeless-ui
为了更直观的增删改查函数,kubeless 提供了 kubeless ui
这个工具:
kubectl create -f \
https://raw.githubusercontent.com/kubeless/kubeless-ui/master/k8s.yaml
通过 create 安装完后,通过: sudo kubectl get svc -n kubeless
可以看到对应的端口,然后通过 http://IP:端口
就能访问到 kubeless ui
界面了,然后就能看到刚刚创建的 function-name
这个函数了。
完结
到这里,基本就结束了,kubeless-ui
已经比较长时间没有维护了,但是可以利用其中的一些 API 做一个团队内部的 vscode
插件,这样就可以更为便捷的对函数修改、测试调用等等
References
[1]
minikube下载: https://github.com/kubernetes/minikube/releases