Raspberry Pi 与 Docker 构建 Serverless 集群

本博客将向您展示,如何使用 Docker 和 OpenFaaS 框架创建自己的 Serverless 框架的 Raspberry Pi集群。人们经常问我们,应该怎么做他们的集群,同时这个应用程序是完美的信用卡大小的设备 - 想要更多的计算能力?只需要通过添加更多的 RPi 设置就能扩展。

> “Serverless” 是事件驱动架构的设计模式,就像“桥”,“装饰器”,“工厂” 和 “云” 也是抽象的概念 - 因此它是 “Serverless”。

这是我的博客文章的集群 - 用黄铜支架来分隔每个设备。

> 我在 @docker 和 @Raspberry_Pi 上写博客文章 - 创建集群并部署代码可能并不容易🐝 。pic.twitter.com/KD2MIIrAx9 — Alex Ellis (@alexellisuk) August 19, 2017

步骤0:什么是 Serverless,为什么它对你很重要?

作为一个行业,我们对 “Serverless” 这个术语的意思做了一些解释。 为了这个博客文章,让我们假设它是一个用于事件驱动架构的新架构,它允许您以任何您喜欢的语言编写小而可重用的函数。(更多内容可以阅读:Introducing Functions as a Service (FaaS)

Serverless 是一种架构模式的结果:函数即服务,FaaS

Serverless 函数可以做任何事情,但通常可以在给定的输入中工作 - 例如来自 GitHub,Twitter,PayPal,Slack,Jenkins CI 管道中的事件。或者在 Raspberry Pi 的情况下,可能是真实世界的传感器输入,例如 PIR 运动传感器,激光绊网或甚至温度计。

我们还假定 Serverless 函数,倾向于使用第三方后端服务来使其大于其部件的总和。

步骤1:概要

我们将使用 OpenFaaS,您可以将任何单个主机或群集转换为后端来运行 Serverless 函数。并能使用 Docker 部署任何二进制程序、脚本或编程语言,它们都可以在OpenFaaS上运行,您可以在速度和灵活性之间进行选择。还有一个好消息是,它提供了一个 UI,并且内置了度量。

这是我们要做的步骤:

  • 在一个或多个 Raspberry Pi 上部署 Docker
  • 在 Docker 群中加入他们
  • 部署 OpenFaaS
  • 使用 Python 编写你的第一个函数

Docker Swarm

Docker 是一种用于打包和部署应用程序的技术,它还具有内置的集群,默认情况下是安全的,只需一行即可。 OpenFaaS 使用 Docker 和 Swarm 在您所有可用的 RPi 中传递 Serverless 函数。

PS:我建议使用 Raspberry Pi 2 或 3 用于此项目,它们带有以太网交换机和强大的 USB 多适配器。

步骤2:准备 Raspbian

烧录 Raspbian Jessie Lite 到 SD 卡上,8GB 的空间就够了,但是推荐 16GB。

注意:不要下载Raspbian Stretch

> 社区正在帮助 Docker 团队准备支持 Raspbian Stretch,但还不能无缝的工作。

我建议使用 Etcher.io 来烧录镜像。

> 在启动你的 Raspberry Pi 之前,你需要在你的 SD 卡的 boot 分区,创建一个名为 ssh 的空文件。它可以由 Raspbian 系统识别,以允许远程登录。

启动 Raspberry Pi,并更改主机名

现在打开 Raspberry Pi, 并使用 ssh 连接

$ ssh pi@raspberrypi.local

> 密码是 raspberry

接着运行 raspi-config 来修改 hostname 为 swarm-1,或者类似的名字,然后重启设备。

在这里,您还可以将 GPU(图形)和系统之间的内存分配更改为 16mb。

安装 Docker

我们可以使用一个实用程序脚本:

$ curl -sSL https://get.docker.com | sh

此安装方式,可能会在将来更改。如上所述,您需要运行 Jessie,因此我们有一个已知的配置。

您可能会看到这样的警告,但您可以忽略它,你最终使用的应该是 Docker CE 17.05:

WARNING: raspbian is no longer updated @ https://get.docker.com/
Installing the legacy docker-engine package...

之后,确保您的用户帐户可以使用此命令访问 Docker 客户端:

$ usermod pi -aG docker

> 如果您的用户名不是 pi,那么用你的用户名替换 pi。

更改默认密码

输入 $sudo passwd pi,并输入新密码,请不要跳过这一步

重复

为每个 RPi,重复上面的每一个步骤。

步骤3:创建您的 Swarm 群集

登录第一个 RPi,并键入以下内容:

$ docker swarm init
Swarm initialized: current node (3ra7i5ldijsffjnmubmsfh767) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join \
    --token SWMTKN-1-496mv9itb7584pzcddzj4zvzzfltgud8k75rvujopw15n3ehzu-af445b08359golnzhncbdj9o3 \
    192.168.0.79:2377

您将看到带有您的连接令牌的输入,在其他 RPi 中输入这些内容。 因此使用 ssh 登录到每个 Raspberry Pi,并粘贴在命令中。

给这几秒钟让他们连接,然后在第一个 RPi 中检查您的所有节点列出:

$ docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS
3ra7i5ldijsffjnmubmsfh767 *   swarm1              Ready               Active              Leader
k9mom28s2kqxocfq1fo6ywu63     swarm3              Ready               Active
y2p089bs174vmrlx30gc77h4o     swarm4              Ready               Activ

恭喜!你有一个 Raspberry Pi 集群!

  • 更多集群

您可以看到我的三台主机正在运行。其中,只有一个是管理机(manager)。 如果我们的管理机要下台,那么我们将处于不可恢复的状态。这样做的方法是,通过向管理者提供更多的节点来增加冗余 - 除非您专门设置服务,否则他们仍然会运行工作负载。

要将一个进程机(worker)升级到管理机(manager),只需要在你的一个管理机上执行:docker node promote <node_name>

> 注意:群集(Swarm)命令,如 docker 服务 ls 或 docker node ls 只能在管理器上完成。

深入理解 Swarm 的更多管理信息,请查阅官方的文档:[Docker Swarm admin guide](https://docs.docker.com/engine/swarm/admin_guide/)

步骤4:OpenFaaS

现在,让我们继续部署一个真正的应用程序,使 Serverless 函数能在在我们的集群上运行。OpenFaaS 是 Docker 下的一个框架,可以让任何进程或容器成为 Serverless 函数 - 大规模和任何硬件或云端。 由于 Docker 和 Golang 的便携性,它在 Raspberry Pi 上运行得很好。

登录第一个RPi(我们运行 docker swarm init 的机器)并克隆/部署项目:

$ git clone https://github.com/alexellis/faas/
$ cd faas
$ ./deploy_stack.armhf.sh
Creating network func_functions
Creating service func_gateway
Creating service func_prometheus
Creating service func_alertmanager
Creating service func_nodeinfo
Creating service func_markdown
Creating service func_wordcount
Creating service func_echoit

Docker Swarm 现在将要求您的其他 RPi,从互联网上拉出 Docker 镜像并将其解压缩到SD卡。 这项工作将分布在所有的RPIS中,以免他们都不会过度劳累。

这可能需要几分钟的时间,因此您可以通过输入下面的内容,来查看进度:

$ watch 'docker service ls'
ID                  NAME                MODE                REPLICAS            IMAGE                                   PORTS
57ine9c10xhp        func_wordcount      replicated          1/1                 functions/alpine:latest-armhf
d979zipx1gld        func_prometheus     replicated          1/1                 alexellis2/prometheus-armhf:1.5.2       *:9090-&gt;9090/tcp
f9yvm0dddn47        func_echoit         replicated          1/1                 functions/alpine:latest-armhf
lhbk1fc2lobq        func_markdown       replicated          1/1                 functions/markdownrender:latest-armhf
pj814yluzyyo        func_alertmanager   replicated          1/1                 alexellis2/alertmanager-armhf:0.5.1     *:9093-&gt;9093/tcp
q4bet4xs10pk        func_gateway        replicated          1/1                 functions/gateway-armhf:0.6.0           *:8080-&gt;8080/tcp
v9vsvx73pszz        func_nodeinfo       replicated          1/1                 functions/nodeinfo:latest-armhf

我们希望看到我们所有服务中列出的1/1。

给定任何服务名称,您可以键入以下内容,来查看哪个 RPi 将安装它:

$ docker service ps func_markdown
ID                  IMAGE                                   NODE    STATE
func_markdown.1     functions/markdownrender:latest-armhf   swarm4  Running

其状态应该是 Running,如果是 Pending 则说明镜像仍然可以从互联网上下来。

此时,请查找您的 RPi 的 IP 地址,并在 Web 浏览器中打开该 IP 地址的 8080 端口:

$ ifconfig

比如你的 IP 是 192.168.0.100,那么就打开 http://192.168.0.100:8080

此时,您应该会看到 FaaS 的 UI 界面,也称为 API网关。这是您可以定义、测试和调用您的函数的地方。

点击名为 func_markdown 的 Markdown 转换函数,然后输入一些 Markdown 文本。

然后点击 invoke。 您将看到 invoke 计数上升,屏幕的下半部分显示您的功能的结果,如下图所示:

FaaS 网站 Markdown 调用

步骤5:部署您的第一个 Serverless 函数

已经有了这个部分的教程,但是我们需要首先使用几个自定义步骤来设置 RPi。

1.获取 FaaS-CLI

$ curl -sSL cli.openfaas.com | sudo sh
armv7l
Getting package https://github.com/alexellis/faas-cli/releases/download/0.4.5-b/faas-cli-armhf

2.Clone示例:

$ git clone https://github.com/alexellis/faas-cli
$ cd faas-cli

3.为 Raspberry Pi 打补丁

我们将暂时更新我们的模板,以便他们能在 Raspberry Pi 上工作:

$ cp template/node-armhf/Dockerfile template/node/
$ cp template/python-armhf/Dockerfile template/python/

这样做的原因是,Raspberry Pi 与我们每天互动的大多数计算机具有不同的处理器。

现在,您可以按照下面的PC,笔记本电脑和云端编写的相同教程,但是我们将首先为 Raspberry Pi 运行几个命令。

Your first serverless Python function with OpenFaaS

在教程中 步骤3 的时候:

  • ~/functions/hello-python 替换成你的函数,并将它们放在我们刚从 GitHub 克隆的 faas-cli 文件夹中。
  • 然后在 stack.yml 中将 localhost 替换成你的第一个 Raspberry Pi 的 IP 地址

请注意,Raspberry Pi 可能需要几分钟才能将 Serverless 函数下载到相关的 RPi 中。 您可以检查您的服务,以确保您使用此命令显示 1/1 副本:

$ watch 'docker service ls'
pv27thj5lftz        hello-python        replicated          1/1                 alexellis2/faas-hello-python-armhf:latest

相关阅读资料: Your first serverless Python function with OpenFaaS

步骤6:检查您的功能指标

通过 Serverless 的体验,您不需要花费所有时间来管理您的函数。幸运的是,Prometheus 指标内置于OpenFaaS中,这意味着您可以跟踪每个功能需要多长时间运行以及调用频率。

指标驱动自伸缩

如果您在任何功能上产生足够的负载时,OpenFaaS 将自动调整您的函数,当需求消失时,您将再次返回到单个副本。

以下是可以粘贴到Safari,Chrome等的示例查询:

调用率示例

PS:只需将IP地址更改为您自己的 IP 地址。

http://192.168.0.25:9090/graph?g0.range_input=15m&amp;g0.stacked;=1&amp;g0.expr;=rate(gateway_function_invocation_total%5B20s%5D)&amp;g0.tab;=0&amp;g1.range;_input=1h&amp;g1.expr;=gateway_service_count&amp;g1.tab;=0

这个请求是用 PromQL 编写的。PromQL 是 Prometheus 的查询语言。第一个查询,显示了函数调用的频率:

rate(gateway_function_invocation_total[20s])

第二个查询显示了我们对每个函数有多少副本,开始时应该只有一个:

gateway_service_count

如果要触发自动缩放,可以在RPi上尝试以下操作:

$ while [ true ]; do curl -4 localhost:8080/function/func_echoit --data "hello world" ; done

检查 Prometheus 的『alert』页面,看看是否生成足够的负载来触发自动缩放,如果您不是在几个附加的终端窗口中运行该命令。

减少负载后,第二个图表中显示的副本计数和 gateway_service_count 度量将再次返回1。

步骤7:Done

我们现在已经设置了 Docker、Swarm 并运行 OpenFaaS,让我们将 Raspberry Pi 像一台巨型计算机一样处理,并准备好通过代码。

原文链接:https://blog.alexellis.io/your-serverless-raspberry-pi-cluster/

尚未评分
您的评分将帮助我们做出更好的玩法

观光\评论区

Copyright © 2017 玩点什么. All Rights Reserved.