作为 Write for DOnations 计划的一部分,作者选择了 Diversity in Tech Fund 来接受捐赠。
介绍
无服务器架构对开发人员隐藏了服务器实例,并且通常会公开一个 API,允许开发人员在云中运行他们的应用程序。 这种方法有助于开发人员快速部署应用程序,因为他们可以将配置和维护实例留给适当的 DevOps 团队。 它还降低了基础架构成本,因为使用适当的工具,您可以根据需求扩展您的实例。
在无服务器平台上运行的应用程序称为 无服务器函数 。 函数是用于执行特定操作的容器化可执行代码。 容器化应用程序可确保您可以在多台机器上重现一致的环境,从而实现更新和扩展。
OpenFaaS 是一个免费的开源框架,用于构建和托管无服务器功能。 通过对 Docker Swarm 和 Kubernetes 的官方支持,它允许您使用强大的 API、命令行界面或 Web UI 部署应用程序。 它带有 Prometheus 提供的内置指标,并支持按需自动缩放,以及从零开始缩放。
在本教程中,您将设置和使用 OpenFaaS 以及在 Ubuntu 16.04 上运行的 Docker Swarm,并通过使用 Let's Encypt 设置 Traefik 来保护其 Web UI 和 API。 这确保了集群中节点之间以及 OpenFaaS 与其运营商之间的安全通信。
先决条件
要学习本教程,您需要:
- Ubuntu 16.04 在您的本地机器上运行。 您可以使用其他发行版和操作系统,但请确保为您的操作系统使用适当的 OpenFaaS 脚本并安装这些先决条件中列出的所有依赖项。
git
、curl
和jq
安装在本地计算机上。 您将使用git
克隆 OpenFaaS 存储库,使用curl
测试 API,并使用jq
将 API 中的原始 JSON 响应转换为人工响应- 可读的 JSON。 要安装此设置所需的依赖项,请使用以下命令:sudo apt-get update && sudo apt-get install git curl jq
- 按照 如何在 Ubuntu 16.04 上安装和使用 Docker 的步骤 1 和 2 安装 Docker。
- 一个 Docker Hub 帐户。 要将功能部署到 OpenFaaS,它们需要在公共容器注册表上发布。 我们将在本教程中使用 Docker Hub,因为它既免费又被广泛使用。 请务必使用
docker login
命令在本地计算机上通过 Docker 进行身份验证。 - Docker Machine 已安装,遵循 How To Provision and Manage Remote Docker Hosts with Docker Machine on Ubuntu 16.04。
- DigitalOcean 个人访问令牌。 要创建令牌,请按照 这些说明 。
- 一个 3 个节点的 Docker Swarm 集群,按照 如何在 Ubuntu 16.04 上使用 Docker Swarm 和 DigitalOcean 创建 Docker 容器集群进行配置。
- 一个完全注册的域名,其 A 记录指向 Docker Swarm 中的一个实例。 在整个教程中,您将看到 example.com 作为示例域。 您应该将其替换为您自己的域,您可以在 Namecheap 上购买,或者在 Freenom 上免费获得。 您还可以使用您选择的其他域注册商。
第 1 步 — 下载 OpenFaaS 并安装 OpenFaaS CLI
要将 OpenFaaS 部署到 Docker Swarm,您需要下载部署清单和脚本。 获取它们的最简单方法是克隆官方 OpenFaas 存储库并签出相应的标签,该标签代表 OpenFaaS 版本。
除了克隆存储库之外,您还将安装 FaaS CLI,这是一个强大的命令行实用程序,可用于从终端管理和部署新功能。 它提供了用于在大多数主要编程语言中创建自己的函数的模板。 在 Step 7 中,您将使用它来创建 Python 函数并将其部署在 OpenFaaS 上。
在本教程中,您将部署 OpenFaaS v0.8.9。 虽然部署其他版本的步骤应该类似,但请务必查看 项目更改日志 以确保没有重大更改。
首先,导航到您的主目录并运行以下命令将存储库克隆到 ~/faas
目录:
cd ~ git clone https://github.com/openfaas/faas.git
导航到新创建的 ~/faas
目录:
cd ~/faas
克隆存储库时,您将从主分支获取包含最新更改的文件。 因为破坏性更改可能会进入主分支,所以不建议在生产中使用。 相反,让我们看看 0.8.9
标签:
git checkout 0.8.9
输出包含有关成功签出的消息和有关向此分支提交更改的警告:
OutputNote: checking out '0.8.9'. You are in 'detached HEAD' state. You can look around, make experimental changes and commit them, and you can discard any commits you make in this state without impacting any branches by performing another checkout. If you want to create a new branch to retain commits you create, you may do so (now or later) by using -b with the checkout command again. Example: git checkout -b <new-branch-name> HEAD is now at 8f0d2d1 Expose scale-function endpoint
如果您看到任何错误,请确保在继续之前按照屏幕上的说明解决这些错误。
下载 OpenFaaS 存储库并完成必要的清单文件后,让我们继续安装 FaaS CLI。
安装 FaaS CLI 最简单的方法是使用官方脚本。 在您的终端中,导航到您的主目录并使用以下命令下载脚本:
cd ~ curl -sSL -o faas-cli.sh https://cli.openfaas.com
这会将 faas-cli.sh
脚本下载到您的主目录。 在执行脚本之前,最好检查一下内容:
less faas-cli.sh
您可以按 q
退出预览。 一旦您验证了脚本的内容,您可以通过授予脚本可执行权限并执行它来继续安装。 以 root 身份执行脚本,它会自动复制到您的 PATH
:
chmod +x faas-cli.sh sudo ./faas-cli.sh
输出包含有关安装进度和您已安装的 CLI 版本的信息:
Outputx86_64 Downloading package https://github.com/openfaas/faas-cli/releases/download/0.6.17/faas-cli as /tmp/faas-cli Download complete. Running as root - Attempting to move faas-cli to /usr/local/bin New version of faas-cli installed to /usr/local/bin Creating alias 'faas' for 'faas-cli'. ___ _____ ____ / _ \ _ __ ___ _ __ | ___|_ _ __ _/ ___| | | | | '_ \ / _ \ '_ \| |_ / _` |/ _` \___ \ | |_| | |_) | __/ | | | _| (_| | (_| |___) | \___/| .__/ \___|_| |_|_| \__,_|\__,_|____/ |_| CLI: commit: b5597294da6dd98457434fafe39054c993a5f7e7 version: 0.6.17
如果您看到错误,请确保按照屏幕上的说明进行解决,然后再继续本教程。
此时,您已经安装了 FaaS CLI。 要了解有关您可以使用的命令的更多信息,请执行不带任何参数的 CLI:
faas-cli
输出显示可用的命令和标志:
Output ___ _____ ____ / _ \ _ __ ___ _ __ | ___|_ _ __ _/ ___| | | | | '_ \ / _ \ '_ \| |_ / _` |/ _` \___ \ | |_| | |_) | __/ | | | _| (_| | (_| |___) | \___/| .__/ \___|_| |_|_| \__,_|\__,_|____/ |_| Manage your OpenFaaS functions from the command line Usage: faas-cli [flags] faas-cli [command] Available Commands: build Builds OpenFaaS function containers cloud OpenFaaS Cloud commands deploy Deploy OpenFaaS functions help Help about any command invoke Invoke an OpenFaaS function list List OpenFaaS functions login Log in to OpenFaaS gateway logout Log out from OpenFaaS gateway new Create a new template in the current folder with the name given as name push Push OpenFaaS functions to remote registry (Docker Hub) remove Remove deployed OpenFaaS functions store OpenFaaS store commands template Downloads templates from the specified github repo version Display the clients version information Flags: --filter string Wildcard to match with function names in YAML file -h, --help help for faas-cli --regex string Regex to match with function names in YAML file -f, --yaml string Path to YAML file describing function(s) Use "faas-cli [command] --help" for more information about a command.
您现在已成功获取 OpenFaaS 清单并安装了 FaaS CLI,您可以使用它从终端管理您的 OpenFaaS 实例。
~/faas
目录包含来自 0.8.9
版本的文件,这意味着您现在可以将 OpenFaaS 部署到您的 Docker Swarm。 在此之前,让我们修改部署清单文件以包含 Traefik,这将通过设置 Let's Encrypt 来保护您的 OpenFaaS 设置。
第 2 步 — 配置 Traefik
Traefik 是一个支持 Docker 的反向代理,带有 Let's Encrypt 提供的 SSL 支持。 SSL 协议通过加密您在节点之间发送和接收的数据,确保您与 Swarm 集群安全通信。
要将 Traefik 与 OpenFaaS 一起使用,您需要修改 OpenFaaS 部署清单以包含 Traefik,并告诉 OpenFaaS 使用 Traefik 而不是直接将其服务暴露给 Internet。
导航回 ~/faas
目录并在文本编辑器中打开 OpenFaaS 部署清单:
cd ~/faas nano ~/faas/docker-compose.yml
注意: Docker Compose manifest文件使用YAML格式,严格禁止制表符,缩进需要两个空格。 如果文件格式不正确,清单将无法部署。
OpenFaaS 部署由多个服务组成,在 services
指令下定义,它们提供运行 OpenFaaS、OpenFaaS API 和 Web UI 以及 Prometheus 和 AlertManager(用于处理指标)所需的依赖项。
在 services
部分的开头,添加一个名为 traefik
的新服务,它使用 traefik:v1.6
映像进行部署:
~/faas/docker-compose.yml
version: "3.3" services: traefik: image: traefik:v1.6 gateway: ...
Traefik 镜像来自 Traefik Docker Hub 存储库,您可以在其中找到所有可用镜像的列表。
接下来,让我们使用 command
指令指示 Docker 运行 Traefik。 这将运行 Traefik,将其配置为与 Docker Swarm 一起使用,并使用 Let's Encrypt 提供 SSL。 以下标志将配置 Traefik:
--docker.*
:这些标志告诉 Traefik 使用 Docker 并指定它在 Docker Swarm 集群中运行。--web=true
:此标志启用 Traefik 的 Web UI。--defaultEntryPoints
和--entryPoints
:这些标志定义了要使用的入口点和协议。 在我们的例子中,这包括端口80
上的 HTTP 和端口443
上的 HTTPS。--acme.*
:这些标志告诉 Traefik 使用 ACME 生成 Let's Encrypt 证书,以使用 SSL 保护您的 OpenFaaS 集群。
确保将 --acme.domains
和 --acme.email
标志中的 example.com
域占位符替换为您将用于访问 OpenFaaS 的域。 您可以通过用逗号和空格分隔多个域来指定多个域。 电子邮件地址用于 SSL 通知和警报,包括证书到期警报。 在这种情况下,Traefik 将自动处理更新证书,因此您可以忽略到期警报。
在 image
指令下方和 gateway
上方添加以下代码块:
~/faas/docker-compose.yml
... traefik: image: traefik:v1.6 command: -c --docker=true --docker.swarmmode=true --docker.domain=traefik --docker.watch=true --web=true --defaultEntryPoints='http,https' --entryPoints='Name:https Address::443 TLS' --entryPoints='Name:http Address::80' --acme=true --acme.entrypoint='https' --acme.httpchallenge=true --acme.httpchallenge.entrypoint='http' --acme.domains='example.com, www.example.com' --acme.email='sammy@example.com' --acme.ondemand=true --acme.onhostrule=true --acme.storage=/etc/traefik/acme/acme.json ...
使用 command
指令,让我们告诉 Traefik 哪些端口要暴露给互联网。 Traefik 使用端口 8080
进行操作,而 OpenFaaS 将使用端口 80
进行非安全通信,端口 443
进行安全通信。
在 command
指令下方添加以下 ports
指令。 port-internet:port-docker
表示法确保左侧的端口被 Traefik 公开到互联网并映射到右侧的容器端口:
~/faas/docker-compose.yml
... command: ... ports: - 80:80 - 8080:8080 - 443:443 ...
接下来,使用 volumes
指令,将 Docker 套接字文件从运行 Docker 的主机挂载到 Traefik。 Docker 套接字文件与 Docker API 通信以管理您的容器并获取有关它们的详细信息,例如容器数量及其 IP 地址。 您还将安装名为 acme
的卷,我们将在此步骤稍后定义。
networks
指令指示 Traefik 使用与 OpenFaaS 一起部署的 functions
网络。 该网络确保函数可以与系统的其他部分进行通信,包括 API。
deploy
指令指示 Docker 仅在 Docker Swarm 管理器节点上运行 Traefik。
在 ports
指令下方添加以下指令:
~/faas/docker-compose.yml
... volumes: - "/var/run/docker.sock:/var/run/docker.sock" - "acme:/etc/traefik/acme" networks: - functions deploy: placement: constraints: [node.role == manager]
此时,traefik
服务块应如下所示:
~/faas/docker-compose.yml
version: "3.3" services: traefik: image: traefik:v1.6 command: -c --docker=true --docker.swarmmode=true --docker.domain=traefik --docker.watch=true --web=true --defaultEntryPoints='http,https' --entryPoints='Name:https Address::443 TLS' --entryPoints='Name:http Address::80' --acme=true --acme.entrypoint='https' --acme.httpchallenge=true --acme.httpchallenge.entrypoint='http' --acme.domains='example.com, www.example.com' --acme.email='sammy@example.com' --acme.ondemand=true --acme.onhostrule=true --acme.storage=/etc/traefik/acme/acme.json ports: - 80:80 - 8080:8080 - 443:443 volumes: - "/var/run/docker.sock:/var/run/docker.sock" - "acme:/etc/traefik/acme" networks: - functions deploy: placement: constraints: [node.role == manager] gateway: ...
虽然此配置可确保 Traefik 将与 OpenFaaS 一起部署,但您还需要配置 OpenFaaS 以与 Traefik 一起使用。 默认情况下,gateway
服务配置为在与 Traefik 重叠的端口 8080
上运行。
gateway
服务提供了 API 网关,您可以使用它来部署、运行和管理您的函数。 它处理指标(通过 Prometheus)和自动缩放,并托管 Web UI。
我们的目标是使用 Traefik 公开 gateway
服务,而不是将其直接公开给互联网。
找到 gateway
服务,应该如下所示:
~/faas/docker-compose.yml
... gateway: ports: - 8080:8080 image: openfaas/gateway:0.8.7 networks: - functions environment: functions_provider_url: "http://faas-swarm:8080/" read_timeout: "300s" # Maximum time to read HTTP request write_timeout: "300s" # Maximum time to write HTTP response upstream_timeout: "300s" # Maximum duration of upstream function call - should be more than read_timeout and write_timeout dnsrr: "true" # Temporarily use dnsrr in place of VIP while issue persists on PWD faas_nats_address: "nats" faas_nats_port: 4222 direct_functions: "true" # Functions are invoked directly over the overlay network direct_functions_suffix: "" basic_auth: "${BASIC_AUTH:-true}" secret_mount_path: "/run/secrets/" scale_from_zero: "false" deploy: resources: # limits: # Enable if you want to limit memory usage # memory: 200M reservations: memory: 100M restart_policy: condition: on-failure delay: 5s max_attempts: 20 window: 380s placement: constraints: - 'node.platform.os == linux' secrets: - basic-auth-user - basic-auth-password ...
从服务中移除 ports
指令以避免直接暴露 gateway
服务。
接下来,将以下 lables
指令添加到 gateway
服务的 deploy
部分。 该指令通过 Traefik 公开端口 8080
上的 /ui
、/system
和 /function
端点:
~/faas/docker-compose.yml
... deploy: labels: - traefik.port=8080 - traefik.frontend.rule=PathPrefix:/ui,/system,/function resources: ...
/ui
端点公开了 OpenFaaS Web UI,本教程的 Step 6 对此进行了介绍。 /system
端点是用于管理 OpenFaaS 的 API 端点,而 /function
端点公开了用于管理和运行功能的 API 端点。 本教程的第 5 步 详细介绍了 OpenFaaS API。
修改后,您的 gateway
服务应如下所示:
~/faas/docker-compose.yml
... gateway: image: openfaas/gateway:0.8.7 networks: - functions environment: functions_provider_url: "http://faas-swarm:8080/" read_timeout: "300s" # Maximum time to read HTTP request write_timeout: "300s" # Maximum time to write HTTP response upstream_timeout: "300s" # Maximum duration of upstream function call - should be more than read_timeout and write_timeout dnsrr: "true" # Temporarily use dnsrr in place of VIP while issue persists on PWD faas_nats_address: "nats" faas_nats_port: 4222 direct_functions: "true" # Functions are invoked directly over the overlay network direct_functions_suffix: "" basic_auth: "${BASIC_AUTH:-true}" secret_mount_path: "/run/secrets/" scale_from_zero: "false" deploy: labels: - traefik.port=8080 - traefik.frontend.rule=PathPrefix:/ui,/system,/function resources: # limits: # Enable if you want to limit memory usage # memory: 200M reservations: memory: 100M restart_policy: condition: on-failure delay: 5s max_attempts: 20 window: 380s placement: constraints: - 'node.platform.os == linux' secrets: - basic-auth-user - basic-auth-password ...
最后,让我们定义用于存储 Let's Encrypt 证书的 acme
卷。 我们可以定义一个空卷,这意味着如果您销毁容器,数据将不会保留。 如果你销毁容器,证书将在你下次启动 Traefik 时重新生成。
在文件的最后一行添加以下 volumes
指令:
~/faas/docker-compose.yml
... volumes: acme:
完成后,保存文件并关闭文本编辑器。 至此,您已配置 Traefik 以保护您的 OpenFaaS 部署和 Docker Swarm。 现在您已准备好将它与 OpenFaaS 一起部署在您的 Swarm 集群上。
第 3 步 — 部署 OpenFaaS
现在您已准备好 OpenFaaS 部署清单,您已准备好部署它并开始使用 OpenFaaS。 要进行部署,您将使用 deploy_stack.sh
脚本。 此脚本旨在用于 Linux 和 macOS 操作系统,但在 OpenFaaS 目录中,您还可以找到适用于 Windows 和 ARM 系统 的相应脚本。
在部署 OpenFaaS 之前,您需要指示 docker-machine
在 Swarm 中的一台机器上从脚本执行 Docker 命令。 对于本教程,让我们使用 Swarm 管理器。
如果您配置了 docker-machine use
命令,则可以使用它:
docker-machine use node-1
如果没有,请使用以下命令:
eval $(docker-machine env node-1)
deploy_stack.sh
脚本部署了 OpenFaaS 按预期工作所需的所有资源,包括配置文件、网络设置、服务和 OpenFaaS 服务器授权凭据。
让我们执行脚本,这将需要几分钟才能完成部署:
~/faas/deploy_stack.sh
输出显示了在部署过程中创建的资源列表,以及您将用于访问 OpenFaaS 服务器和 FaaS CLI 命令的凭据。
记下这些凭据,因为您在整个教程中都需要它们来访问 Web UI 和 API:
OutputAttempting to create credentials for gateway.. roozmk0y1jkn17372a8v9y63g q1odtpij3pbqrmmf8msy3ampl [Credentials] username: admin password: your_openfaas_password echo -n your_openfaas_password | faas-cli login --username=admin --password-stdin Enabling basic authentication for gateway.. Deploying OpenFaaS core services Creating network func_functions Creating config func_alertmanager_config Creating config func_prometheus_config Creating config func_prometheus_rules Creating service func_alertmanager Creating service func_traefik Creating service func_gateway Creating service func_faas-swarm Creating service func_nats Creating service func_queue-worker Creating service func_prometheus
如果您看到任何错误,请按照屏幕上的说明解决它们,然后再继续本教程。
在继续之前,让我们使用部署脚本提供的命令向 OpenFaaS 服务器验证 FaaS CLI。
该脚本输出了您需要提供给命令的标志,但您需要添加一个附加标志 --gateway
,其中包含 OpenFaaS 服务器的地址,因为 FaaS CLI 假定网关服务器在 [ X222X]:
echo -n your_openfaas_password | faas-cli login --username=admin --password-stdin --gateway https://example.com
输出包含有关成功授权的消息:
OutputCalling the OpenFaaS server to validate the credentials... credentials saved for admin https://example.com
此时,您已经在 Docker Swarm 集群上部署了一个功能齐全的 OpenFaaS 服务器,以及配置为使用新部署的服务器的 FaaS CLI。 在测试如何使用 OpenFaaS 之前,让我们部署一些示例函数以开始使用。
第 4 步 — 部署 OpenFaaS 示例函数
最初,OpenFaaS 没有部署任何功能。 要开始测试和使用它,您将需要一些功能。
OpenFaaS 项目包含一些示例函数,您可以在 OpenFaaS 存储库 中找到 可用函数及其部署清单的列表。 一些示例函数包括 nodeinfo
,用于显示有关函数正在运行的节点的信息,wordcount
,用于计算传递请求中的字数,以及 markdown
, 用于将传递的 markdown 输入转换为 HTML 输出。
~/faas
目录中的 stack.yml
清单部署了几个示例函数以及上述函数。 您可以使用 FaaS CLI 部署它。
运行以下 faas-cli
命令,该命令获取堆栈清单的路径和 OpenFaaS 服务器的地址:
faas-cli deploy -f ~/faas/stack.yml --gateway https://example.com
输出包含指示部署是否成功的状态代码和消息:
OutputDeploying: wordcount. Deployed. 200 OK. URL: https://example.com/function/wordcount Deploying: base64. Deployed. 200 OK. URL: https://example.com/function/base64 Deploying: markdown. Deployed. 200 OK. URL: https://example.com/function/markdown Deploying: hubstats. Deployed. 200 OK. URL: https://example.com/function/hubstats Deploying: nodeinfo. Deployed. 200 OK. URL: https://example.com/function/nodeinfo Deploying: echoit. Deployed. 200 OK. URL: https://example.com/function/echoit
如果您看到任何错误,请确保按照屏幕上的说明进行解决。
堆栈部署完成后,列出所有功能以确保它们已部署并准备好使用:
faas-cli list --gateway https://example.com
输出包含函数列表,以及它们的副本编号和调用计数:
OutputFunction Invocations Replicas markdown 0 1 wordcount 0 1 base64 0 1 nodeinfo 0 1 hubstats 0 1 echoit 0 1
如果您在此处看不到您的函数,请确保 faas-cli deploy
命令已成功执行。
您现在可以使用示例 OpenFaaS 函数来测试和演示如何使用 API、Web UI 和 CLI。 在下一步中,您将首先使用 OpenFaaS API 列出和运行函数。
第 5 步 — 使用 OpenFaaS API
OpenFaaS 带有一个强大的 API,您可以使用它来管理和执行您的无服务器功能。 让我们使用 Swagger 这个用于架构、测试和记录 API 的工具来浏览 API 文档,然后使用 API 列出和运行函数。
使用 Swagger,您可以检查 API 文档以找出可用的端点以及如何使用它们。 在 OpenFaaS 存储库中,您可以找到 Swagger API 规范,它可以与 Swagger 编辑器一起使用,将规范转换为人类可读的形式。
将您的网络浏览器导航到 http://editor.swagger.io/
。 您应该会受到以下屏幕的欢迎:
在这里,您将找到一个文本编辑器,其中包含示例 Swagger 规范的源代码,以及右侧的人类可读的 API 文档。
让我们导入 OpenFaaS Swagger 规范。 在顶部菜单中,单击 File 按钮,然后单击 Import 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
:
curl -u admin:your_openfaas_password -X GET https://example.com/system/functions
您可以在 API 文档中查看每个端点所需的方法。
在第 4 步中,您部署了几个示例函数,它们应该出现在输出中:
Output[{"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"}}]
如果您没有看到类似这样的输出,或者您看到错误,请按照屏幕上的说明解决问题,然后再继续本教程。 确保您使用推荐的方法和正确的凭据将请求发送到正确的端点。 您还可以使用以下命令检查 gateway
服务的日志:
docker service logs func_gateway
默认情况下,对 curl
调用的 API 响应返回不带新行的原始 JSON,这是人类不可读的。 要对其进行解析,请将 curl
的响应传递给 jq
实用程序,该实用程序会将 JSON 转换为人类可读的形式:
curl -u admin:your_openfaas_password -X GET https://example.com/system/functions | jq
输出现在是人类可读的形式。 您可以看到函数名称,您可以使用它来管理和调用 API 中的函数,调用次数,以及标签和副本数等与 Docker 相关的信息:
Output[ { "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" } } ]
让我们使用 API /function/function-name
端点来执行其中一个函数。 此端点可通过 POST 方法使用,其中 -d
标志允许您将数据发送到函数。
例如,让我们运行以下 curl
命令来执行 OpenFaaS 自带的 echoit
函数,并输出您发送的字符串作为请求。 您可以使用字符串 "Sammy The Shark"
来演示:
curl -u admin:your_openfaas_password -X POST https://example.com/function/func_echoit -d "Sammy The Shark"
输出将显示 Sammy The Shark
:
OutputSammy The Shark
如果您看到错误,请按照屏幕上的日志解决问题,然后再继续本教程。 您还可以查看 gateway
服务的日志。
至此,您已经使用 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 Code Generator - Go 项,点击它,然后点击窗口底部的 Deploy 按钮:
点击Deploy后,Deploy A New Function窗口会关闭,函数会被部署。 在窗口左侧的列表中,您将看到 qrcode-go 函数的列表。 单击此条目以选择它。 主函数窗口将显示函数名称、副本数、调用计数和图像,以及调用函数的选项:
让我们生成一个二维码,其中包含您的域的 URL。 在 Request body 字段中,输入您要生成的二维码的内容; 在我们的例子中,这将是 “example.com”。 完成后,单击 Invoke 按钮。
当您选择 Text 或 JSON 输出选项时,该函数将输出文件的内容,该内容不可用或不可读:
您可以下载回复。 在我们的例子中,这将是一个带有 QR 码的 PNG 文件。 为此,请选择 Download 选项,然后再次单击 Invoke。 不久之后,您应该下载了 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 服务器上运行它。 此函数类似于默认的 echoit
函数,它返回作为请求传递的输入。
我们将使用 Python 来编写我们的函数。 如果您想了解有关 Python 的更多信息,可以查看我们的 如何在 Python 3 中编码教程系列 和我们的 如何在 Python 中编码电子书。
在创建新函数之前,让我们创建一个目录来存储 FaaS 函数并导航到它:
mkdir ~/faas-functions cd ~/faas-functions
执行以下命令以创建一个名为 echo-input
的新 Python 函数。 确保将 your-docker-hub-username
替换为您的 Docker Hub 用户名,因为稍后您将把函数推送到 Docker Hub:
faas-cli new echo-input --lang python --prefix your-docker-hub-username --gateway https://example.com
输出包含有关成功创建函数的确认。 如果您没有下载模板,CLI 将下载您当前目录中的模板:
Output2018/05/13 12:13:06 No templates found in current directory. 2018/05/13 12:13:06 Attempting to expand templates from https://github.com/openfaas/templates.git 2018/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 Folder: echo-input created. ___ _____ ____ / _ \ _ __ ___ _ __ | ___|_ _ __ _/ ___| | | | | '_ \ / _ \ '_ \| |_ / _` |/ _` \___ \ | |_| | |_) | __/ | | | _| (_| | (_| |___) | \___/| .__/ \___|_| |_|_| \__,_|\__,_|____/ |_| Function created in folder: echo-input Stack file written: echo-input.yml
faas-cli new
命令的结果是新创建的 ~/faas-fucntions/echo-input
目录,其中包含函数代码和 echo-input.yml
文件。 此文件包含有关您的函数的信息:它使用什么语言、它的名称以及您将在其上部署它的服务器。
导航到 ~/faas-fucntions/echo-input
目录:
cd ~/faas-fucntions/echo-input
要查看目录的内容,请执行:
ls
该目录包含两个文件:handler.py
,其中包含您的函数的代码,以及 requirements.txt
,其中包含函数所需的 Python 模块。
由于我们目前不需要任何非默认 Python 模块,因此 requirements.txt
文件为空。 您可以使用 cat
命令进行检查:
cat requirements.txt
接下来,让我们编写一个将请求作为字符串返回的函数。
handler.py
文件已包含示例处理程序代码,该代码将接收到的响应作为字符串返回。 让我们看一下代码:
nano handler.py
默认函数称为 handle
并采用单个参数 req
,其中包含在调用时传递给函数的请求。 该函数只做一件事,将传递的请求作为响应返回:
def handle(req): """handle a request to the function Args: req (str): request body """ return req
让我们修改它以包含额外的文本,替换 return
指令中的字符串,如下所示:
return "Received message: " + req
完成后,保存文件并关闭文本编辑器。
接下来,让我们从函数的源代码构建一个 Docker 映像。 导航到echo-input.yml
文件所在的faas-functions
目录:
cd ~/faas-functions
以下命令为您的函数构建 Docker 映像:
faas-cli build -f echo-input.yml
输出包含有关构建进度的信息:
Output[0] > Building echo-input. Clearing temporary build folder: ./build/echo-input/ Preparing ./echo-input/ ./build/echo-input/function Building: sammy/echo-input with python template. Please wait.. Sending build context to Docker daemon 7.168kB Step 1/16 : FROM python:2.7-alpine ---> 5fdd069daf25 Step 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 ---> Using cache ---> 247d4772623a Step 3/16 : WORKDIR /root/ ---> Using cache ---> 532cc683d67b Step 4/16 : COPY index.py . ---> Using cache ---> b4b512152257 Step 5/16 : COPY requirements.txt . ---> Using cache ---> 3f9cbb311ab4 Step 6/16 : RUN pip install -r requirements.txt ---> Using cache ---> dd7415c792b1 Step 7/16 : RUN mkdir -p function ---> Using cache ---> 96c25051cefc Step 8/16 : RUN touch ./function/__init__.py ---> Using cache ---> 77a9db274e32 Step 9/16 : WORKDIR /root/function/ ---> Using cache ---> 88a876eca9e3 Step 10/16 : COPY function/requirements.txt . ---> Using cache ---> f9ba5effdc5a Step 11/16 : RUN pip install -r requirements.txt ---> Using cache ---> 394a1dd9e4d7 Step 12/16 : WORKDIR /root/ ---> Using cache ---> 5a5893c25b65 Step 13/16 : COPY function function ---> eeddfa67018d Step 14/16 : ENV fprocess="python index.py" ---> Running in 8e53df4583f2 Removing intermediate container 8e53df4583f2 ---> fb5086bc7f6c Step 15/16 : HEALTHCHECK --interval=1s CMD [ -e /tmp/.lock ] || exit 1 ---> Running in b38681a71378 Removing intermediate container b38681a71378 ---> b04c045b0994 Step 16/16 : CMD ["fwatchdog"] ---> Running in c5a11078df3d Removing intermediate container c5a11078df3d ---> bc5f08157c5a Successfully built bc5f08157c5a Successfully tagged sammy/echo-input:latest Image: your-docker-hub-username/echo-input built. [0] < Building echo-input done. [0] worker done.
如果出现错误,请确保在部署功能之前按照屏幕上的说明进行解决。
您需要将 OpenFaaS 功能容器化才能部署它。 容器化应用程序可确保运行您的应用程序所需的环境可以轻松复制,并且您的应用程序可以轻松部署、扩展和更新。
对于本教程,我们将使用 Docker Hub,因为它是一个免费的解决方案,但您可以使用任何容器注册表,包括您自己的私有注册表。
运行以下命令将您构建的映像推送到 Docker Hub 上的指定存储库:
faas-cli push -f echo-input.yml
推送将需要几分钟,具体取决于您的互联网连接速度。 输出包含图像的上传进度:
Output[0] > Pushing echo-input. The push refers to repository [docker.io/sammy/echo-input] 320ea573b385: Pushed 9d87e56f5d0c: Pushed 6f79b75e7434: Pushed 23aac2d8ecf2: Pushed 2bec17d09b7e: Pushed e5a0e5ab3be6: Pushed e9c8ca932f1b: Pushed beae1d55b4ce: Pushed 2fcae03ed1f7: Pushed 62103d5daa03: Mounted from library/python f6ac6def937b: Mounted from library/python 55c108c7613c: Mounted from library/python e53f74215d12: Mounted from library/python latest: digest: sha256:794fa942c2f593286370bbab2b6c6b75b9c4dcde84f62f522e59fb0f52ba05c1 size: 3033 [0] < Pushing echo-input done. [0] worker done.
最后,将您的镜像推送到 Docker Hub,您可以使用它将功能部署到您的 OpenFaaS 服务器。
要部署您的函数,请运行 deploy
命令,该命令获取描述您的函数的清单的路径,以及您的 OpenFaaS 服务器的地址:
faas-cli deploy -f echo-input.yml --gateway https://example.com
输出显示部署的状态,以及您正在部署的函数的名称和部署状态代码:
OutputDeploying: echo-input. Deployed. 200 OK. URL: https://example.com/function/echo-input
如果部署成功,您将看到 200
状态码。 如果出现错误,请按照提供的说明解决问题,然后再继续。
此时,您的功能已部署并可以使用。 您可以通过调用它来测试它是否按预期工作。
要使用 FaaS CLI 调用函数,请使用 invoke
命令,将函数名称和 OpenFaaS 地址传递给它。 执行命令后,系统会要求您输入要发送给函数的请求。
执行以下命令调用echo-input
函数:
faas-cli invoke echo-input --gateway https://example.com
系统将要求您输入要发送到函数的请求:
OutputReading from STDIN - hit (Control + D) to stop.
输入要发送到函数的文本,例如:
Sammy The Shark!
完成后,按 ENTER
然后按 CTRL + D
完成请求。 终端中的 CTRL + D
快捷方式用于注册文件结束 (EOF)。 一旦收到 EOF,OpenFaaS CLI 就会停止从终端读取。
几秒钟后,该命令将输出函数的响应:
OutputReading from STDIN - hit (Control + D) to stop. Sammy The Shark! Received message: Sammy The Shark!
如果您没有看到输出或收到错误,请回溯前面的步骤以确保您已按照说明部署了该功能,并按照屏幕上的说明解决问题。
此时,您已经使用三种方法与函数进行了交互:Web UI、API 和 CLI。 能够使用这些方法中的任何一种来执行您的功能为您提供了决定如何将功能集成到现有工作流程中的灵活性。
结论
在本教程中,您使用了无服务器架构和 OpenFaaS,通过 OpenFaaS API、Web UI 和 CLI 部署和管理您的应用程序。 您还通过利用 Traefik 使用 Let's Encrypt 提供 SSL 来保护您的基础架构。