如何在 DigitalOcean Kubernetes 上使用 OpenFaaS 运行无服务器功能

作者选择了 自由和开源基金作为 写给捐款计划的一部分接受捐款。

介绍

通常情况下,在互联网上托管软件应用程序需要对单一系统的基础设施管理、规划和监控。与这种传统方法不同,无服务器的架构(也称为 function as a service,或FaaS)将您的应用程序分解为 functions。这些功能是无状态的、自我包含的、事件触发的、功能完整的实体,这些实体通过您管理的API进行通信,而不是底层硬件和明确的基础设施的提供。

OpenFaaS是一个开源框架,用于在Kubernetes上实现无服务器架构,使用Docker容器存储和运行函数。它允许任何程序作为容器包装并通过命令行或集成Web UI作为函数管理。

在本教程中,您将部署OpenFaaS到您的DigitalOcean Kubernetes集群,并使用免费的Let's Encrypt TLS证书保护它,您还将探索其Web UI,并使用官方命令行工具faas-cli部署现有和新功能。

前提条件

<$>[注] **注:**您在本教程中使用的域名必须与如何在DigitalOcean Kubernetes上设置 Nginx Ingress前提教程中使用的域名不同。

步骤 1 — 使用头盔安装 OpenFaaS

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

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

1kubectl delete -f hello-kubernetes-first.yaml
2kubectl delete -f hello-kubernetes-second.yaml
3kubectl delete -f hello-kubernetes-ingress.yaml

由于您将作为 Kubernetes 对象部署函数,所以将它们和 OpenFaaS 本身存储在群集中的单独名称空间中是有用的。

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

您将看到以下输出:

1[secondary_label Output]
2namespace/openfaas created
3namespace/openfaas-fn created

接下来,您需要添加 OpenFaaS Helm 存储库,该存储库托管 OpenFaaS 图表。

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

头盔将显示以下输出:

1[secondary_label Output]
2"openfaas" has been added to your repositories

更新HELM的图表缓存:

1helm repo update

您将看到以下输出:

1[secondary_label Output]
2Hang tight while we grab the latest from your chart repositories...
3...Successfully got an update from the "openfaas" chart repository
4...Successfully got an update from the "jetstack" chart repository
5...Successfully got an update from the "stable" chart repository
6Update Complete. ⎈ Happy Helming!⎈

在安装 OpenFaaS 之前,您需要定制一些图表参数,将其存储在本地机器上,以名为 values.yaml 的文件中。

1nano values.yaml

添加以下几行:

 1[label values.yaml]
 2functionNamespace: openfaas-fn
 3generateBasicAuth: true
 4
 5ingress:
 6  enabled: true
 7  annotations:
 8    kubernetes.io/ingress.class: "nginx"
 9  hosts:
10    - host: openfaas.your_domain
11      serviceName: gateway
12      servicePort: 8080
13      path: /

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

然后,您启用 Ingress 创建并进一步配置它以使用 Nginx Ingress 控制器并在您的域内服务 OpenFaaS 服务。

请记住,从前提条件中用你想要的域名取代 domain.your_domain. 完成后,保存并关闭文件。

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

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

您将看到以下结果:

 1[secondary_label Output]
 2Release "openfaas" does not exist. Installing it now.
 3NAME: openfaas
 4LAST DEPLOYED: ...
 5NAMESPACE: openfaas
 6STATUS: deployed
 7REVISION: 1
 8TEST SUITE: None
 9NOTES:
10To verify that openfaas has started, run:
11
12  kubectl -n openfaas get deployments -l "release=openfaas, app=openfaas"
13To retrieve the admin password, run:
14
15  echo $(kubectl -n openfaas get secret basic-auth -o jsonpath="{.data.basic-auth-password}" | base64 --decode)

输出显示安装成功. 运行以下命令,揭示admin帐户的密码:

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

解密密码被写入输出和一个名为openfaas-password.txt的文件,同时使用tee

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

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

当所有列出的部署成为准备,键入CTRL + C来退出。

