作者选择了 多样性在技术基金作为 写给捐款计划的一部分接受捐款。
介绍
无服务器架构将服务器实例隐藏在开发者身上,通常会暴露一个API,允许开发人员在云中运行他们的应用程序. 这种方法有助于开发人员快速部署应用程序,因为他们可以将配置和维护实例留给适当的DevOps团队。
运行在无服务器平台上的应用程序被称为 _serverless functions。 一个函数是可执行的集装箱代码,用于执行特定操作。
OpenFaaS是一个免费的开源框架,用于构建和托管无服务器功能. 官方支持 Docker Swarm和 Kubernetes,它允许您使用强大的API,命令行界面或Web UI部署您的应用程序。
在本教程中,您将设置和使用OpenFaaS与Docker Swarm在Ubuntu 16.04上运行,并通过设置 Traefik与Let's Encypt来保护其Web UI和API。
前提条件
要遵循这个教程,你需要:
*Ubuntu 16.04 运行在您的本地机器上。 您可以使用其他分发和操作系统,但要确保您为您的操作系统使用适当的OpenFaaS脚本并安装这些先决条件所列出的所有依赖性.
- 安装在本地机器上的
git'、
curl'和jq'。 你们将使用
git'来克隆OpenFaaS寄存器,curl'来测试API,并用
jq'来将API的原始JSON反应转换为人可读的JSON. 要安装此设置所需的依赖性, 请使用以下命令 :sudo apt- get update QQ sudo apt- get sirt git girl jq
- Docker已安装,遵循[如何在Ubuntu 16.04上安装和使用Docker]的第1步和第2步(https://andsky.com/tech/tutorials/how-to-install-and-use-docker-on-ubuntu-16-04).
- A [Docker Hub] (https://hub.docker.com) 账户. 为了向OpenFaaS部署功能,需要在公共集装箱登记处公布这些功能。 我们将使用多克赫克来进行这个教程,因为它既免费又被广泛使用. 请使用
docker登录
命令,在本地机器上认证多克。 - [Docker Machine] (https://docs.docker.com/machine/)已安装,遵循[在Ubuntu 16.04上如何用Docker Machine提供和管理远程Docker主机(https://andsky.com/tech/tutorials/how-to-provision-and-manage-remote-docker-hosts-with-docker-machine-on-ubuntu-16-04).
- DigitalOcean个人访问信使. 要创建符号,请遵循这些指示. *一个由3个节点组成的多克鼠标集群,由以下提供[如何在Ubuntu 16.04上用多克鼠标和数字海洋来创建多克鼠标容器集群 (https://andsky.com/tech/tutorials/how-to-create-a-cluster-of-docker-containers-with-docker-swarm-and-digitalocean-on-ubuntu-16-04).
- 一个完全注册的域名,并有A个记录,指向多克Swarm中的一个实例. 在整个教程中,你可以看到example.com 是一个示例域. 您应该用自己的域名来替换它, 您可以在 [Namecheap] (https://namecheap.com/) 上购买, 或者在 [Freenom] (http://www.freenom.com/en/index.html 上免费获取 。 您也可以选择不同的域名登记员。 (英语)
步骤1:下载OpenFaaS并安装OpenFaaS CLI
要在您的 Docker Swarm 中部署 OpenFaaS,您需要下载部署宣言和脚本. 获取它们的最简单方法是克隆官方的 OpenFaas 存储库并检查相应的标签,这代表了 OpenFaaS 发布。
除了克隆存储之外,您还将安装FaaS CLI,一个强大的命令行实用程序,您可以使用它来管理和部署您的终端的新功能。它提供了在大多数主要编程语言中创建自己的函数的模板。
对于本教程,您将部署 OpenFaaS v0.8.9 虽然部署其他版本的步骤应该是相似的,但请确保检查 project changelog,以确保没有任何突破性更改。
首先,导航到您的主目录并运行以下命令来克隆存储库到 `~/faas' 目录:
1cd ~
2git clone https://github.com/openfaas/faas.git
导航到新创建的 `~/faas’ 目录:
1cd ~/faas
当您克隆存储库时,您将从主分支中获取包含最新的更改的文件. 因为破坏更改可能会进入主分支,所以不建议用于生产。
1git checkout 0.8.9
输出包含成功支票的消息和对对该分支进行更改的警告:
1[secondary_label Output]
2Note: checking out '0.8.9'.
3
4You are in 'detached HEAD' state. You can look around, make experimental
5changes and commit them, and you can discard any commits you make in this
6state without impacting any branches by performing another checkout.
7
8If you want to create a new branch to retain commits you create, you may
9do so (now or later) by using -b with the checkout command again. Example:
10
11 git checkout -b <new-branch-name>
12
13HEAD is now at 8f0d2d1 Expose scale-function endpoint
如果您看到任何错误,请确保在继续之前按照屏幕上的说明来解决它们。
随着 OpenFaaS 存储库下载,完成必要的 manif 文件,让我们继续安装 FaaS CLI。
安装 FaaS CLI 的最简单方法是使用官方脚本. 在您的终端中,导航到您的主目录并使用以下命令下载脚本:
1cd ~
2curl -sSL -o faas-cli.sh https://cli.openfaas.com
這將將下載「mc.dll.dll 脚本到您的主目錄. 在執行脚本之前,最好檢查內容:
1less faas-cli.sh
您可以通过按q
来退出预览版。一旦您验证了脚本的内容,您可以通过向脚本提供可执行的权限来进行安装,并将其执行。
1chmod +x faas-cli.sh
2sudo ./faas-cli.sh
输出包含有关安装进度和您已安装的 CLI 版本的信息:
1[secondary_label Output]
2x86_64
3Downloading package https://github.com/openfaas/faas-cli/releases/download/0.6.17/faas-cli as /tmp/faas-cli
4Download complete.
5
6Running as root - Attempting to move faas-cli to /usr/local/bin
7New version of faas-cli installed to /usr/local/bin
8Creating alias 'faas' for 'faas-cli'.
9 ___ _____ ____
10 / _ \ _ __ ___ _ __ | ___|_ _ __ _/ ___|
11| | | | '_ \ / _ \ '_ \| |_ / _` |/ _` \___ \
12| |_| | |_) | __/ | | | _| (_| | (_| |___) |
13 \___/| .__/ \___|_| |_|_| \__,_|\__,_|____/
14 |_|
15
16CLI:
17 commit: b5597294da6dd98457434fafe39054c993a5f7e7
18 version: 0.6.17
如果您看到错误,请确保通过遵循屏幕上的说明来解决它,然后继续使用教程。
在此时,您已安装了 FaaS CLI. 若要了解有关您可以使用的命令的更多信息,请在没有任何论点的情况下执行 CLI:
1faas-cli
输出显示可用的命令和旗帜:
1[secondary_label Output]
2 ___ _____ ____
3 / _ \ _ __ ___ _ __ | ___|_ _ __ _/ ___|
4| | | | '_ \ / _ \ '_ \| |_ / _` |/ _` \___ \
5| |_| | |_) | __/ | | | _| (_| | (_| |___) |
6 \___/| .__/ \___|_| |_|_| \__,_|\__,_|____/
7 |_|
8
9Manage your OpenFaaS functions from the command line
10
11Usage:
12 faas-cli [flags]
13 faas-cli [command]
14
15Available Commands:
16 build Builds OpenFaaS function containers
17 cloud OpenFaaS Cloud commands
18 deploy Deploy OpenFaaS functions
19 help Help about any command
20 invoke Invoke an OpenFaaS function
21 list List OpenFaaS functions
22 login Log in to OpenFaaS gateway
23 logout Log out from OpenFaaS gateway
24 new Create a new template in the current folder with the name given as name
25 push Push OpenFaaS functions to remote registry (Docker Hub)
26 remove Remove deployed OpenFaaS functions
27 store OpenFaaS store commands
28 template Downloads templates from the specified github repo
29 version Display the clients version information
30
31Flags:
32 --filter string Wildcard to match with function names in YAML file
33 -h, --help help for faas-cli
34 --regex string Regex to match with function names in YAML file
35 -f, --yaml string Path to YAML file describing function(s)
36
37Use "faas-cli [command] --help" for more information about a command.
您现在已经成功获取了 OpenFaaS 宣言并安装了 FaaS CLI,您可以使用它从终端管理您的 OpenFaaS 实例。
~/faas
目录包含来自0.8.9
版本的文件,这意味着您现在可以将OpenFaaS部署到您的Docker Swarm。
步骤 2 – 配置 Traefik
Traefik 是一个具有 Docker 意识的反向代理程序,由 Let's Encrypt 提供的 SSL 支持。SSL 协议确保您通过在节点之间加密发送和接收的数据来安全地与 Swarm 集群进行通信。
要在 OpenFaaS 中使用 Traefik,您需要修改 OpenFaaS 部署宣言以包括 Traefik,并告诉 OpenFaaS 使用 Traefik,而不是直接将其服务暴露在互联网上。
返回~/faas
目录并在文本编辑器中打开 OpenFaaS 部署宣言:
1cd ~/faas
2nano ~/faas/docker-compose.yml
<$>[注] 注: Docker Compose 显示文件使用 YAML 格式化,这严格禁止卡,并需要两个空格来插入。
OpenFaaS部署由服务
指令定义的几个服务组成,这些服务提供运行 OpenFaaS、OpenFaaS API 和 Web UI 以及 Prometheus 和 AlertManager 所需的依赖性(用于处理指标)。
在服务
部分的开始,添加一个名为traefik
的新服务,该服务使用traefik:v1.6
图像进行部署:
1[label ~/faas/docker-compose.yml]
2version: "3.3"
3services:
4 traefik:
5 image: traefik:v1.6
6 gateway:
7 ...
Traefik 图像来自 Traefik Docker Hub 存储库,您可以找到所有可用的图像列表。
接下来,让我们指示 Docker 使用命令
指令运行 Traefik. 这将运行 Traefik,配置它以与 Docker Swarm 工作,并使用 Let's Encrypt 提供 SSL。
--docker.*
:这些旗帜告诉Traefik使用Docker,并指定它在Docker Swarm群集中运行。--web=true
: 这个旗帜允许Treefik的Web UI。--defaultEntryPoints
和--entryPoints
: 这些旗帜定义要使用的入口点和协议。 在我们的情况下,这包括在端口80 上的 HTTP 和在端口
443 的 HTTPS。--acme.*
: 这些旗帜告诉Treefik使用 ACME来生成 Let's Encrypt 证书以确保您的OpenFaaS群集使用SSL。
请确保在--acme.domains
和--acme.email
旗帜中的example.com
域名位置持有者被用来访问 OpenFaaS 的域名取代。 您可以通过将它们分开以一个字符号和空间来指定多个域名。 电子邮件地址用于 SSL 通知和警报,包括证书到期警报。 在这种情况下,Traefik 会自动处理更新证书,以便您可以忽视到到到期警报。
添加下列代码块在图像
指令下方,并在网关
上方:
1[label ~/faas/docker-compose.yml]
2...
3 traefik:
4 image: traefik:v1.6
5 command: -c --docker=true
6 --docker.swarmmode=true
7 --docker.domain=traefik
8 --docker.watch=true
9 --web=true
10 --defaultEntryPoints='http,https'
11 --entryPoints='Name:https Address::443 TLS'
12 --entryPoints='Name:http Address::80'
13 --acme=true
14 --acme.entrypoint='https'
15 --acme.httpchallenge=true
16 --acme.httpchallenge.entrypoint='http'
17 --acme.domains='example.com, www.example.com'
18 --acme.email='[email protected]'
19 --acme.ondemand=true
20 --acme.onhostrule=true
21 --acme.storage=/etc/traefik/acme/acme.json
22...
有了命令
指令,让我们告诉Traefik将哪些端口暴露在互联网上。Traefik使用端口8080
进行操作,而OpenFaaS将使用端口80
进行非安全通信,而端口443
进行安全通信。
在命令
指令下方添加下面的端口
指令。port-internet:port-docker
标注确保左侧的端口被Traefik暴露在互联网上,右侧的集装箱端口的地图:
1[label ~/faas/docker-compose.yml]
2 ...
3 command:
4 ...
5 ports:
6 - 80:80
7 - 8080:8080
8 - 443:443
9 ...
接下来,使用卷
指令,将 Docker 接口文件从运行 Docker 的主机安装到 Traefik. Docker 接口文件与 Docker API 进行通信,以便管理您的容器并获取有关其的详细信息,例如容器数量和其 IP 地址。
网络
指令指示Traefik使用与OpenFaaS一起部署的功能
网络,该网络确保功能可以与系统的其他部分(包括API)进行通信。
部署
指示 Docker 只在 Docker Swarm 管理节点上运行 Traefik。
在港口指令
下面添加以下指令:
1[label ~/faas/docker-compose.yml]
2 ...
3 volumes:
4 - "/var/run/docker.sock:/var/run/docker.sock"
5 - "acme:/etc/traefik/acme"
6 networks:
7 - functions
8 deploy:
9 placement:
10 constraints: [node.role == manager]
此时,traefik
服务区块应该是这样的:
1[label ~/faas/docker-compose.yml]
2version: "3.3"
3services:
4 traefik:
5 image: traefik:v1.6
6 command: -c --docker=true
7 --docker.swarmmode=true
8 --docker.domain=traefik
9 --docker.watch=true
10 --web=true
11 --defaultEntryPoints='http,https'
12 --entryPoints='Name:https Address::443 TLS'
13 --entryPoints='Name:http Address::80'
14 --acme=true
15 --acme.entrypoint='https'
16 --acme.httpchallenge=true
17 --acme.httpchallenge.entrypoint='http'
18 --acme.domains='example.com, www.example.com'
19 --acme.email='[email protected]'
20 --acme.ondemand=true
21 --acme.onhostrule=true
22 --acme.storage=/etc/traefik/acme/acme.json
23 ports:
24 - 80:80
25 - 8080:8080
26 - 443:443
27 volumes:
28 - "/var/run/docker.sock:/var/run/docker.sock"
29 - "acme:/etc/traefik/acme"
30 networks:
31 - functions
32 deploy:
33 placement:
34 constraints: [node.role == manager]
35
36 gateway:
37 ...
虽然此配置确保 Traefik 将与 OpenFaaS 一起部署,但您还需要配置 OpenFaaS 以便与 Traefik 一起工作。
该网关
服务提供您可以使用的 API 网关来部署、运行和管理您的功能,它处理指标(通过 Prometheus)和自动扩展,并托管 Web UI。
我们的目标是使用Traefik将门户
服务曝光,而不是直接向互联网曝光。
查找门户
服务,这应该是这样的:
1[label ~/faas/docker-compose.yml]
2...
3 gateway:
4 ports:
5 - 8080:8080
6 image: openfaas/gateway:0.8.7
7 networks:
8 - functions
9 environment:
10 functions_provider_url: "http://faas-swarm:8080/"
11 read_timeout: "300s" # Maximum time to read HTTP request
12 write_timeout: "300s" # Maximum time to write HTTP response
13 upstream_timeout: "300s" # Maximum duration of upstream function call - should be more than read_timeout and write_timeout
14 dnsrr: "true" # Temporarily use dnsrr in place of VIP while issue persists on PWD
15 faas_nats_address: "nats"
16 faas_nats_port: 4222
17 direct_functions: "true" # Functions are invoked directly over the overlay network
18 direct_functions_suffix: ""
19 basic_auth: "${BASIC_AUTH:-true}"
20 secret_mount_path: "/run/secrets/"
21 scale_from_zero: "false"
22 deploy:
23 resources:
24 # limits: # Enable if you want to limit memory usage
25 # memory: 200M
26 reservations:
27 memory: 100M
28 restart_policy:
29 condition: on-failure
30 delay: 5s
31 max_attempts: 20
32 window: 380s
33 placement:
34 constraints:
35 - 'node.platform.os == linux'
36 secrets:
37 - basic-auth-user
38 - basic-auth-password
39...
从服务中删除端口
指令,以避免直接暴露网关
服务。
接下来,将下列标签
指令添加到网关
服务的部署
部分,该指令暴露了/ui
,/system
和/function
端点在8080
端口上的Treefik:
1[label ~/faas/docker-compose.yml]
2 ...
3 deploy:
4 labels:
5 - traefik.port=8080
6 - traefik.frontend.rule=PathPrefix:/ui,/system,/function
7 resources:
8 ...
「/ui」端点揭示了本教程的 步骤 6中所涵盖的 OpenFaaS Web UI. 「/ui」端点是用于管理 OpenFaaS 的 API 端点,而「/function」端点则揭示了 API 端点用于管理和运行函数。
经过修改后,您的网关
服务应该是这样的:
1[label ~/faas/docker-compose.yml]
2...
3 gateway:
4 image: openfaas/gateway:0.8.7
5 networks:
6 - functions
7 environment:
8 functions_provider_url: "http://faas-swarm:8080/"
9 read_timeout: "300s" # Maximum time to read HTTP request
10 write_timeout: "300s" # Maximum time to write HTTP response
11 upstream_timeout: "300s" # Maximum duration of upstream function call - should be more than read_timeout and write_timeout
12 dnsrr: "true" # Temporarily use dnsrr in place of VIP while issue persists on PWD
13 faas_nats_address: "nats"
14 faas_nats_port: 4222
15 direct_functions: "true" # Functions are invoked directly over the overlay network
16 direct_functions_suffix: ""
17 basic_auth: "${BASIC_AUTH:-true}"
18 secret_mount_path: "/run/secrets/"
19 scale_from_zero: "false"
20 deploy:
21 labels:
22 - traefik.port=8080
23 - traefik.frontend.rule=PathPrefix:/ui,/system,/function
24 resources:
25 # limits: # Enable if you want to limit memory usage
26 # memory: 200M
27 reservations:
28 memory: 100M
29 restart_policy:
30 condition: on-failure
31 delay: 5s
32 max_attempts: 20
33 window: 380s
34 placement:
35 constraints:
36 - 'node.platform.os == linux'
37 secrets:
38 - basic-auth-user
39 - basic-auth-password
40...
最后,让我们定义用于存储 Let’s Encrypt 证书的acme
量,我们可以定义一个空的量,这意味着如果你破坏了容器,数据将不会持续下去。
在文件的最后一行中添加以下卷
指令:
1[label ~/faas/docker-compose.yml]
2...
3volumes:
4 acme:
完成后,保存文件并关闭文本编辑器. 在此时刻,您已经配置了 Traefik 来保护您的 OpenFaaS 部署和 Docker Swarm。
步骤 3 – 部署 OpenFaaS
现在你已经准备了 OpenFaaS 部署宣言,你已经准备好部署它并开始使用 OpenFaaS. 要部署它,你将使用 deploy_stack.sh
脚本. 此脚本旨在用于 Linux 和 macOS 操作系统,但在 OpenFaaS 目录中你还可以找到适用于 Windows和 ARM 系统的适当脚本。
在部署 OpenFaaS 之前,您需要指示docker-machine
在 Swarm 中的一台机器上从脚本中执行 Docker 命令。
如果您已配置了docker-machine use
命令,您可以使用它:
1docker-machine use node-1
如果没有,请使用以下命令:
1eval $(docker-machine env node-1)
deploy_stack.sh
脚本部署了所需的所有资源,以便OpenFaaS按预期工作,包括配置文件,网络设置,服务和授权证件与OpenFaaS服务器。
让我们执行脚本,需要几分钟才能完成部署:
1~/faas/deploy_stack.sh
输出显示了部署过程中创建的资源列表,以及您将用于访问 OpenFaaS 服务器和 FaaS CLI 命令的凭证。
写下这些凭据,因为您将在整个教程中需要它们来访问Web UI和API:
1[secondary_label Output]
2Attempting to create credentials for gateway..
3roozmk0y1jkn17372a8v9y63g
4q1odtpij3pbqrmmf8msy3ampl
5[Credentials]
6 username: admin
7 password: your_openfaas_password
8 echo -n your_openfaas_password | faas-cli login --username=admin --password-stdin
9
10Enabling basic authentication for gateway..
11
12Deploying OpenFaaS core services
13Creating network func_functions
14Creating config func_alertmanager_config
15Creating config func_prometheus_config
16Creating config func_prometheus_rules
17Creating service func_alertmanager
18Creating service func_traefik
19Creating service func_gateway
20Creating service func_faas-swarm
21Creating service func_nats
22Creating service func_queue-worker
23Creating service func_prometheus
如果您看到任何错误,请按照屏幕上的指示来解决它们,然后继续教程。
在继续之前,让我们使用部署脚本提供的命令验证FaaS CLI与OpenFaaS服务器。
该脚本输出了您需要为命令提供的旗帜,但您需要添加一个额外的旗帜, --gateway',包含您的OpenFaaS服务器的地址,因为FaaS CLI假定网关服务器在
localhost'上运行:
1echo -n your_openfaas_password | faas-cli login --username=admin --password-stdin --gateway https://example.com
输出包含成功授权的消息:
1[secondary_label Output]
2Calling the OpenFaaS server to validate the credentials...
3credentials saved for admin https://example.com
此时,您已在 Docker Swarm 集群中部署了完全功能的 OpenFaaS 服务器,以及已配置的 FaaS CLI 以使用新部署的服务器。
步骤 4 – 部署 OpenFaaS 示例功能
最初,OpenFaaS 没有部署任何功能,要开始测试并使用它,您需要一些功能。
OpenFaaS 项目托管了一些样本函数,你可以找到一个列表 可用的函数以及它们在 OpenFaaS 存储库中的部署示例。一些样本函数包括nodeinfo
,用于显示有关函数正在运行的节点的信息,wordcount
,用于计算通过请求中的单词数量,以及markdown
,用于将通过的标记输入转换为 HTML 输出。
在~/faas
目录中的stack.yml
表达式部署了几个样本函数,以及上面提到的函数,您可以使用FaaS CLI部署它。
运行下面的faas-cli
命令,该命令将通往堆栈显示和您的 OpenFaaS 服务器的地址:
1faas-cli deploy -f ~/faas/stack.yml --gateway https://example.com
输出包含状态代码和信息,说明部署是否成功:
1[secondary_label Output]
2Deploying: wordcount.
3
4Deployed. 200 OK.
5URL: https://example.com/function/wordcount
6
7Deploying: base64.
8
9Deployed. 200 OK.
10URL: https://example.com/function/base64
11
12Deploying: markdown.
13
14Deployed. 200 OK.
15URL: https://example.com/function/markdown
16
17Deploying: hubstats.
18
19Deployed. 200 OK.
20URL: https://example.com/function/hubstats
21
22Deploying: nodeinfo.
23
24Deployed. 200 OK.
25URL: https://example.com/function/nodeinfo
26
27Deploying: echoit.
28
29Deployed. 200 OK.
30URL: https://example.com/function/echoit
如果您看到任何错误,请确保遵循屏幕上的指示来解决它们。
一旦堆栈部署完成,列出所有功能,以确保它们已部署并准备使用:
1faas-cli list --gateway https://example.com
输出包含一个函数列表,以及它们的复制号和调用数:
1[secondary_label Output]
2Function Invocations Replicas
3markdown 0 1
4wordcount 0 1
5base64 0 1
6nodeinfo 0 1
7hubstats 0 1
8echoit 0 1
如果您在这里看不到您的函数,请确保faas-cli 部署
命令成功执行。
现在您可以使用示例 OpenFaaS 函数来测试和演示如何使用 API、Web UI 和 CLI. 在下一步,您将开始使用 OpenFaaS API 列出和运行函数。
步骤 5 – 使用 OpenFaaS API
OpenFaaS 配备了一个强大的 API,您可以使用它来管理和执行无服务器功能. 让我们使用 Swagger,用于构建,测试和文档化 API 的工具,浏览 API 文档,然后使用 API 列出和运行功能。
在 OpenFaaS 存储库中,您可以找到 Swagger API 规格,可与 Swagger 编辑器一起使用,将规格转换为可人读的形式。
导航您的网页浏览器到 http://editor.swagger.io/
. 您应该受到以下屏幕的欢迎:
在这里,您将找到包含样品Swagger规格的源代码的文本编辑器,并在右侧找到可人读的API文档。
让我们导入 OpenFaaS Swagger 规格,在顶部菜单中,点击 ** 文件** 按钮,然后点击 ** 导入 URL** :
您将看到一个弹出窗口,您需要输入Swagger API规格的地址. 如果您看不到弹出窗口,请确保您的Web浏览器启用了弹出窗口。
在字段中,输入 Swagger OpenFaaS API 规范的链接: https://raw.githubusercontent.com/openfaas/faas/master/api-docs/swagger.yml
点击OK
按钮后,Swagger 编辑器会向您显示 OpenFaaS 的 API 参考,该参考应该是这样的:
在左侧,您可以看到API引用文件的来源,而在右侧,您可以看到终端的列表,以及简短的描述。
一旦你知道哪些终端可用以及他们所期望的参数,你可以使用它们来管理你的函数。
接下来,您将使用一个‘curl’命令与API进行通信,然后返回您的终端。 使用‘-u’旗帜,您将能够通过您在步骤 3 中获得的‘admin:your_openfaas_password’对,而‘-X’旗帜将定义请求方法。 您还将通过您的终端 URL,‘https://example.com/system/functions’:
1curl -u admin:your_openfaas_password -X GET https://example.com/system/functions
您可以在 API 文档中查看每个端点所需的方法。
在步骤4中,您部署了几个样本函数,这些函数应该出现在输出中:
1[secondary_label Output]
2[{"name":"base64","image":"functions/alpine:latest","invocationCount":0,"replicas":1,"envProcess":"base64","availableReplicas":0,"labels":{"com.openfaas.function":"base64","function":"true"}},{"name":"nodeinfo","image":"functions/nodeinfo:latest","invocationCount":0,"replicas":1,"envProcess":"","availableReplicas":0,"labels":{"com.openfaas.function":"nodeinfo","function":"true"}},{"name":"hubstats","image":"functions/hubstats:latest","invocationCount":0,"replicas":1,"envProcess":"","availableReplicas":0,"labels":{"com.openfaas.function":"hubstats","function":"true"}},{"name":"markdown","image":"functions/markdown-render:latest","invocationCount":0,"replicas":1,"envProcess":"","availableReplicas":0,"labels":{"com.openfaas.function":"markdown","function":"true"}},{"name":"echoit","image":"functions/alpine:latest","invocationCount":0,"replicas":1,"envProcess":"cat","availableReplicas":0,"labels":{"com.openfaas.function":"echoit","function":"true"}},{"name":"wordcount","image":"functions/alpine:latest","invocationCount":0,"replicas":1,"envProcess":"wc","availableReplicas":0,"labels":{"com.openfaas.function":"wordcount","function":"true"}}]
如果您看不到这样的输出,或者您看到错误,请按照屏幕上的说明来解决问题,然后继续使用教程。 请确保您使用推荐的方法和正确的凭证将请求发送到正确的终端。
1docker service logs func_gateway
默认情况下,对弯曲
呼叫的 API 响应返回原始 JSON 没有新行,这不是人类可读的。
1curl -u admin:your_openfaas_password -X GET https://example.com/system/functions | jq
您可以看到函数名,您可以使用它来管理和调用函数使用API,调用次数,以及与 Docker 相关的标签和复制次数等信息:
1[secondary_label Output]
2[
3 {
4 "name": "base64",
5 "image": "functions/alpine:latest",
6 "invocationCount": 0,
7 "replicas": 1,
8 "envProcess": "base64",
9 "availableReplicas": 0,
10 "labels": {
11 "com.openfaas.function": "base64",
12 "function": "true"
13 }
14 },
15 {
16 "name": "nodeinfo",
17 "image": "functions/nodeinfo:latest",
18 "invocationCount": 0,
19 "replicas": 1,
20 "envProcess": "",
21 "availableReplicas": 0,
22 "labels": {
23 "com.openfaas.function": "nodeinfo",
24 "function": "true"
25 }
26 },
27 {
28 "name": "hubstats",
29 "image": "functions/hubstats:latest",
30 "invocationCount": 0,
31 "replicas": 1,
32 "envProcess": "",
33 "availableReplicas": 0,
34 "labels": {
35 "com.openfaas.function": "hubstats",
36 "function": "true"
37 }
38 },
39 {
40 "name": "markdown",
41 "image": "functions/markdown-render:latest",
42 "invocationCount": 0,
43 "replicas": 1,
44 "envProcess": "",
45 "availableReplicas": 0,
46 "labels": {
47 "com.openfaas.function": "markdown",
48 "function": "true"
49 }
50 },
51 {
52 "name": "echoit",
53 "image": "functions/alpine:latest",
54 "invocationCount": 0,
55 "replicas": 1,
56 "envProcess": "cat",
57 "availableReplicas": 0,
58 "labels": {
59 "com.openfaas.function": "echoit",
60 "function": "true"
61 }
62 },
63 {
64 "name": "wordcount",
65 "image": "functions/alpine:latest",
66 "invocationCount": 0,
67 "replicas": 1,
68 "envProcess": "wc",
69 "availableReplicas": 0,
70 "labels": {
71 "com.openfaas.function": "wordcount",
72 "function": "true"
73 }
74 }
75]
让我们采取其中一个函数并执行它,使用API /function/function-name
终端点. 此终端通过POST方法可用,其中 -d
旗允许您将数据发送到函数。
例如,让我们运行下面的‘curl’命令来执行‘echoit’函数,该函数将 OpenFaaS 带出盒子并输出您发送的字符串作为请求。
1curl -u admin:your_openfaas_password -X POST https://example.com/function/func_echoit -d "Sammy The Shark"
输出将向你展示萨米鲨鱼
:
1[secondary_label Output]
2Sammy The Shark
如果您看到错误,请按照屏幕上的日志来解决问题,然后继续使用教程,您也可以检查网关
服务的日志。
此时,您已经使用了 OpenFaaS API 来管理和执行您的函数,现在让我们来看看 OpenFaaS Web UI。
步骤 6 – 使用 OpenFaaS Web UI
OpenFaaS 配备了一个 Web UI,您可以使用它来添加新功能并执行已安装的功能. 在此步骤中,您将安装一个功能来从 FaaS 商店生成 QR 代码并生成样本代码。
首先,请将您的网页浏览器指向 https://example.com/ui/
. 请注意,要避免出现未找到
错误,必须使用追踪截图。
在 HTTP 身份验证对话框中,输入在步骤 3 中部署 OpenFaaS 时获得的用户名和密码。
一旦登录,您将在屏幕的左侧看到可用的功能,以及用于安装新功能的 部署新功能 按钮。
点击 部署新功能 来部署新功能. 您将看到 FaaS Store 窗口,该窗口提供社区测试的功能,您可以单击安装:
除了这些功能外,您还可以从 Docker 图像中手动部署功能。
对于本教程,您将从FaaS商店部署 QR代码生成器 功能. 在列表中找到 QR代码生成器 - Go 项,点击它,然后点击窗口底部的 部署 按钮:
点击部署
后,部署一个新函数
窗口将关闭,该函数将被部署。窗口左侧的列表中,您将看到该函数的列表。 点击此列表以选择它。 主函数窗口将显示函数名称、复制件数、调用数和图像,以及调用函数的选项:
让我们生成一个含有您的域名URL的QR代码。在请求体
字段中,输入您想要生成的QR代码的内容;在我们的情况下,这将是example.com
**。
当您选择文本
或JSON
输出选项时,该函数将输出文件的内容,该内容是不可用或不可人读的:
您可以下载回复,在我们的情况下将是一个PNG文件与QR代码。 要做到这一点,请选择下载
选项,然后再单击调用
选项。
除了从 FaaS 商店或从 Docker 图像部署函数外,您还可以创建自己的函数,下一步您将使用 FaaS 命令行接口创建一个 Python 函数。
第7步:使用FaaS CLI创建函数
在之前的步骤中,您已配置了 FaaS CLI 以与您的 OpenFaaS 服务器工作. FaaS CLI 是一个命令行接口,您可以使用它来管理 OpenFaaS 并安装和运行功能,就像您通过 API 或使用 Web UI。
与 Web UI 或 API 相比,FaaS CLI 有许多编程语言的模板,您可以使用它们来创建自己的函数,还可以基于您的函数代码构建容器图像,并将图像推到图像注册表,例如 Docker Hub。
在此步骤中,您将创建一个函数,将其发布到 Docker Hub,然后在您的 OpenFaaS 服务器上运行。
如果您想了解更多关于 Python 的信息,您可以查看我们的 如何在 Python 中编码 3 教程系列和我们的 如何在 Python 编码电子书 。
在创建新函数之前,让我们创建一个目录来存储FaaS函数并导航到它:
1mkdir ~/faas-functions
2cd ~/faas-functions
执行以下命令来创建一个名为echo-input
的新Python函数. 请确保用您的Docker Hub用户名替换您的docker-hub用户名
,因为您稍后会将该函数推到Docker Hub:
1faas-cli new echo-input --lang python --prefix your-docker-hub-username --gateway https://example.com
输出包含成功创建函数的确认信息. 如果您没有下载模板,则 CLI 将下载在当前目录中的模板:
1[secondary_label Output]
22018/05/13 12:13:06 No templates found in current directory.
32018/05/13 12:13:06 Attempting to expand templates from https://github.com/openfaas/templates.git
42018/05/13 12:13:11 Fetched 12 template(s) : [csharp dockerfile go go-armhf node node-arm64 node-armhf python python-armhf python3 python3-armhf ruby] from https://github.com/openfaas/templates.git
5Folder: echo-input created.
6 ___ _____ ____
7 / _ \ _ __ ___ _ __ | ___|_ _ __ _/ ___|
8| | | | '_ \ / _ \ '_ \| |_ / _` |/ _` \___ \
9| |_| | |_) | __/ | | | _| (_| | (_| |___) |
10 \___/| .__/ \___|_| |_|_| \__,_|\__,_|____/
11 |_|
12
13Function created in folder: echo-input
14Stack file written: echo-input.yml
faas-cli new
命令的结果是新创建的~/faas-fucntions/echo-input
目录,其中包含函数的代码和echo-input.yml
文件。
导航到 ~/faas-fucntions/echo-input
目录:
1cd ~/faas-fucntions/echo-input
要查看目录的内容,执行:
1ls
该目录包含两个文件: handler.py
,其中包含您的函数的代码,以及 `requirements.txt,其中包含该函数所需的 Python 模块。
由于我们目前不需要任何非默认的Python模块,所以requirements.txt
文件是空的。
1cat requirements.txt
接下来,让我们写一个函数,将请求作为字符串返回。
handler.py
文件已经具有样本处理代码,该代码以字符串返回收到的响应。
1nano handler.py
默认函数被称为处理
,并采用单个参数req
,其中包含在调用函数时传递给函数的请求。
1def handle(req):
2 """handle a request to the function
3 Args:
4 req (str): request body
5 """
6
7 return req
让我们修改它以包括额外的文本,以如下方式取代返回
指令中的字符串:
1return "Received message: " + req
一旦完成,保存文件并关闭文本编辑器。
接下来,让我们从函数的源代码中构建一个Docker图像,然后导航到位于echo-input.yml
文件所在的faas-functions
目录:
1cd ~/faas-functions
以下命令为您的函数构建 Docker 图像:
1faas-cli build -f echo-input.yml
输出包含有关构建进度的信息:
1[secondary_label Output]
2[0] > Building echo-input.
3Clearing temporary build folder: ./build/echo-input/
4Preparing ./echo-input/ ./build/echo-input/function
5Building: sammy/echo-input with python template. Please wait..
6Sending build context to Docker daemon 7.168kB
7Step 1/16 : FROM python:2.7-alpine
8 ---> 5fdd069daf25
9Step 2/16 : RUN apk --no-cache add curl && echo "Pulling watchdog binary from Github." && curl -sSL https://github.com/openfaas/faas/releases/download/0.8.0/fwatchdog > /usr/bin/fwatchdog && chmod +x /usr/bin/fwatchdog && apk del curl --no-cache
10 ---> Using cache
11 ---> 247d4772623a
12Step 3/16 : WORKDIR /root/
13 ---> Using cache
14 ---> 532cc683d67b
15Step 4/16 : COPY index.py .
16 ---> Using cache
17 ---> b4b512152257
18Step 5/16 : COPY requirements.txt .
19 ---> Using cache
20 ---> 3f9cbb311ab4
21Step 6/16 : RUN pip install -r requirements.txt
22 ---> Using cache
23 ---> dd7415c792b1
24Step 7/16 : RUN mkdir -p function
25 ---> Using cache
26 ---> 96c25051cefc
27Step 8/16 : RUN touch ./function/__init__.py
28 ---> Using cache
29 ---> 77a9db274e32
30Step 9/16 : WORKDIR /root/function/
31 ---> Using cache
32 ---> 88a876eca9e3
33Step 10/16 : COPY function/requirements.txt .
34 ---> Using cache
35 ---> f9ba5effdc5a
36Step 11/16 : RUN pip install -r requirements.txt
37 ---> Using cache
38 ---> 394a1dd9e4d7
39Step 12/16 : WORKDIR /root/
40 ---> Using cache
41 ---> 5a5893c25b65
42Step 13/16 : COPY function function
43 ---> eeddfa67018d
44Step 14/16 : ENV fprocess="python index.py"
45 ---> Running in 8e53df4583f2
46Removing intermediate container 8e53df4583f2
47 ---> fb5086bc7f6c
48Step 15/16 : HEALTHCHECK --interval=1s CMD [ -e /tmp/.lock ] || exit 1
49 ---> Running in b38681a71378
50Removing intermediate container b38681a71378
51 ---> b04c045b0994
52Step 16/16 : CMD ["fwatchdog"]
53 ---> Running in c5a11078df3d
54Removing intermediate container c5a11078df3d
55 ---> bc5f08157c5a
56Successfully built bc5f08157c5a
57Successfully tagged sammy/echo-input:latest
58Image: your-docker-hub-username/echo-input built.
59[0] < Building echo-input done.
60[0] worker done.
如果您收到错误,请确保在部署该函数之前按照屏幕上的说明来解决它。
容器化应用程序确保运行应用程序所需的环境可以轻松复制,应用程序可以轻松部署、扩展和更新。
对于本教程,我们将使用Docker Hub,因为它是一个免费的解决方案,但您可以使用任何集装箱注册表,包括自己的私人注册表。
运行以下命令,将您创建的图像推到 Docker Hub 上的指定的存储库:
1faas-cli push -f echo-input.yml
推迟将需要几分钟,取决于您的互联网连接速度. 输出包含图片的上传进展:
1[secondary_label Output]
2[0] > Pushing echo-input.
3The push refers to repository [docker.io/sammy/echo-input]
4320ea573b385: Pushed
59d87e56f5d0c: Pushed
66f79b75e7434: Pushed
723aac2d8ecf2: Pushed
82bec17d09b7e: Pushed
9e5a0e5ab3be6: Pushed
10e9c8ca932f1b: Pushed
11beae1d55b4ce: Pushed
122fcae03ed1f7: Pushed
1362103d5daa03: Mounted from library/python
14f6ac6def937b: Mounted from library/python
1555c108c7613c: Mounted from library/python
16e53f74215d12: Mounted from library/python
17latest: digest: sha256:794fa942c2f593286370bbab2b6c6b75b9c4dcde84f62f522e59fb0f52ba05c1 size: 3033
18[0] < Pushing echo-input done.
19[0] worker done.
最后,随着您的图像被推到Docker Hub,您可以使用它来部署一个功能到您的OpenFaaS服务器。
要部署您的函数,请运行部署
命令,该命令将通往描述您的函数以及您的 OpenFaaS 服务器地址的通道:
1faas-cli deploy -f echo-input.yml --gateway https://example.com
输出显示部署的状态,以及您正在部署的函数名称和部署状态代码:
1[secondary_label Output]
2Deploying: echo-input.
3
4Deployed. 200 OK.
5URL: https://example.com/function/echo-input
如果部署成功,您将看到200
状态代码,如果出现错误,请按照所提供的指示来解决问题,然后继续。
在此时,您的函数已部署并准备使用,您可以通过召唤它来测试它是否按预期工作。
若要使用 FaaS CLI 调用函数,请使用调用
命令将函数名称和 OpenFaaS 地址传递给函数。
执行以下命令,调用echo-input
函数:
1faas-cli invoke echo-input --gateway https://example.com
您将被要求输入您要发送到函数的请求:
1[secondary_label Output]
2Reading from STDIN - hit (Control + D) to stop.
输入要发送到函数的文本,例如:
1Sammy The Shark!
一旦完成,请按ENTER
,然后按CTRL + D
,以完成请求。终端中的CTRL + D
捷径用于注册 End-of-File(EOF)。
几秒钟后,该命令将输出函数的响应:
1[secondary_label Output]
2Reading from STDIN - hit (Control + D) to stop.
3Sammy The Shark!
4Received message: Sammy The Shark!
如果您看不到输出或收到错误,请执行前面的步骤,以确保您已按所解释部署该函数,并按照屏幕上的说明来解决问题。
此时,您使用三种方法与函数进行交互: Web UI、API 和 CLI. 能够使用这些方法执行函数可为您提供决定如何将函数集成到现有工作流的灵活性。
结论
在本教程中,您已经使用了无服务器架构和OpenFaaS来部署和管理您的应用程序,使用OpenFaaS API,Web UI和CLI。
如果你想了解更多关于OpenFaaS项目的信息,你可以查看他们的网站(https://www.openfaas.com/)和官方文件(https://docs.openfaas.com/)。