faas-cli 是一款 OpenFaaS 官方工具,在faas项目中使用频繁,作为与API GateWay沟通的桥梁工具,相当重要。它用于创建、部署OpenFaas函数应用 ,支持从多种语言模板构建 (例如 Node.js, Python, CSharp and Ruby).,在实际开发中,我们只需实现模板中的handler即可,其余的构建工作交给faas-cli,此外faas-cli 也作为监控角色起作用,例如:函数调用的发起、函数运行日志查看等。这里对官方文档做一些整理、梳理常用的命令及概念。
安装
你可以通过 curl
工具或者下载发行版的二进制文件安装,安装完成后也可以为 faas-cli
命令创建个别名faas
,以后就可以使用faas来代替faas-cli.
curl -sSL https://cli.openfaas.com | sudo sh
Windows安装
window下需要安装powerShell等工具,不方便。
常用命令
帮助命令 faas-cli --help
faas-cli new
- 在当前目录下通过模板创建函数,模板可以通过openfaas github获取faas-cli login
- 登录操作,连接网关、查看部署的函数信息等需要提前登录
#登录例子
cat /var/lib/faasd/secrets/basic-auth-password | faas-cli login -s
faas-cli logout
- 登出操作faas-cli up
- 一个复合命令,包含创建、发布、部署命令集合faas-cli build
- 创建模板function的docket镜像faas-cli push
- 推送docker镜像到仓库,主要是因为k8s部署是从仓库拉取的faas-cli deploy
- 部署函数应用到本地或者远程的openfaas网关faas-cli publish
- 创建和发布交叉系统架构镜像如ARM、树莓派之类的,服务器很少用faas-cli remove
- 从openfaas网关删除函数应用faas-cli invoke
- 通过命令行发起函数请求,请求参数在STDIN中输入
root@lishuangliang-VirtualBox:/home/lishuangliang/openfaas/faastemplate# faas invoke shasum
Reading from STDIN - hit (Control + D) to stop.
hello faas
290856bb392e40b30455375608fe419c70d2abd62c7f01922e8a2479d04813a254d647ed3f75e730d8a174e36dd729c882e86a81d02f4b4d24c96ad5c98919f3 -
faas-cli store
- 可以查看、部署openFaas仓库的函数faas-cli secret
- 管理函数的密钥faas-cli auth
- (alpha) 初始化 OAuth2 认证以获取取cookiefaas-cli registry-login
- 通过用户名、密码生成docker/ecr/self仓库的认证文件
其他拓展命令:
faas-cli template pull
- 从远端仓库拉取模板 Detailed Documentation
默认模板仓库地址 of https://github.com/openfaas/templates.git
也可以通过下面的配置自定义
- 通过faas-cli 指定,优先级最高
- 通过环境变量
OPENFAAS_TEMPLATE_URL
配置,优先级次之
Note:openFaas默认网关地址为 127.0.0.1:8080
可以通过下面三种方式配置自定义地址
--gateway
参数指定,优先级最高--yaml
/-f
flag orstack.yml
通过当前目录yml文件指定,优先级次之OPENFAAS_URL
环境变量指定,优先级再次之
使用 Kubernetes部署openfaas的可以通过 .bash_rc
file文件配置:
export OPENFAAS_URL=http://127.0.0.1:31112
模板仓库
通过模板仓库可以很方便地获取官方的、第三方社区模板。
- 查找
模板查找命令: faas-cli template store list
Note: You can set your own custom store location with
--url
flag or setOPENFAAS_TEMPLATE_STORE_URL
environmental variable
- 拉取
从模板仓库拉取模板仅需要指定模板的名字即可,例如: faas-cli template store pull go
。当然也可以加上仓库名,例如: faas-cli template store pull openfaas/go
- 详情
可以通过 template store describe
命令来指定获取模板的详细信息,比如刚才的 go
模板: faas-cli template store describe go
Note: This feature is still in experimental stage and in the future the CLI verbs might be changed
模板构建
构建命令:
faas-cli new FUNCTION_NAME --lang python/node/go/ruby/Dockerfile/etc
当然也可以在 YAML 配置文件中指定编程语言 lang: node/python/go/csharp/ruby
使用模板构建优势
- openfaas支持非常多常用的语言
- 非常简单 - 仅需要更改一个文件
- 通过 Gemfile / requirements.txt or package.json 等,指定依赖
- 模板可自定义
Note:Python 模板可能需要 gcc
编译器或者其他依赖 ? 这完全没问题。你可以对任意的模板的Dockerfile 或者代码进行自定义.。创建自己的文件夹,然后从模板仓库中把复制模板过来,接着进行修改就可以了。See also: faas-cli new --help
第三方社区模板
由第三方社区创建、维护的模板也可以加进自己本地openfaas系统,使用命令 faas-cli template pull
更多第三方社区模板.
YAML stack file使用
快速指引
A YAML stack file 集合了不同函数。Read the YAML reference guide in the OpenFaaS docs.
你可以定义独立函数或者函数集合在一个 YAML 文件中, 这样 CLI 工具使用起来更加方便快捷。你也可以通过YAML文件来部署OpenFaaS 实例. faas-cli 会默认使用当前目录的 stack.yaml
这里是一个使用 stack.yml
文件的样例,它包含了镜像仓库的使用
provider:name: openfaasgateway: http://127.0.0.1:8080functions:url-ping:lang: pythonhandler: ./sample/url-pingimage: alexellis2/faas-urlping
这个url-ping 函数是由Python实现的一个ping工具. 我们仅仅需要实现 handler.py
文件内容的编写,以及在 requirements.txt
.罗列Python模块的依赖。
- Build the files in the .yml file:
$ faas-cli build
-f
yml文件或者yml文件的URL地址. 早期版本-f
flag is:--yaml
.
yml文件还可以通过 HTTP(s)下载指定:
$ faas-cli build -f https://raw.githubusercontent.com/openfaas/faas-cli/master/stack.yml
接下来,通过Python 模板创建Docker 镜像将会生成,镜像名: alexellis2/faas-urlping.
- 部署函数
你可以通过下面的命令部署函数:
$ faas-cli deploy
环境变量替换
faas-cli 工具支持使用环境变量替换模板内容,这样就可以做到使用一个模板文件实现多个不同账号、版本、环境的配置。
例如,,在项目中经常用到Docker 仓库的用户账号信息,对于持续集成的镜像经常是推送到 exampleco,但是在开发环境时,你可能更喜欢使用自己的账号推送,如 alexellis2
.
functions:url-ping:lang: pythonhandler: ./sample/url-pingimage: ${DOCKER_USER:-exampleco}/faas-url-ping:0.2
使用默认配置:
$ faas-cli build
$ DOCKER_USER="" faas-cli build
覆盖默认配置,使用 “alexellis2”:
$ DOCKER_USER="alexellis2" faas-cli build
See also: envsubst package from Drone.
通过 curl
调用函数
你可以通过 curl
创建HTTP POST:
- 通过
-d
指定数据例如-d "my data here"
- 或者通过
--data-binary @filename.txt
来发送文件 - 还可以通过
--data-binary @-
来传输标准输入输出
$ curl -d '{"hello": "world"}' http://127.0.0.1:8080/function/nodejs-echo
{ nodeVersion: 'v6.9.1', input: '{"hello": "world"}' }$ curl --data-binary @README.md http://127.0.0.1:8080/function/nodejs-echo$ uname -a | curl http://127.0.0.1:8080/function/nodejs-echo--data-binary @-