作者选择了自由开源基金会作为“ Write for DOnations”计划的一部分接受捐赠。

介绍

通常,在Internet上托管软件应用程序需要对整体系统进行基础结构管理,规划和监视。与这种传统方法不同,无服务器架构(也称为功能即服务,即FaaS)将您的应用程序分解为功能。这些功能是无状态的,自包含的,事件触发的,功能完整的实体,它们通过您管理的API进行通信,而不是底层硬件和显式基础结构配置。这些功能可通过设计进行扩展,可移植,比常规应用程序设置更快,更易于测试。为了使无服务器架构在原则上能够正常工作,它需要平台不可知的打包和编排功能的方式。

OpenFaaS是一个开源框架,用于使用Docker容器存储和运行功能在Kubernetes上实现无服务器架构。它允许将任何程序打包为容器,并通过命令行或集成的Web UI作为功能进行管理。 OpenFaaS对指标具有出色的支持,并在需求增加时为功能提供自动扩展。

在本教程中,您将OpenFaaS部署到域中的DigitalOcean Kubernetes集群,并使用免费的Let's Encrypt TLS证书对其进行保护。您还将探索其Web UI,并使用官方命令行工具faas-cli部署现有功能和新功能。最后,您将拥有一个灵活的系统来部署无服务器功能。

先决条件

  • 一个DigitalOcean Kubernetes集群,其连接配置为kubectl默认。群集必须至少具有8GB RAM和4个CPU内核可用于OpenFaaS(如果大量使用,则需要更多)。创建集群时,“如何连接到集群”步骤下会显示有关如何配置kubectl的说明。要在DigitalOcean上创建Kubernetes集群,请参阅Kubernetes Quickstart。
  • Docker安装在您的本地计算机上。按照分发的步骤1和2,请参阅如何安装Docker。
  • Docker Hub上的一个帐户,用于存储您将在本教程中创建的Docker映像。
  • faas-cli,用于管理OpenFaaS的官方CLI工具,安装在本地计算机上。有关多个平台的说明,请访问官方文档。
  • 安装在本地计算机上的Helm软件包管理器。为此,请完成步骤1并使用Helm 3 Package Manager教程添加如何在Kubernetes群集上安装软件的步骤2中的稳定仓库。
  • 使用Helm在群集上安装了Nginx Ingress控制器和Cert-Manager,以便使用Ingress资源公开OpenFaaS。有关指导,请遵循如何使用Helm在DigitalOcean Kubernetes上设置Nginx入口。
  • 托管OpenFaaS的完整注册域名,指向Nginx Ingress使用的负载均衡器。本教程将始终使用openfaas.your_domain。您可以在Namecheap上购买域名,在Freenom上免费获取一个域名,或使用您选择的域名注册商。

注意:本教程中使用的域名必须与“如何在DigitalOcean Kubernetes上设置Nginx入口”先决条件教程中使用的域名不同。

第1步-使用Helm安装OpenFaaS

在此步骤中,您将使用Helm将OpenFaaS安装到Kubernetes群集,并将其公开到您的域。

作为Nginx Ingress Controller前提条件的一部分,您创建了示例服务和Ingress。在本教程中,您将不需要它们,因此您可以通过运行以下命令将其删除:

  • kubectl delete -f hello-kubernetes-first.yaml
  • kubectl delete -f hello-kubernetes-second.yaml
  • kubectl delete -f hello-kubernetes-ingress.yaml

由于您将功能部署为Kubernetes对象,因此将它们和OpenFaaS本身存储在集群中单独的命名空间中会很有帮助。 OpenFaaS命名空间将被称为openfaas,而函数命名空间将被称为openfaas-fn。通过运行以下命令在您的集群中创建它们:

  • kubectl apply -f https://raw.githubusercontent.com/openfaas/faas-netes/master/namespaces.yml

您会看到以下输出:

Output
namespace/openfaas created namespace/openfaas-fn created