您现在可以在您的 Web 浏览器中导航到指定的域名。 请在提示时输入admin作为用户名和附带密码。

OpenFaaS - Empty Control Panel

您已经成功安装了 OpenFaaS,并将其控制面板暴露在您的域中,接下来,您将使用免费的TLS证书从Let's Encrypt中保护它。

第2步:为您的域名启用TLS

在此步骤中,您将使用 cert-manager 提供的 Let's Encrypt 证书保护您的暴露的域名。

要做到这一点,您需要在 values.yaml 中编辑 ingress config。

1nano values.yaml

添加突出的线条:

 1[label values.yaml]
 2generateBasicAuth: true
 3
 4ingress:
 5  enabled: true
 6  annotations:
 7    kubernetes.io/ingress.class: "nginx"
 8    cert-manager.io/cluster-issuer: letsencrypt-prod
 9  tls:
10    - hosts:
11        - openfaas.your_domain
12      secretName: openfaas-crt
13  hosts:
14    - host: openfaas.your_domain
15      serviceName: gateway
16      servicePort: 8080
17      path: /

tls块定义了您网站的证书(列为主机)将存储他们的证书的秘密,而letsencrypt-prod ClusterIssuer 将其发行。

请记住,用你想要的域名取代 domain.your_domain,然后保存并关闭文件。

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

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

您将看到以下输出:

 1[secondary_label Output]
 2Release "openfaas" has been upgraded. Happy Helming!
 3NAME: openfaas
 4LAST DEPLOYED: ...
 5NAMESPACE: openfaas
 6STATUS: deployed
 7REVISION: 2
 8TEST SUITE: None
 9NOTES:
10To verify that openfaas has started, run:
11
12  kubectl -n openfaas get deployments -l "release=openfaas, app=openfaas"
13To retrieve the admin password, run:
14
15  echo $(kubectl -n openfaas get secret basic-auth -o jsonpath="{.data.basic-auth-password}" | base64 --decode)

您需要等待几分钟,让 Let’s Encrypt 服务器为您的域发行证书,同时,您可以通过检查以下命令的输出来跟踪其进展:

1kubectl describe certificate openfaas-crt -n openfaas

输出的结尾将看起来像这样:

1[secondary_label Output]
2Events:
3  Type Reason Age From Message
4  ----    ------        ----  ----          -------
5  Normal GeneratedKey 24m cert-manager Generated a new private key
6  Normal Requested 16m cert-manager Created new CertificateRequest resource "openfaas-crt-1017759607"
7  Normal Issued 16m cert-manager Certificate issued successfully

当输出的最后一行读到证书成功发行,你可以通过点击CTRL + C退出。刷新你的域在你的浏览器中进行测试.你会看到在你的浏览器地址栏的左侧的锁定,表示你的连接是安全的。

您已使用免费的TLS证书从Let's Encrypt保护您的OpenFaaS域名,现在您将使用Web UI并从中管理功能。

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

在本节中,您将探索OpenFaaS Web UI,然后部署,管理和调用功能。

OpenFaaS Web UI有两个主要部分:在左侧,将列出部署的函数的列表,以及中央面板,您将看到有关选定的函数的详细信息,并能够与之交互。

要部署一个新函数,请点击在左上角的 OpenFaaS 标志下方的 ** 部署新函数 ** 按钮。

OpenFaaS - Deploy a New Function dialog

FROM STORE 选项卡上列出从官方 OpenFaaS 函数商店中提前创建的函数,您可以立即部署它们.每个函数都显示了简短的描述,您可以选择函数右侧的链接图标,以查看其源代码。

您也可以通过切换到 CUSTOM 选项卡来提供自己的功能:

OpenFaaS - Deploy a Custom Function

在这里,您需要指定为 OpenFaaS 配置的功能的 Docker 图像,并可在 Docker 注册表(如 Docker Hub)中使用。

您将部署NodeInfo函数,该函数将返回有关部署的机器的信息,如CPU架构,核心数量,可用的总RAM内存和运行时间(在秒)。

