简介

OpenFaaS是打包源代码、二进制文件或者容器作为Serverless函数编程的框架,可以在windows、linux等平台上运行。
使用它构建函数的流程如下:

  1. 通过模板new创建函数
  2. build函数为docker镜像
  3. push镜像到docker registry
  4. deploy函数
  5. invoke函数

其实这些步骤对应的是faas-cli客户端的几个命令,下面会提到,同时,我也围绕这几个流程来扩展它的实际应用。

学习须知

本博客是基于linux、k8s、dockers、openfaas,使用的是root用户。k8sdocker的版本及安装参见前面的博客,openfaas直接使用的最新的版本。

本博客是使用jsexpress框架作为发布的函数,其实我们不需要关注这个express框架,只需要记住它帮我们启动了一个nodejsweb服务器。

基于k8s部署openfaas

官网提供了三种方式部署openfaasarkadehelm3和静态yaml文件。
官网推荐使用arkade,但学习成本高。
helm3稍微麻烦点,但是可以修改配置文件实现细粒度的设置。
静态yaml好像没有过多的介绍,但是在openfaasgit上,看到了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相关的命名空间,分别为openfaasopenfaas-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相关的podkubectl get pods -A查看pod的状态,这些pod可能启动起来会太耗时,我的耗时半小时才全部启动成功,和网速有关系
    在这里插入图片描述

  • kubectl delete -f ./yaml/
    这个是移除所有pod的命令

查看openfaas界面

openfaas所有的pod都启动成功后,openfaas默认端口为31112,使用google浏览器登录,360浏览器不兼容,打不开。

登录的账号密码是上面命令中配置的。

在这里插入图片描述

安装faas-cli客户端

faas-cliopenfaas官方的客户端,用来操作上面提到的new、build、push、deploy等命令的。
官网有安装教程,包括linuxwindows,这里直接来安装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.jspackage.json两个文件,handler.js是一个简单的js文件,在函数部署后,openfaas会调用handler.js文件。说到这里,你需要记住的是,handler.js的内容可以自定义,但是要符合openfaas的模板的要求。
    在这里插入图片描述

  • flow-001.yml
    flow-001.yml文件是faas-cli操作的文件,build、push、deploy等命令都要用到这个文件。文件的内容是openfaas识别的,不要和k8syml文件混肴。

在实际应用中,我们会把自定义的文件放到flow-001文件夹中,通过修改flow-001.yml文件,定义函数push、deploy的镜像地址、镜像版本、拉取镜像策略,函数部署后请求读写的超时时间、最大最小cpumemory等配置。

注:

  1. flow-001.yml中的gateway要和faas-cli login登录的网关保存一致,否则deploy时会报错,返回401
  2. 如果cpumemory大小分配不当,会导致函数部署不成功,或者函数在运行过程中导致内存溢出

例如下面的截图,左侧是外网的配置(helm3部署的openfaas),右侧是测试的例子
在这里插入图片描述

faas-cli build

在执行此命令前,需要做三件事:

  1. 下载openfaas的的模板文件,或者你安装了gitopenfaas自动下载,否则执行会报错。因为这个命令会根据你使用的语言,拷贝相应的模板文件进行打包。
    在这里插入图片描述
  2. 修改模板中的文件,例如使用node12,可以修改对应文件夹中的文件,我们关心最多的就是Dockerfile这个文件,可以自定义容器,其他文件不需要修改。另外function文件夹中的文件在执行build命令时,会被覆盖,下面再说。
    在这里插入图片描述
    在这里插入图片描述
  3. 将修改的模板保存起来,以后每次发布新函数,都用自己修改的模板发布。

案例:

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-netesNamespaces下有提到

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函数和服务都部署到OpenFaaSOpenFaaS fn名称空间。要更改名称空间,请使用helm

拓展

  • 在使用helm部署openfaas后,可以更方便的拓展命名空间,这样可以根据命名空间做资源配额,资源隔离。
  • 更好的利用k8s带来的便利
  • 结合业务映射openfaas返回的url
  • 快速开发轻量级应用
Logo

低代码爱好者的网上家园

更多推荐