接下来,您需要添加托管OpenFaaS图表的OpenFaaS Helm存储库。为此,请运行以下命令:

  • helm repo add openfaas https://openfaas.github.io/faas-netes/

Helm将显示以下输出:

Output
"openfaas" has been added to your repositories

刷新Helm的图表缓存:

  • helm repo update

您会看到以下输出:

Output
Hang tight while we grab the latest from your chart repositories... ...Successfully got an update from the "openfaas" chart repository ...Successfully got an update from the "jetstack" chart repository ...Successfully got an update from the "stable" chart repository Update Complete. ⎈ Happy Helming!⎈

在安装OpenFaaS之前,您需要自定义一些图表参数。您将它们存储在本地计算机上的名为values.yaml的文件中。使用文本编辑器创建并打开文件:

  • nano values.yaml

添加以下行:

values.yaml
functionNamespace: openfaas-fn
generateBasicAuth: true

ingress:
  enabled: true
  annotations:
    kubernetes.io/ingress.class: "nginx"
  hosts:
    - host: openfaas.your_domain
      serviceName: gateway
      servicePort: 8080
      path: /

首先,通过将openfaas-fn分配给functionNamespace变量来指定存储函数的名称空间。通过将generateBasicAuth设置为true,您可以命令Helm在访问OpenFaaS Web UI时设置强制身份验证,并为您生成管理员用户名和密码登录组合。

然后,启用Ingress创建并将其进一步配置为使用Nginx Ingress Controller并在您的域中提供网关OpenFaaS服务。

请记住,从前提条件中将openfaas.your_domain替​​换为所需的域。完成后,保存并关闭文件。

最后,使用自定义值将OpenFaaS安装到openfaas命名空间中:

  • helm upgrade openfaas --install openfaas/openfaas --namespace openfaas -f values.yaml

您将看到以下输出:

Output
Release "openfaas" does not exist. Installing it now. NAME: openfaas LAST DEPLOYED: ... NAMESPACE: openfaas STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: To verify that openfaas has started, run: kubectl -n openfaas get deployments -l "release=openfaas, app=openfaas" To retrieve the admin password, run: echo $(kubectl -n openfaas get secret basic-auth -o jsonpath="{.data.basic-auth-password}" | base64 --decode)

输出显示安装成功。运行以下命令以显示管理员帐户的密码:

  • echo $(kubectl -n openfaas get secret basic-auth -o jsonpath="{.data.basic-auth-password}" | base64 --decode) | tee openfaas-password.txt

解码后的密码使用tee同时写入输出和名为openfaas-password.txt的文件。注意输出,这是您的admin帐户的OpenFaaS密码。

您可以通过运行以下命令来观看OpenFaaS容器的可用性:

  • kubectl -n openfaas get deployments -l "release=openfaas, app=openfaas"

当所有列出的部署都准备就绪时,请按CTRL + C退出。

现在,您可以在Web浏览器中导航到指定的域。提示时输入admin作为用户名和随附的密码。您会看到OpenFaaS网络用户界面:

您已经成功安装了OpenFaaS,并在您的域中公开了其控制面板。接下来,您将使用来自Let's Encrypt的免费TLS证书对其进行保护。

步骤2 —为您的域启用TLS

在此步骤中,您将使用由cert-manager提供的“让我们加密”证书来保护您的公开域。

为此,您需要在values.yaml中编辑入口配置。打开它进行编辑:

  • nano values.yaml

添加突出显示的行:

values.yaml
generateBasicAuth: true

ingress:
  enabled: true
  annotations:
    kubernetes.io/ingress.class: "nginx"
    cert-manager.io/cluster-issuer: letsencrypt-prod
  tls:
    - hosts:
        - openfaas.your_domain
      secretName: openfaas-crt
  hosts:
    - host: openfaas.your_domain
      serviceName: gateway
      servicePort: 8080
      path: /

tls块定义了您的站点(在hosts下列出)的证书将在哪些Secret中存储其证书,由letencrypt-prod ClusterIssuer颁发。通常,对于集群中的每个Ingress,指定的Secret都必须不同。

