低代码平台之部署openfaas及基本操作
简介
OpenFaaS是打包源代码、二进制文件或者容器作为Serverless函数编程的框架,可以在windows、linux等平台上运行。
使用它构建函数的流程如下:
- 通过模板
new创建函数 build函数为docker镜像push镜像到docker registrydeploy函数invoke函数
其实这些步骤对应的是faas-cli客户端的几个命令,下面会提到,同时,我也围绕这几个流程来扩展它的实际应用。
学习须知
本博客是基于linux、k8s、dockers、openfaas,使用的是root用户。k8s和docker的版本及安装参见前面的博客,openfaas直接使用的最新的版本。
本博客是使用js的express框架作为发布的函数,其实我们不需要关注这个express框架,只需要记住它帮我们启动了一个nodejs的web服务器。
基于k8s部署openfaas
官网提供了三种方式部署openfaas:arkade、helm3和静态yaml文件。
官网推荐使用arkade,但学习成本高。
helm3稍微麻烦点,但是可以修改配置文件实现细粒度的设置。
静态yaml好像没有过多的介绍,但是在openfaas的git上,看到了faas-netes仓库,通过一些介绍,我猜测是指这个。

现在,咱们就用faas-netes来搞吧,因为最简单,随后再研究helm3部署。
注:我们外网使用的是helm3进行部署的。
使用faas-netes部署
没有安装git的话,就先安装git吧,这里就不多介绍git安装了。
git clone https://github.com/openfaas/faas-netes
cd faas-netes
kubectl apply -f namespaces.yml
kubectl -n openfaas create secret generic basic-auth \
--from-literal=basic-auth-user=admin \
--from-literal=basic-auth-password=admin
kubectl apply -f ./yaml/
上面一大串的代码,直接复制粘贴,其中
-
kubectl apply -f namespaces.yml
是创建openfaas相关的命名空间,分别为openfaas和openfaas-fn两个,以后发布的函数会被部署在openfaas-fn命名空间下。

-
kubectl -n openfaas create secret generic basic-auth --from-literal=basic-auth-user=admin --from-literal=basic-auth-password=admin
新建openfaas ui界面的账号密码 -
kubectl apply -f ./yaml/
执行这个命令后,会启动openfaas相关的pod,kubectl get pods -A查看pod的状态,这些pod可能启动起来会太耗时,我的耗时半小时才全部启动成功,和网速有关系

-
kubectl delete -f ./yaml/
这个是移除所有pod的命令
查看openfaas界面
openfaas所有的pod都启动成功后,openfaas默认端口为31112,使用google浏览器登录,360浏览器不兼容,打不开。
登录的账号密码是上面命令中配置的。

安装faas-cli客户端
faas-cli是openfaas官方的客户端,用来操作上面提到的new、build、push、deploy等命令的。
官网有安装教程,包括linux和windows,这里直接来安装linux版本。
curl -sSL https://cli.openfaas.com | sudo sh
如果上面的命令提示你去官网手动下载,那么你就去官网下一个faas-cli,按照提示去操作就可以了。
[root@yanzhao opt]# curl -sSL https://cli.openfaas.com | sudo sh
Finding latest version from GitHub
Failed while attempting to install faas-cli. Please manually install:
1. Open your web browser and go to https://github.com/openfaas/faas-cli/releases
2. Download the latest release for your platform. Call it 'faas-cli'.
3. chmod +x ./faas-cli
4. mv ./faas-cli /usr/local/bin
5. ln -sf /usr/local/bin/faas-cli /usr/local/bin/faas
使用faas-cli登录openfaas
export OPENFAAS_URL=111.229.208.187:31112
faas-cli login -u admin -p admin --gateway http://111.229.208.187:31112
永久有效
echo export OPENFAAS_URL=111.229.208.187:31112 >> ~/.bashrc
source ~/.bashrc
faas-cli基本操作
这里介绍的是上面提到的new、build、push、deploy等命令,当然也会扩展一些其他内容。
faas-cli new
案例:
faas-cli new flow-001 --lang node12
使用模板创建函数,生成flow-001文件夹和flow-001.yml文件。

