前言
什么是Serverless
Serverless字面意思是无服务。但是它不代表再也不需要服务器了,而是说:开发者再也不用过多考虑服务器的问题,计算资源作为服务而不是服务器的概念出现。Serverless是一种构建和管理基于微服务架构的完整流程,允许你在服务部署级别而不是服务器部署级别来管理你的应用部署,你甚至可以管理某个具体功能或端口的部署,这就能让开发者快速迭代,更快速地开发软件。
在无服务器模型中,云提供商负责运行物理服务器并代表用户动态分配资源,用户则可以直接将代码部署到生产环境中。
无服务器计算产品通常分为两类,分别是后端即服务(BaaS)和 功能即服务(FaaS)。
- BaaS: 管理某个具体的端口。开发人员通过访问各种各样的第三方服务和应用。例如,云提供商可以提供认证服务、额外加密、云访问数据库以及高置信度使用数据。
- FaaS: 管理某个具体的功能。开发人员通过将自己实现的某个功能通过函数的形式发布到云提供商提供的服务上,通过调用具体的函数来实现功能。
在大多数情况下,当开发人员提到无服务器时,他们所指的基本是 FaaS 模型。在 FaaS 下,开发人员仍然要编写自定义服务器端逻辑,但它可以在完全由云服务提供商管理的容器中运行。
什么是FaaS
“功能即服务”(或称为 FaaS)是一种云计算服务,它允许开发人员以功能的形式来构建、计算、运行和管理这些应用包,无需维护自己的基础架构。
FaaS 是一种在无状态容器中运行的事件驱动型执行模型,这些功能将利用 FaaS 提供商的服务来管理服务器端逻辑和状态。
FaaS 解决方案可通过主流公共云提供,并可在内部置备,这样就为企业 IT 应用开发新增了一些重要的功能。获取云原生策略指南,为借助 FaaS 实施无服务器方案做好准备。
以下是 FaaS 的一些常见示例:
- IBM 云功能
- Amazon 的 AWS Lambda
- Google 云功能
- Microsoft Azure 功能(开源)
- OpenFaaS(开源)
什么是OpenFaaS
OpenFaaS一款高人气的开源的faas框架,可以直接在Kubernetes上运行,也可以基于Swarm或容器运行。
在Kubernetes上部署OpenFaaS十分简单,用到的镜像如下:
- functions/faas-netesd:0.3.4
- functions/gateway:0.6.14
- functions/prometheus:latest-k8s
- functions/alertmanager:latest-k8s
这些镜像都存储在DockerHub上。
下面就开始介绍在k8s上运行OpenFaas
前提
安装k8s。如果你没有安装,可参考我的另外一篇文章kubernetes(一)搭建简单实例,只需简单的几个步骤,就可以在本地安装k8s。
还需要对k8s的简单几个命令有一些了解,可参考kubernetes(二)常用命令,都比较简单,就当做是学习一下k8s。
搭建OpenFaaS
安装faas-cli
brew install faas-cli
OpenFaaS提供了命令行工具faas-cli,使用该工具可以管理OpenFaaS中的函数。
安装helm
brew install kubernetes-helm
Helm 是一个 Kubernetes 应用的包管理工具,用来管理 chart——预先配置好的安装包资源,有点类似于 Ubuntu 的 APT 和 CentOS 中的 YUM
启动k8s cluster
minikube start
为OpenFaas核心组件和函数创建一个namespace
kubectl apply -f https://raw.githubusercontent.com/openfaas/faas-netes/master/namespaces.yml
将openfaas加到k8s包管理中
helm repo add openfaas https://openfaas.github.io/faas-netes
升级k8s包
helm repo update
生成一个随机密码
export PASSWORD=$(head -c 12 /dev/urandom | shasum| cut -d' ' -f1)
为OpenFaas创建一个密码
kubectl -n openfaas create secret generic basic-auth --from-literal=basic-auth-user=admin --from-literal=basic-auth-password="$PASSWORD"
使用helm安装openfaas
helm upgrade openfaas --install openfaas/openfaas --namespace openfaas --set functionNamespace=openfaas-fn --set basic_auth=true
设置openfaas的入口地址
export OPENFAAS_URL=ip:port
如何查看ip:port?在.kube/config文件中clusters/cluster/server中有
等k8s中的pod都启动成功后,使用faas-cli登录
echo -n $PASSWORD | faas-cli login -g https://$OPENFAAS_URL -u admin —-password-stdin
遇到的问题
安装过程中遇到不少问题,解决之后就不好复现了。一些问题的解决方法在参考文件中可以找到,如果你有其他的什么问题,可以评论或者联系我,一起探讨。
使用faas-cli写一个简单的示例
至此OpenFaas在k8s中安装完成,下面利用OpenFaaS提供的faas-cli工具,写一个简单的函数并发布
查看OpenFaas中已有函数
faas-cli list
创建一个node函数
faas-cli new callme --lang node
结果如下
[root@localhost dev_node]# ll
total 12
drwx------ 2 root root 4096 May 9 17:39 callme
-rw------- 1 root root 157 May 9 17:39 callme.yml
drwxr-xr-x 18 root root 4096 May 9 17:39 template
[root@localhost dev_node]#
编辑callme.yml文件
将callme.yml文件中的image字段修改成你私有的docker 镜像仓库存放。
注意,这里需要你提前在 https://www.docker.com/平台注册一个账号,存放自己的镜像文件
$ cat callme.yml
version: 1.0
provider:
name: openfaas
gateway: http://127.0.0.1:8080
functions:
callyou:
lang: node
handler: ./callyou
image: yourdockername/callyou:latest
构建函数
faas-cli build -f callme.yml
推送代码
$ faas-cli push -f callme.yml
Pushing: callme to remote repository.
The push refers to a repository [docker.io/alexellis/callme]
...
此时你的代码将会被推到hub.docker中
部署代码
$ faas-cli deploy -f callme.yml
Deploying: callme.
No existing service to remove
Deployed. 200 OK
URL: http://localhost:8080/function/callme
调用代码
$ faas-cli invoke -f callme.yml callme
Reading from STDIN - hit (Control + D) to stop.
This is my message
{"status":"done"}
查看代码
faas-cli list
删除代码
faas-cli rm -f callme.yml
结束语
这篇文章参考内容比较多,安装过程中出现不少问题,如果你感兴趣一定要实际操作一遍,才能理解OpenFaaS具体是怎么运行的。详细的实现细节还需要自己去查阅更多资料,做好笔记。
参考
[1]Getting started with OpenFaaS on minikube
[2]什么是Serverless无服务器架构?
[3]什么是无服务器?
[4]什么是功能即服务(FaaS)
[5]OpenFaaS快速入门指南
[6]kubernetes(一)搭建简单实例
[7]kubernetes(二)常用命令
[8]https://github.com/openfaas/faas
[9]使用Helm管理kubernetes应用
[10]minikube Certificates
[11]第一篇章、OpenFaas 部署及Helloworld开发
[12]https://github.com/openfaas/faas-cli
[13]OpenFaaS 入门openfaas cli 配置与使用
[14]Morning coffee with the OpenFaaS CLI