作者选择了 自由和开源基金作为 写给捐款计划的一部分接受捐款。
介绍
通常情况下,在互联网上托管软件应用程序需要对单一系统的基础设施管理、规划和监控。与这种传统方法不同,无服务器的架构(也称为 function as a service,或FaaS)将您的应用程序分解为 functions。这些功能是无状态的、自我包含的、事件触发的、功能完整的实体,这些实体通过您管理的API进行通信,而不是底层硬件和明确的基础设施的提供。
OpenFaaS是一个开源框架,用于在Kubernetes上实现无服务器架构,使用Docker容器存储和运行函数。它允许任何程序作为容器包装并通过命令行或集成Web UI作为函数管理。
在本教程中,您将部署OpenFaaS到您的DigitalOcean Kubernetes集群,并使用免费的Let's Encrypt TLS证书保护它,您还将探索其Web UI,并使用官方命令行工具faas-cli部署现有和新功能。
前提条件
- 数字海洋Kubernetes集群,您的连接配置为
kubectl
默认值。 该集群必须至少有8GB RAM和4个CPU核心可供OpenFaaS使用(如果使用更重,则需要更多). 关于如何配置kubectl
的指令, 在创建您的集群时, 在 ** 连接到您的集群** 步骤下显示 。 要在 Digital Ocean 上创建库伯内特斯集群,请参见 [Kubernetes Quickstart] (https://www.digitalocean.com/docs/kubernetes/quickstart/). - Docker安装在您的本地机器上。 执行步骤 1 和 2 分发, 请参见 [如何安装 Docker] (https://andsky.com/tech/tutorials/how-to-install-and-use-docker-on-ubuntu-18-04).
- 在 [Docker Hub] (https://hub.docker.com] 的一个账户,用于存储您将在此教程中创建的 Docker 图像.
- [faas-cli] (https://github.com/openfaas/faas-cli),是管理 OpenFaaS 的官方 CLI 工具,安装在您的本地机上. 多个平台的指令请访问[官方docs] (https://github.com/openfaas/faas-cli#get-started-install-the-cli).
- 安装在您本地机器上的 Helm 包管理器 。 要做到这一点,请完成步骤1并从步骤2中添加`Stable' repo,即如何用Helm 3软件包管理器在Kubernetes集群上安装软件教程。
- Nginx 入侵控制器和 Cert-Manager 使用 Helm 安装在您的集群上,以便使用入侵资源曝光 OpenFaaS 。 关于指导,请遵循[如何在使用Helm的数字大洋上设置Nginx入侵 (https://andsky.com/tech/tutorials/how-to-set-up-an-nginx-ingress-on-digitalocean-kubernetes-using-helm).
- 一个完整的注册域名来主机OpenFaaS,指向了Nginx Ingress使用的负载平衡器. 此教程将使用
openfaas. your_ domain
。 您可以在 [Namecheap] (https://www.namecheap.com/ 上购买域名, 在 [Freenom] (https://www.freenom.com/en/index.html?lang=en ) 上免费获得域名, 或者使用您选择的域名登记员. (_) (英语)
<$>[注]
**注:**您在本教程中使用的域名必须与如何在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,并将其控制面板暴露在您的域中,接下来,您将使用免费的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 标志下方的 ** 部署新函数 ** 按钮。
在 FROM STORE 选项卡上列出从官方 OpenFaaS 函数商店中提前创建的函数,您可以立即部署它们.每个函数都显示了简短的描述,您可以选择函数右侧的链接图标,以查看其源代码。
您也可以通过切换到 CUSTOM 选项卡来提供自己的功能:
在这里,您需要指定为 OpenFaaS 配置的功能的 Docker 图像,并可在 Docker 注册表(如 Docker Hub)中使用。
您将部署NodeInfo
函数,该函数将返回有关部署的机器的信息,如CPU架构,核心数量,可用的总RAM内存和运行时间(在秒)。
从存储函数列表中,选择 NodeInfo,然后点击 DEPLOY. 它很快就会出现在部署函数列表中。
在屏幕的中央部分,你会看到有关部署的功能的基本信息。
该函数的状态在实时更新,并应迅速转换为准备好
。如果该函数停留在不准备好
的位置更长时间,那么您的集群很可能缺乏接受新 pod 的资源。
一旦准备好了
,部署的函数可以在显示的URL上访问,要测试它,您可以导航到浏览器中的URL,或者从函数信息下方的 Invoke 函数面板调用它。
您可以选择 ** 文本**、 ** JSON** 和 ** 下载** 以表示您所期望的响应类型. 如果您希望请求成为POST
而不是GET
,则可以在 ** 请求体** 字段中提供请求数据。
要调用nodeinfo
函数,请点击INVOKE
按钮,OpenFaaS将根据所选选项编写和执行 HTTP 请求,并用收到的数据填写响应字段。
响应状态为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其性能,请访问 官方文件。