请记住将openfaas.your_domain替​​换为所需的域,然后保存并关闭文件。

通过运行以下命令将更改应用于集群:

  • helm upgrade openfaas --install openfaas/openfaas --namespace openfaas -f values.yaml

您会看到以下输出:

Output
Release "openfaas" has been upgraded. Happy Helming! NAME: openfaas LAST DEPLOYED: ... NAMESPACE: openfaas STATUS: deployed REVISION: 2 TEST SUITE: None NOTES: To verify that openfaas has started, run: kubectl -n openfaas get deployments -l "release=openfaas, app=openfaas" To retrieve the admin password, run: echo $(kubectl -n openfaas get secret basic-auth -o jsonpath="{.data.basic-auth-password}" | base64 --decode)

您需要等待几分钟,让“加密”服务器为您的域颁发证书。同时,您可以通过检查以下命令的输出来跟踪其进度:

  • kubectl describe certificate openfaas-crt -n openfaas

输出的结尾将类似于以下内容:

Output
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal GeneratedKey 24m cert-manager Generated a new private key Normal Requested 16m cert-manager Created new CertificateRequest resource "openfaas-crt-1017759607" Normal Issued 16m cert-manager Certificate issued successfully

当输出的最后一行显示成功颁发的证书时,可以按CTRL + C退出。在浏览器中刷新您的域以进行测试。您会在浏览器中地址栏的左侧看到挂锁,表示您的连接是安全的。

您已经使用来自Let's Encrypt的免费TLS证书保护了OpenFaaS域的安全。现在,您将使用网络用户界面并从中管理功能。

步骤3 —通过Web UI部署功能

在本部分中,您将探索OpenFaaS网络用户界面,然后从中进行部署,管理和调用功能。

OpenFaaS网络用户界面有两个主要部分:左侧是列出已部署功能的列,中间是中央面板,您可以在其中看到有关所选功能并可以与其进行交互的详细信息。

要部署新功能,请单击左上方OpenFaaS徽标下方的“部署新功能”按钮。您会看到一个对话框,要求您选择功能:

“ FROM STORE”选项卡列出了您可以立即部署的官方OpenFaaS功能存储库中的预制功能。每个功能均以简短说明显示,您可以选择功能右侧的链接图标以查看其源代码。要从此列表部署存储功能,请选择它,然后单击DEPLOY按钮。

您还可以通过切换到“自定义”选项卡来提供自己的功能:

在这里,您需要指定功能的Docker映像,该映像是专门为OpenFaaS配置的,可在Docker注册表(例如Docker Hub)中找到。在此步骤中,您将从OpenFaaS商店中部署预制功能,然后在下一步中创建自定义功能并将其部署到Docker Hub。

您将部署NodeInfo函数,该函数返回有关其部署的计算机的信息,例如CPU架构,内核数,可用的总RAM内存以及正常运行时间(以秒为单位)。

从存储功能列表中,选择NodeInfo并单击DEPLOY。它将很快显示在已部署功能的列表中。

选择它。在屏幕中央,您将看到有关已部署功能的基本信息。

功能状态实时更新,应迅速变为Ready。如果它长时间处于“未就绪”状态,则很可能是您的集群缺少资源来接受新的Pod。您可以按照如何调整液滴的大小来获取有关如何解决此问题的信息。

一旦就绪,就可以在显示的URL上访问已部署的功能。要对其进行测试,可以导航到浏览器中的URL,或者从位于函数信息下方的Invoke功能面板中调用它。

您可以在Text,JSON和Download之间进行选择,以指示所需的响应类型。如果您希望请求是POST而不是GET,则可以在Request body字段中提供请求数据。

要调用nodeinfo函数,请单击INVOKE按钮。 OpenFaaS将根据选定的选项设计并执行HTTP请求,并在响应字段中填写接收到的数据。

