如何在 Ubuntu 16.04 上使用 Docker Swarm 安装和保护 OpenFaaS

作者选择了 多样性在技术基金作为 写给捐款计划的一部分接受捐款。

介绍

无服务器架构将服务器实例隐藏在开发者身上,通常会暴露一个API,允许开发人员在云中运行他们的应用程序. 这种方法有助于开发人员快速部署应用程序,因为他们可以将配置和维护实例留给适当的DevOps团队。

运行在无服务器平台上的应用程序被称为 _serverless functions。 一个函数是可执行的集装箱代码,用于执行特定操作。

OpenFaaS是一个免费的开源框架,用于构建和托管无服务器功能. 官方支持 Docker SwarmKubernetes,它允许您使用强大的API,命令行界面或Web UI部署您的应用程序。

在本教程中,您将设置和使用OpenFaaS与Docker Swarm在Ubuntu 16.04上运行,并通过设置 TraefikLet'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 目录中你还可以找到适用于 WindowsARM 系统的适当脚本。

在部署 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 Editor Welcome page

在这里,您将找到包含样品Swagger规格的源代码的文本编辑器,并在右侧找到可人读的API文档。

让我们导入 OpenFaaS Swagger 规格,在顶部菜单中,点击 ** 文件** 按钮,然后点击 ** 导入 URL** :

Swagger Editor Import URL

您将看到一个弹出窗口,您需要输入Swagger API规格的地址. 如果您看不到弹出窗口,请确保您的Web浏览器启用了弹出窗口。

在字段中,输入 Swagger OpenFaaS API 规范的链接: https://raw.githubusercontent.com/openfaas/faas/master/api-docs/swagger.yml

Swagger Editor Input URL

点击OK按钮后,Swagger 编辑器会向您显示 OpenFaaS 的 API 参考,该参考应该是这样的:

Swagger Editor OpenFaaS API specification

在左侧,您可以看到API引用文件的来源,而在右侧,您可以看到终端的列表,以及简短的描述。

Swagger Editor Endpoint details

一旦你知道哪些终端可用以及他们所期望的参数,你可以使用它们来管理你的函数。

接下来,您将使用一个‘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 窗口,该窗口提供社区测试的功能,您可以单击安装:

OpenFaaS Functions store

除了这些功能外,您还可以从 Docker 图像中手动部署功能。

对于本教程,您将从FaaS商店部署 QR代码生成器 功能. 在列表中找到 QR代码生成器 - Go 项,点击它,然后点击窗口底部的 部署 按钮:

OpenFaaS QR Code Generator function

点击部署后,部署一个新函数窗口将关闭,该函数将被部署。窗口左侧的列表中,您将看到该函数的列表。 点击此列表以选择它。 主函数窗口将显示函数名称、复制件数、调用数和图像,以及调用函数的选项:

OpenFaaS QR Code Function

让我们生成一个含有您的域名URL的QR代码。在请求体字段中,输入您想要生成的QR代码的内容;在我们的情况下,这将是example.com**。

当您选择文本JSON输出选项时,该函数将输出文件的内容,该内容是不可用或不可人读的:

OpenFaaS generated QR code

您可以下载回复,在我们的情况下将是一个PNG文件与QR代码。 要做到这一点,请选择下载选项,然后再单击调用选项。

Generated QR code

除了从 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/)。

Published At
Categories with 技术
comments powered by Disqus