从存储函数列表中,选择 NodeInfo,然后点击 DEPLOY. 它很快就会出现在部署函数列表中。

OpenFaaS - NodeInfo Deployed

在屏幕的中央部分,你会看到有关部署的功能的基本信息。

OpenFaaS - Deployed Function Info

该函数的状态在实时更新,并应迅速转换为准备好。如果该函数停留在不准备好的位置更长时间,那么您的集群很可能缺乏接受新 pod 的资源。

一旦准备好了,部署的函数可以在显示的URL上访问,要测试它,您可以导航到浏览器中的URL,或者从函数信息下方的 Invoke 函数面板调用它。

OpenFaaS - Invoke Deployed Function

您可以选择 ** 文本**、 ** JSON** 和 ** 下载** 以表示您所期望的响应类型. 如果您希望请求成为POST而不是GET,则可以在 ** 请求体** 字段中提供请求数据。

要调用nodeinfo函数,请点击INVOKE按钮,OpenFaaS将根据所选选项编写和执行 HTTP 请求,并用收到的数据填写响应字段。

OpenFaaS - nodeinfo Function Response

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

要删除一个函数,请从列表中选择该函数,然后点击页面右上角的垃圾可以图标. 当被提示时,请点击 OK 以确认。

在此步骤中,您已经使用了 OpenFaaS Web UI,以及部署和管理功能,现在您将看到如何使用命令行部署和管理 OpenFaaS 函数。

步骤 4 – 使用 faas-cli 管理函数

在本节中,您将配置 faas-cli以与群集一起工作,然后通过命令行部署和管理现有函数。

为了避免每次运行 faas-cli 时需要指定您的 OpenFaaS 域名,您将将其存储在名为OPENFAAS_URL的环境变量中,其值将在执行过程中自动被 faas-cli 收集并使用。

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

1nano ~/.bash_profile

添加下列行:

1[label ~/.bash_profile]
2. . .
3export OPENFAAS_URL=https://openfaas.your_domain

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

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

1. ~/.bash_profile

现在,请确保您在本地计算机上安装了 faas-cli. 如果您尚未安装它,请按照 官方文件中所述的指示执行。

然后,通过运行以下命令设置您的登录凭证:

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

结果将看起来像:

1[secondary_label Output]
2Calling the OpenFaaS server to validate the credentials...
3credentials saved for admin https://openfaas.your_domain

要从商店部署一个函数,请运行以下命令:

1faas store deploy function_name

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

1faas store deploy nodeinfo

你会看到输出如下:

1[secondary_label Output]
2Deployed. 202 Accepted.
3URL: https://openfaas.your_domain/function/nodeinfo

要列出部署的函数,运行faas list:

1faas list

您的现有功能将显示:

1[secondary_label Output]
2Function Invocations Replicas
3nodeinfo 0 1

若要获取有关部署函数的详细信息,请使用faas describe:

1faas describe nodeinfo

产量将类似于:

 1Name:                nodeinfo
 2Status:              Ready
 3Replicas:            1
 4Available replicas:  1
 5Invocations:         0
 6Image:               functions/nodeinfo-http:latest
 7Function process:
 8URL:                 https://openfaas.your_domain/function/nodeinfo
 9Async URL:           https://openfaas.your_domain/async-function/nodeinfo
10Labels:              faas_function : nodeinfo
11                     uid : 514253614
12Annotations:         prometheus.io.scrape : false

您可以用「faas invoke」召唤一个函数:

1faas invoke nodeinfo

你会收到以下消息:

1[secondary_label Output]
2Reading from STDIN - hit (Control + D) to stop.

然后,您可以提供一个请求体. 如果您这样做,该方法将是POST而不是GET。当您完成输入数据或希望请求为GET时,请按CTRL + D

要删除一个函数,运行faas remove:

1faas remove nodeinfo

你会得到以下的输出:

1[secondary_label Output]
2Deleting: nodeinfo.
3Removing old function.

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

1[secondary_label Output]
2Function Invocations Replicas