响应状态为HTTP 200 OK,表示请求已成功执行。响应正文包含NodeInfo函数收集的系统信息,这意味着它可以正确访问并且可以正常工作。

要删除功能,请从列表中选择它,然后单击页面右上角的垃圾桶图标。出现提示时,单击“确定”进行确认。该功能的状态将变为“未就绪”(表示已从集群中删除),并且该功能很快将完全从用户界面中消失。

在此步骤中,您已经使用了OpenFaaS网络用户界面,并从中部署和管理功能。现在,您将看到如何使用命令行来部署和管理OpenFaaS功能。

步骤4 –使用faas-cli管理功能

在本部分中,您将配置faas-cli以与您的集群一起使用。然后,您将通过命令行部署和管理现有功能。

为避免每次运行faas-cli时都必须指定您的OpenFaaS域,请将其存储在名为OPENFAAS_URL的环境变量中,faas-cli的值将在执行期间自动获取并使用。

在主目录中打开.bash_profile进行编辑:

  • nano ~/.bash_profile

添加以下行:

~/.bash_profile
. . .
export OPENFAAS_URL=https://openfaas.your_domain

请记住用您的域替换openfaas.your_domain,然后保存并关闭文件。

为避免再次登录,请手动评估文件:

  • . ~/.bash_profile

现在,确保在本地计算机上安装了faas-cli。如果尚未安装,请按照官方文档中概述的说明进行安装。

然后,通过运行以下命令来设置登录凭据:

  • cat ~/openfaas-password.txt | faas-cli login --username admin --password-stdin

输出将如下所示:

Output
Calling the OpenFaaS server to validate the credentials... credentials saved for admin https://openfaas.your_domain

要从存储中部署功能,请运行以下命令:

  • faas store deploy function_name

您可以尝试通过运行以下命令来部署nodeinfo:

  • faas store deploy nodeinfo

您将看到类似以下的输出:

Output
Deployed. 202 Accepted. URL: https://openfaas.your_domain/function/nodeinfo

要列出已部署的功能,请运行faas list:

  • faas list

您现有的功能将显示:

Output
Function Invocations Replicas nodeinfo 0 1

要获取有关已部署功能的详细信息,请使用faas describe:

  • faas describe nodeinfo

输出将类似于:

Name:                nodeinfo
Status:              Ready
Replicas:            1
Available replicas:  1
Invocations:         0
Image:               functions/nodeinfo-http:latest
Function process:
URL:                 https://openfaas.your_domain/function/nodeinfo
Async URL:           https://openfaas.your_domain/async-function/nodeinfo
Labels:              faas_function : nodeinfo
                     uid : 514253614
Annotations:         prometheus.io.scrape : false

您可以使用faas invoke来调用函数:

  • faas invoke nodeinfo

您会收到以下消息:

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

然后,您可以提供一个请求正文。如果这样做,该方法将是POST而不是GET。完成数据输入后,或希望请求为GET时,请按CTRL + D。然后,faas-cli将执行推断的请求并输出响应,类似于Web UI。

要删除功能,请运行faas remove:

  • faas remove nodeinfo

您将获得以下输出:

Output
Deleting: nodeinfo. Removing old function.

再次运行faas list以查看nodeinfo已被删除:

Output
Function Invocations Replicas

在此步骤中,您已经使用faas-cli从命令行在群集中部署,列出,调用和删除了功能。在下一步中,您将创建自己的函数并将其部署到集群中。

第5步-创建和部署新功能

现在,您将使用faas-cli创建一个示例Node.JS函数,并将其部署到您的集群中。

您将创建的结果函数将打包为Docker容器并发布在Docker Hub上。为了能够发布容器,您需要通过运行以下命令登录:

  • docker login

当提示您完成登录过程时,输入您的Docker Hub用户名和密码。

您将把示例Node.JS函数存储在名为sample-js-function的文件夹中。使用以下命令创建它:

  • mkdir sample-js-function

导航到它:

  • cd sample-js-function

通过运行以下命令,使用JS函数的模板填充目录:

  • faas new sample-js --lang node

