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

介绍

无服务器架构从开发人员隐藏服务器实例,并且通常公开允许开发人员在云中运行其应用程序的API。这种方法可以帮助开发人员快速部署应用程序,因为他们可以将配置和维护实例留给相应的DevOps团队。它还可以降低基础架构成本,因为通过适当的工具,您可以按需扩展实例。

在无服务器平台上运行的应用程序称为无服务器功能。函数是容器化的,可执行代码,用于执行特定操作。容器化应用程序可确保您可以在许多计算机上重现一致的环境,从而实现更新和扩展。

OpenFaaS是一个免费的开源框架,用于构建和托管无服务器功能。通过对Docker SwarmKubernetes的官方支持,它允许您使用功能强大的API,命令行界面或Web UI部署应用程序。它配备了Prometheus提供的内置指标,支持按需自动扩展,以及从零开始扩展。

在本教程中,您将使用在Ubuntu 16.04上运行的Docker Swarm设置和使用OpenFaaS,并通过使用Let's Encypt设置Traefik来保护其Web UI和API 。这确保了集群中节点之间以及OpenFaaS与其运营商之间的安全通信。

准备

要学习本教程,您需要:

  • 在本地计算机上运行Ubuntu 16.04。您可以使用其他发行版和操作系统,但请确保为操作系统使用适当的OpenFaaS脚本,并安装这些准备中列出的所有依赖项。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器
  • 在本地计算机上安装git, curljq。您将使用git来克隆OpenFaaS存储库,curl来测试API以及jq将原始JSON响应从API转换为人类可读的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
  • 一个包含3个节点的Docker Swarm集群
  • 一个完全注册的域名,其A记录指向Docker Swarm中的一个实例。在整个教程中,您将看到example.com作为示例域。如果您没有域名,建议您先去这里注册一个域名,您需要将域名解析到您的服务器,您可以使用腾讯云云解析进行快速设置。

第1步 - 下载OpenFaaS并安装OpenFaaS CLI

要将OpenFaaS部署到Docker Swarm,您需要下载部署清单和脚本。获取它们的最简单方法是克隆官方OpenFaas存储库并查看代表OpenFaaS版本的相应标记。

除了克隆存储库之外,您还将安装FaaS CLI,这是一个功能强大的命令行实用程序,可用于管理和部署终端中的新功能。它提供了用于在大多数主要编程语言中创建自己的函数的模板。在第7步中,您将使用它来创建Python函数并将其部署在OpenFaaS上。

在本教程中,您将部署OpenFaaS v 0.8.9。虽然部署其他版本的步骤应该类似,但请务必查看项目更改日志以确保没有重大更改。

首先,导航到您的主目录并运行以下命令将存储库克隆到~/faas目录:

cd ~
git clone https://github.com/openfaas/faas.git

导航到新创建的~/faas目录:

cd ~/faas

克隆存储库时,您将从主分支获取包含最新更改的文件。由于重大更改可以进入主分支,因此不建议在生产中使用。相反,让我们看看0.8.9标签:

git checkout 0.8.9

输出包含有关成功签出的消息以及有关对此分支提交更改的警告:

Note: 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版本的信息:

x86_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

输出显示可用的命令和标志:

  ___                   _____           ____
 / _ \ _ __   ___ _ __ |  ___|_ _  __ _/ ___|
