OpenFaaS
是打包源代码、二进制文件或者容器作为Serverless
函数编程的框架,可以在windows、linux
等平台上运行。
使用它构建函数的流程如下:
new
创建函数build
函数为docker
镜像push
镜像到docker registry
deploy
函数invoke
函数其实这些步骤对应的是faas-cli
客户端的几个命令,下面会提到,同时,我也围绕这几个流程来扩展它的实际应用。
本博客是基于linux、k8s、dockers、openfaas
,使用的是root
用户。k8s
和docker
的版本及安装参见前面的博客,openfaas
直接使用的最新的版本。
本博客是使用js
的express
框架作为发布的函数,其实我们不需要关注这个express
框架,只需要记住它帮我们启动了一个nodejs
的web
服务器。
官网提供了三种方式部署openfaas
:arkade
、helm3
和静态yaml
文件。
官网推荐使用arkade
,但学习成本高。
helm3
稍微麻烦点,但是可以修改配置文件实现细粒度的设置。
静态yaml
好像没有过多的介绍,但是在openfaas
的git
上,看到了faas-netes
仓库,通过一些介绍,我猜测是指这个。
现在,咱们就用faas-netes
来搞吧,因为最简单,随后再研究helm3
部署。
注:我们外网使用的是helm3
进行部署的。
没有安装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
所有的pod
都启动成功后,openfaas
默认端口为31112,使用google
浏览器登录,360浏览器不兼容,打不开。
登录的账号密码是上面命令中配置的。
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
这里介绍的是上面提到的new、build、push、deploy
等命令,当然也会扩展一些其他内容。
案例:
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
等配置。
注:
gateway
要和faas-cli login
登录的网关保存一致,否则deploy
时会报错,返回401cpu
和memory
大小分配不当,会导致函数部署不成功,或者函数在运行过程中导致内存溢出例如下面的截图,左侧是外网的配置(helm3
部署的openfaas
),右侧是测试的例子
在执行此命令前,需要做三件事:
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
文件。
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
在部署前,要先配置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
中调用此地址。
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