输出将如下所示:

Output
2020/03/24 17:06:08 No templates found in current directory. 2020/03/24 17:06:08 Attempting to expand templates from https://github.com/openfaas/templates.git 2020/03/24 17:06:10 Fetched 19 template(s) : [csharp csharp-armhf dockerfile go go-armhf java11 java11-vert -x java8 node node-arm64 node-armhf node12 php7 python python-armhf python3 python3-armhf python3-debian ru by] from https://github.com/openfaas/templates.git Folder: sample-js created. ___ _____ ____ / _ \ _ __ ___ _ __ | ___|_ _ __ _/ ___| | | | | '_ \ / _ \ '_ \| |_ / _` |/ _` \___ \ | |_| | |_) | __/ | | | _| (_| | (_| |___) | \___/| .__/ \___|_| |_|_| \__,_|\__,_|____/ |_| Function created in folder: sample-js Stack file written: sample-js.yml ...

如输出所示,该函数本身的代码位于sample-js文件夹中,而该函数的OpenFaaS配置位于sample-js.yaml文件中。在sample-js目录下(类似于常规的Node.JS项目),有两个文件handler.js和package.json。

handler.js包含实际的JS代码,该代码将在调用该函数时返回响应。处理程序的内容如下所示:

sample-js-function/sample-js/handler.js
"use strict"

module.exports = async (context, callback) => {
    return {status: "done"}
}

它导出带有两个参数的lambda函数,一个带有请求数据的上下文和一个回调,您可以使用该回调传递回响应数据,而不仅仅是返回它。

打开此文件进行编辑:

  • nano sample-js/handler.js

更改突出显示的行,如下所示:

sample-js-function/sample-js/handler.js
"use strict"

module.exports = async (context, callback) => {
    return {status: "<h1>Hello Sammy!</h1>"}
}

完成后,保存并关闭文件。调用该OpenFaaS函数时,将向您问好Sammy!回应。

接下来,打开配置文件进行编辑:

  • nano sample-js.yml

它将如下所示:

sample-js-function/sample-js.yml
version: 1.0
provider:
  name: openfaas
  gateway: https://openfaas.your_domain
functions:
  sample-js:
    lang: node
    handler: ./sample-js
    image: sample-js:latest

对于provider,它指定openfaas和默认网关。然后,它定义sample-js函数,指定其语言(节点),其处理程序和Docker映像名称,您需要对其进行修改以包括Docker Hub帐户用户名,如下所示:

sample-js-function/sample-js.yml
version: 1.0
provider:
  name: openfaas
  gateway: http://127.0.0.1:8080
functions:
  sample-js:
    lang: node
    handler: ./sample-js
    image: your_docker_hub_username/sample-js:latest

保存并关闭文件。

然后,通过运行以下命令,同时构建Docker映像,将其推送到Docker Hub并将其部署在您的集群上:

  • faas up -f sample-js.yml

将有很多输出(主要来自Docker),输出将像这样结束:

Output
. . . [0] < Pushing sample-js [your_docker_hub_username/sample-js:latest] done. [0] Worker done. Deploying: sample-js. Deployed. 202 Accepted. URL: https://openfaas.your_domain/function/sample-js

调用您新部署的功能以确保其正常工作:

  • faas invoke sample-js

按CTRL + D。您会看到以下输出:

Output
<h1>Hello Sammy!</h1>

这意味着该功能已正确打包和部署。

您可以通过运行以下命令删除该功能:

  • faas remove sample-js

现在,您已经成功在集群中的OpenFaaS实例上创建并部署了自定义Node.JS函数。

结论

您已经在DigitalOcean Kubernetes集群上部署了OpenFaaS,并准备部署和访问预制功能和自定义功能。现在,您可以实现“功能即服务”架构,该架构可以提高资源利用率并提高应用程序的性能。

如果您想进一步了解OpenFaaS的高级功能,例如对已部署功能进行自动缩放并监视其性能,请访问官方文档。