-
flow-001文件夹
flow-001文件夹中包含handler.js和package.json两个文件,handler.js是一个简单的js文件,在函数部署后,openfaas会调用handler.js文件。说到这里,你需要记住的是,handler.js的内容可以自定义,但是要符合openfaas的模板的要求。

-
flow-001.yml
flow-001.yml文件是faas-cli操作的文件,build、push、deploy等命令都要用到这个文件。文件的内容是openfaas识别的,不要和k8s的yml文件混肴。
在实际应用中,我们会把自定义的文件放到flow-001文件夹中,通过修改flow-001.yml文件,定义函数push、deploy的镜像地址、镜像版本、拉取镜像策略,函数部署后请求读写的超时时间、最大最小cpu和memory等配置。
注:
- flow-001.yml中的
gateway要和faas-cli login登录的网关保存一致,否则deploy时会报错,返回401 - 如果
cpu和memory大小分配不当,会导致函数部署不成功,或者函数在运行过程中导致内存溢出
例如下面的截图,左侧是外网的配置(helm3部署的openfaas),右侧是测试的例子

faas-cli build
在执行此命令前,需要做三件事:
- 下载
openfaas的的模板文件,或者你安装了git,openfaas自动下载,否则执行会报错。因为这个命令会根据你使用的语言,拷贝相应的模板文件进行打包。

- 修改模板中的文件,例如使用
node12,可以修改对应文件夹中的文件,我们关心最多的就是Dockerfile这个文件,可以自定义容器,其他文件不需要修改。另外function文件夹中的文件在执行build命令时,会被覆盖,下面再说。


- 将修改的模板保存起来,以后每次发布新函数,都用自己修改的模板发布。
案例:
faas-cli build -f flow-001.yml
执行build命令,会生成build文件夹,目录结构如下,其中Dockerfile、index.js、package.json、template.yml都是从模板中拷贝的,function文件夹也是从模板拷贝的,但是function中的文件是拷贝faas-cli new生成的文件,也就是我们自定义的handler.js文件。

faas-cli push
push命令会把镜像推送到docker仓库,推送的地址就是flow-001.yml中配置的image的地址。
openfaas默认的策略是每次部署都要从docker仓库拉取镜像,因此要先推送到docker仓库。当然这个策略可以修改,但是不建议修改,因为怕拉取不到已修改的镜像。
我使用的docker仓库是https://hub.docker.com/
案例:
docker login -u username -p password
faas-cli push -f flow-001.yml
faas-cli deploy
在部署前,要先配置docker的登录信息,为了解决k8s拉取镜像时校验登录的问题。
dockerregistrykey=`base64 -w 0 ~/.docker/config.json`
cat > dockerregistrykey.yaml <<EOF
apiVersion: v1
kind: Secret
metadata:
name: dockerregistrykey
data:
.dockerconfigjson: $dockerregistrykey
type: kubernetes.io/dockerconfigjson
EOF
kubectl delete secret dockerregistrykey -n openfaas-fn
kubectl create -f dockerregistrykey.yaml -n openfaas-fn
上面又是一大串代码,直接拷贝执行,主要是把docker登录的信息(faas-cli push时已经登录了)生成k8s认识的secret密钥。
案例:
faas-cli deploy -f flow-001.yml

执行完deploy后返回了http://111.229.208.187:31112/function/flow-001.openfaas-fn,我们可以直接在google中调用此地址。

faas-cli up
up是集build、push、deploy为一体的命令。
添加新的命名空间
https://github.com/openfaas/faas-netes 的Namespaces下有提到
By default all OpenFaaS functions and services are deployed to the openfaas
and openfaas-fn namespaces. To alter the namespace use the helm chart.
默认情况下,所有OpenFaaS函数和服务都部署到OpenFaaS和OpenFaaS fn名称空间。要更改名称空间,请使用helm。
拓展
- 在使用
helm部署openfaas后,可以更方便的拓展命名空间,这样可以根据命名空间做资源配额,资源隔离。 - 更好的利用
k8s带来的便利 - 结合业务映射
openfaas返回的url - 快速开发轻量级应用