| | | | '_ \ / _ \ '_ \| |_ / _` |/ _` \___ \
| |_| | |_) |  __/ | | |  _| (_| | (_| |___) |
 \___/| .__/ \___|_| |_|_|  \__,_|\__,_|____/
      |_|
​
​
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的加密来保护您的OpenFaaS设置。

第2步 - 配置Traefik

Traefik是一个支持Docker的反向代理,它带有Let's Encrypt提供的SSL支持。SSL协议通过加密您在节点之间发送和接收的数据,确保您安全地与Swarm群集通信。

要将Traefik与OpenFaaS一起使用,您需要修改OpenFaaS部署清单以包含Traefik并告诉OpenFaaS使用Traefik而不是直接将其服务暴露给互联网。

导航回~/faas目录并在文本编辑器中打开OpenFaaS部署清单:

cd ~/faas
nano ~/faas/docker-compose.yml

注意: Docker Compose清单文件使用YAML格式,严格禁止选项卡,并且需要两个空格来缩进。如果文件格式不正确,清单将无法部署。

OpenFaaS部署由services指令下定义的若干服务组成,这些服务提供运行OpenFaaS,OpenFaaS API和Web UI以及Prometheus和AlertManager(用于处理指标)所需的依赖关系。

services节的开头,添加一个名为traefik的新服务,该服务使用traefik:v1.6映像进行部署:

version: "3.3"
services:
    traefik:
        image: traefik:v1.6
    gateway:
         ...

Traefik图像来自Traefik Docker Hub存储库,您可以在其中找到所有可用图像的列表。

接下来,让我们指示Docker使用该command指令运行Traefik 。这将运行Traefik,将其配置为与Docker Swarm一起使用,并使用Let的加密提供SSL。以下标志将配置Traefik:

  • --docker.*:这些标志告诉Traefik使用Docker并指定它在Docker Swarm集群中运行。
  • --web=true:此标志启用Traefik的Web UI。
  • --defaultEntryPoints--entryPoints:这些标志定义要使用的入口点和协议。在我们的例子中,这包括端口80上的HTTP和端口443上的HTTPS 。
  • --acme.*:这些标志告诉Traefik使用ACME生成Let的加密证书,以使用SSL保护您的OpenFaaS集群。

确保使用您将用访问OpenFaaS 的example.com域替换--acme.domains--acme.email标记中的域占位符。您可以通过用逗号和空格分隔多个域来指定它们。电子邮件地址用于SSL通知和警报,包括证书到期警报。在这种情况下,Traefik将自动处理续订证书,因此您可以忽略到期警报。

image指令下面添加以下代码块,以及gateway

...
    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暴露在互联网和映射到容器的右侧端口:

        ...
        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指令:

        ...
        volumes:
            - "/var/run/docker.sock:/var/run/docker.sock"
            - "acme:/etc/traefik/acme"
        networks:
            - functions
        deploy:
            placement:
                constraints: [node.role == manager]

此时,traefik服务块应如下所示:

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服务配置为在端口8080上运行,该端口与Traefik重叠。

gateway服务提供了可用于部署,运行和管理功能的API网关。它处理指标(通过Prometheus)和自动扩展,并托管Web UI。

我们的目标是使用Traefik 公开服务gateway,而不是直接将其暴露给互联网。

找到gateway服务,它应如下所示:

...
    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端点:

        ...
        deploy:
            labels:
                - traefik.port=8080
                - traefik.frontend.rule=PathPrefix:/ui,/system,/function
            resources:
            ...            

/ui端点暴露OpenFaaS网络用户界面,这是包括在本教程步骤6中。该/system端点是用来管理OpenFaaS的API端点,而/function端点公开的管理和运行函数的API端点。本教程的第5步详细介绍了OpenFaaS API。

修改后,您的gateway服务应如下所示:

...
    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的加密证书的卷acme。我们可以定义一个空卷,这意味着如果销毁容器,数据将不会持久存在。如果销毁容器,则下次启动Traefik时将重新生成证书。

在文件的最后一行添加volumes指令:

...
volumes:
    acme:

完成后,保存文件并关闭文本编辑器。此时,您已配置Traefik以保护您的OpenFaaS部署和Docker Swarm。现在,您已准备好在Swarm群集上将其与OpenFaaS一起部署。

第3步 - 部署OpenFaaS

现在您已准备好OpenFaaS部署清单,您已准备好部署它并开始使用OpenFaaS。要部署,您将使用该deploy_stack.sh脚本。此脚本适用于Linux和macOS操作系统,但在OpenFaaS目录中,您还可以找到适用于WindowsARM系统的相应脚本。

在部署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:

Attempting 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假定网关服务器正在localhost上运行:

echo -n your_openfaas_password | faas-cli login --username=admin --password-stdin --gateway https://example.com

输出包含有关成功授权的消息:

Calling 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

输出包含状态代码和指示部署是否成功的消息:

Deploying: 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

输出包含一系列函数,以及它们的副本号和一个调用计数:

Function                        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编辑器一起使用,将规范转换为人类可读的形式。

导航您的Web浏览器到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

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相关的标签和副本数量等信息:

[
  {
    "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命令来执行该echoit功能,它随附OpenFaaS,并输出您作为请求发送的字符串。您可以使用该字符串"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 Store生成QR代码并生成示例代码。

首先,将Web浏览器指向https://example.com/ui/。请注意,需要使用尾部斜杠以避免“未找到”错误。

在HTTP身份验证对话框中,输入在步骤3中部署OpenFaaS时获得的用户名和密码。

登录后,您将看到屏幕左侧的可用功能,以及用于安装新功能的“ 部署新功能”按钮。

单击Deploy New Functions以部署新功能。您将看到FaaS Store窗口,该窗口提供社区测试的功能,您只需单击即可安装:

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

在本教程中,您将从FaaS Store 部署QR代码生成器功能。找到QR代码生成器 -列表中的Go项目,单击它,然后单击窗口底部的Deploy按钮:

单击Deploy后,将关闭Deploy A New Function窗口并部署该功能。在窗口左侧的列表中,您将看到该qrcode-go功能的列表。单击此条目以选择它。主函数窗口将显示函数名称,副本数量,调用计数和图像,以及调用函数的选项:

让我们生成一个QR码,其中包含您域名的URL。在“ 请求正文”字段中,键入您要生成的QR代码的内容; 在我们的例子中,这将是“example.com”。完成后,单击“ 调用”按钮。

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

您可以下载回复。在我们的例子中,它将是一个带有QR码的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服务器上运行它。此函数类似于默认echoit函数,它返回作为请求传递的输入。

我们将使用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将下载当前目录中的模板:

2018/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镜像。导航到faas-functions文件所在的目录echo-input.yml

cd ~/faas-functions

以下命令为您的函数构建Docker镜像:

faas-cli build -f echo-input.yml

输出包含有关构建进度的信息:

[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

推送将需要几分钟,具体取决于您的互联网连接速度。输出包含图像的上传进度:

[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调用函数,请通过将函数名称和OpenFaaS地址传递给它来使用invoke命令。执行该命令后,系统会要求您输入要发送给该功能的请求。

执行以下命令以调用该echo-input函数:

faas-cli invoke echo-input --gateway https://example.com

系统会要求您输入要发送给该功能的请求:

Reading from STDIN - hit (Control + D) to stop.

输入要发送给该功能的文本,例如:

Sammy The Shark!

完成后,按ENTER,然后CTRL + D完成请求。终端中的快捷方式CTRL + D用于注册文件结束(EOF)。收到EOF后,OpenFaaS CLI将停止从终端读取数据。

几秒钟后,该命令将输出函数的响应:

Reading 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来保护您的基础架构。

想要了解更多关于使用Docker Swarm安装和保护OpenFaaS的相关教程,请前往腾讯云+社区学习更多知识。


参考文献:《How To Install and Secure OpenFaaS Using Docker Swarm on Ubuntu 16.04》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏运维小白

19.3/19.4/19.6 安装zabbix

安装zabbix 官网下载地址 wget repo.zabbix.com/zabbix/3.2/rhel/7/x86_64/zabbix-release-3.2...

31410
来自专栏分布式系统和大数据处理

基于Docker的持续集成方案(安装和配置MySql) - Part.3

这篇文章介绍了使用Docker安装MySql数据库的操作步骤,以及安装完成后如何对MySql进行配置。

1863
来自专栏恰童鞋骚年

Java微服务之Spring Boot on Docker

本文学习前提:Java, Spring Boot, Docker, Spring Cloud

2614
来自专栏容器云生态

overlayfs存储驱动的使用以及技术探究

overlayfs存储驱动的使用以及技术探究 1.overlayfs 基本概念 一种联合文件系统,设计简单,速度更快。overlayfs在linux主机上只有两...

37810
来自专栏云原生架构实践

Docker Data Center系列(一)- 快速搭建云原生架构的实践环境

DDC是Docker Data Center的简称,是Docker公司推出的容器化数据中心管理平台。它的编排核心是swarm,包含2个主要组件UCP和DTR。

1896
来自专栏写代码的海盗

Docker学习总结之Run命令介绍 Operator exclusive options

Docker学习总结之Run命令介绍 本文由Vikings(http://www.cnblogs.com/vikings-blog/) 原创,转载请标明.谢谢!...

3285
来自专栏Samego开发资源

IDEA配置Tomcat服务器并创建Java Web项目

2913
来自专栏轻量级微服务

Docker Swarm 进阶: 节点标签与服务

constraints 可以匹配 node 标签和 engine 标签,engine.labels 适用于 Docker Engine 标签,如操作系统,驱动程...

1223
来自专栏码神联盟

框架 | SpringBoot项目发布到自动化容器Docker步骤

4923
来自专栏小狼的世界

Kubernetes基础:Pod的详细介绍

Pod是Kubernetes中能够创建和部署的最小单元,是Kubernetes集群中的一个应用实例,总是部署在同一个节点Node上。Pod中包含了一个或多个容器...

1364

扫码关注云+社区

领取腾讯云代金券