vlambda博客
学习文章列表

基于 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 的功能,

基于 K8s 的 Serverless 架构搭建

这里简单的介绍一下上面两个命令:

创建一个 namespace, 接下来创建 kubeless 的资源对象需要依赖这个 namespace通过 kubectl create 创建所有 kubeless 依赖的资源对象

通过 sudo kubectl get po -n kubeless 查看是否已经安装成功了,如果不出意外大概等 5 分钟左右就成功运行了,如果中途出现问题,可通过: sudo kubectl describe pod [pod 名] -n kubeless 查看原因。

安装完后继续安装 kubeless 的命令行工具:

基于 K8s 的 Serverless 架构搭建

安装好之后,通过 sudo kubectl get functions 或者 kubeless function ls 查看函数,现在可以看到还没有任何的函数正在运行。

创建首个 Faas: Hello World

1.创建函数

这是一个最基础的功能,简单的演示一下获取参数和使用依赖的功能。

基于 K8s 的 Serverless 架构搭建

1.部署函数基于 K8s 的 Serverless 架构搭建

解释一下上述参数:

1.env NPM_REGISTRY 设置拉取依赖的 npm 源2.配置依赖文件 package.json3.设置 handle ,格式为: 文件名.导出的方法4.from-file 文件路径

首次部署的时候时间可能有点久,因为需要下载 nodejs 运行时。

1.调用函数

部署完后,通过:sudo kubectl get po 查看函数的 ready 状态是否已经成功了,接下来开始调用刚刚创建的函数:

基于 K8s 的 Serverless 架构搭建

通过上图中命令行调用,可以看到输出结果和函数的输出是匹配的。

但是正常情况下,我们部署的云函数不可能只用在服务器的命令行调用。kubeless 提供了丰富的触发机制,基本满足日常需求,包括:httpcrob 定时器 等等。

配置 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