在此步骤中,您已使用 faas-cli 部署、列出、召唤和删除群集中的函数,然后创建自己的函数并部署到群集中。

步骤 5 – 创建和部署新功能

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

您将创建的结果函数将被包装为 Docker 容器,并在 Docker Hub 上发布。

1docker login

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

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

1mkdir sample-js-function

导航它:

1cd sample-js-function

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

1faas new sample-js --lang node

结果将是这样的:

 1[secondary_label Output]
 22020/03/24 17:06:08 No templates found in current directory.
 32020/03/24 17:06:08 Attempting to expand templates from https://github.com/openfaas/templates.git
 42020/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
 5Folder: sample-js created.
 6  ___ _____ ____
 7 / _ \ _ __ ___ _ __ |  ___|_ _ __ _/ ___|
 8| | | | '_ \ / _ \ '_ \| |_ / _` |/ _` \___ \
 9| |_| | |_) |  __/ | | |  _| (_| | (_| |___) |
10 \___/| .__/ \___|_| |_|_|  \__,_|\__,_|____/
11      |_|
12
13Function created in folder: sample-js
14Stack file written: sample-js.yml
15
16...

正如输出中所写的,函数本身的代码位于sample-js文件夹中,而函数的OpenFaaS配置在sample-js.yaml文件中。

「handler.js」包含实际的 JS 代码,在调用函数时返回响应。

1[label sample-js-function/sample-js/handler.js]
2"use strict"
3
4module.exports = async (context, callback) => {
5    return {status: "done"}
6}

它导出具有两个参数的 lambda 函数,一个包含请求数据的背景和一个可以用来传回响应数据的回调,而不是仅仅返回它。

打开此文件以编辑:

1nano sample-js/handler.js

更改所突出的线条如下:

1[label sample-js-function/sample-js/handler.js]
2"use strict"
3
4module.exports = async (context, callback) => {
5    return {status: "<h1>Hello Sammy!</h1>"}
6}

完成后,保存并关闭文件. 这个 OpenFaaS 函数在调用时将写入Hello Sammy!对响应。

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

1nano sample-js.yml

它将看起来如下:

 1[label sample-js-function/sample-js.yml]
 2version: 1.0
 3provider:
 4  name: openfaas
 5  gateway: https://openfaas.your_domain
 6functions:
 7  sample-js:
 8    lang: node
 9    handler: ./sample-js
10    image: sample-js:latest

然后,它定义了样本-js函数,指定了其语言(节点),处理器和 Docker 图像名称,您需要修改以包括您的 Docker Hub 帐户用户名,如下:

 1[label sample-js-function/sample-js.yml]
 2version: 1.0
 3provider:
 4  name: openfaas
 5  gateway: http://127.0.0.1:8080
 6functions:
 7  sample-js:
 8    lang: node
 9    handler: ./sample-js
10    image: your_docker_hub_username/sample-js:latest

保存并关闭文件。

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

1faas up -f sample-js.yml

将有大量的输出(主要来自Docker),将以这样的方式结束:

1[secondary_label Output]
2. . .
3[0] < Pushing sample-js [your_docker_hub_username/sample-js:latest] done.
4[0] Worker done.
5
6Deploying: sample-js.
7
8Deployed. 202 Accepted.
9URL: https://openfaas.your_domain/function/sample-js

调用新部署的函数,以确保它工作:

1faas invoke sample-js

按CTRL + D,你会看到以下输出:

1[secondary_label Output]
2<h1>Hello Sammy!</h1>

这意味着该功能被正确地包装和部署。

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

1faas remove sample-js

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

结论

您已在您的 DigitalOcean Kubernetes 集群中部署了 OpenFaaS,并已准备好部署和访问预先制作和自定义功能. 现在,您可以实现 Function 作为服务架构,这可以增加资源利用率,并为您的应用程序带来性能改进。

如果您想了解有关先进的 OpenFaaS 功能的更多信息,例如 autoscaling用于部署的函数,以及 monitoring其性能,请访问 官方文件

Published At
Categories with 技术
comments powered by Disqus