Linux中國

使用 Docker 構建你的 Serverless 樹莓派集群

這篇博文將向你展示如何使用 DockerOpenFaaS 框架構建你自己的 Serverless 樹莓派集群。大家常常問我能用他們的集群來做些什麼?而這個應用完美匹配卡片尺寸的設備——只需添加更多的樹莓派就能獲取更強的計算能力。

「Serverless」 (無伺服器)是事件驅動架構的一種設計模式,與「橋接模式」、「外觀模式」、「工廠模式」和「雲」這些名詞一樣,都是一種抽象概念。

圖片:3 個 Raspberry Pi Zero

這是我在本文中描述的集群,用黃銅支架分隔每個設備。

Serverless 是什麼?它為何重要?

行業對於 「serverless」 這個術語的含義有幾種解釋。在這篇博文中,我們就把它理解為一種事件驅動的架構模式,它能讓你用自己喜歡的任何語言編寫輕量可復用的功能。更多關於 Serverless 的資料

Serverless 架構也引出了「功能即服務服務」模式,簡稱 FaaS

Serverless 的「功能」可以做任何事,但通常用於處理給定的輸入——例如來自 GitHub、Twitter、PayPal、Slack、Jenkins CI pipeline 的事件;或者以樹莓派為例,處理像紅外運動感測器、激光絆網、溫度計等真實世界的感測器的輸入。

Serverless 功能能夠更好地結合第三方的後端服務,使系統整體的能力大於各部分之和。

了解更多背景信息,可以閱讀我最近一偏博文:功能即服務(FaaS)簡介

概述

我們將使用 OpenFaaS,它能夠讓主機或者集群作為支撐 Serverless 功能運行的後端。任何能夠使用 Docker 部署的可執行二進位文件、腳本或者編程語言都能在 OpenFaaS 上運作,你可以根據速度和伸縮性選擇部署的規模。另一個優點是,它還內建了用戶界面和監控系統。

這是我們要執行的步驟:

  • 在一個或多個主機上配置 Docker (樹莓派 2 或者 3);
  • 利用 Docker Swarm 將它們連接;
  • 部署 OpenFaaS
  • 使用 Python 編寫我們的第一個功能。

Docker Swarm

Docker 是一項打包和部署應用的技術,支持集群上運行,有著安全的默認設置,而且在搭建集群時只需要一條命令。OpenFaaS 使用 Docker 和 Swarm 在你的可用樹莓派上傳遞你的 Serverless 功能。

我推薦你在這個項目中使用帶樹莓派 2 或者 3,乙太網交換機和強大的 USB 多埠電源適配器

準備 Raspbian

Raspbian Jessie Lite 寫入 SD 卡(8GB 容量就正常工作了,但還是推薦使用 16GB 的 SD 卡)。

注意:不要下載成 Raspbian Stretch 了

社區在努力讓 Docker 支持 Raspbian Stretch,但是還未能做到完美運行。請從樹莓派基金會網站下載 Jessie Lite 鏡像。

我推薦使用 Etcher.io 燒寫鏡像。

在引導樹莓派之前,你需要在引導分區創建名為 ssh 的空白文件。這樣才能允許遠程登錄。

接通電源,然後修改主機名

現在啟動樹莓派的電源並且使用 ssh 連接:

$ ssh pi@raspberrypi.local

默認密碼是 raspberry

使用 raspi-config 工具把主機名改為 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,那就把它替換成你的用戶名。

修改默認密碼

輸入 $sudo passwd pi,然後設置一個新密碼,請不要跳過這一步!

重複以上步驟

現在為其它的樹莓派重複上述步驟。

創建你的 Swarm 集群

登錄你的第一個樹莓派,然後輸入下面的命令:

$ 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

你會看到它顯示了一個口令,以及其它節點加入集群的命令。接下來使用 ssh 登錄每個樹莓派,運行這個加入集群的命令。

等待連接完成後,在第一個樹莓派上查看集群的節點:

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

恭喜你!你現在擁有一個樹莓派集群了!

更多關於集群的內容

你可以看到三個節點啟動運行。這時只有一個節點是集群管理者。如果我們的管理節點死機了,集群就進入了不可修復的狀態。我們可以通過添加冗餘的管理節點解決這個問題。而且它們依然會運行工作負載,除非你明確設置了讓你的服務只運作在工作節點上。

要把一個工作節點升級為管理節點,只需要在其中一個管理節點上運行 docker node promote <node_name> 命令。

注意: Swarm 命令,例如 docker service ls 或者 docker node ls 只能在管理節點上運行。

想深入了解管理節點與工作節點如何保持一致性,可以查閱 Docker Swarm 管理指南

OpenFaaS

現在我們繼續部署程序,讓我們的集群能夠運行 Serverless 功能。OpenFaaS 是一個利用 Docker 在任何硬體或者雲上讓任何進程或者容器成為一個 Serverless 功能的框架。因為 Docker 和 Golang 的可移植性,它也能很好地運行在樹莓派上。

如果你支持 OpenFaaS,希望你能 星標 OpenFaaS 的 GitHub 倉庫。

登錄你的第一個樹莓派(你運行 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  

你的其它樹莓派會收到 Docer Swarm 的指令,開始從網上拉取這個 Docker 鏡像,並且解壓到 SD 卡上。這些工作會分布到各個節點上,所以沒有哪個節點產生過高的負載。

這個過程會持續幾分鐘,你可以用下面指令查看它的完成狀況:

$ watch &apos;docker service ls&apos;
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->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->9093/tcp  
q4bet4xs10pk        func_gateway        replicated          1/1                 functions/gateway-armhf:0.6.0           *:8080->8080/tcp  
v9vsvx73pszz        func_nodeinfo       replicated          1/1                 functions/nodeinfo:latest-armhf  

我們希望看到每個服務都顯示 「1/1」。

你可以根據服務名查看該服務被調度到哪個樹莓派上:

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

狀態一項應該顯示 Running,如果它是 Pending,那麼鏡像可能還在下載中。

在這時,查看樹莓派的 IP 地址,然後在瀏覽器中訪問它的 8080 埠:

$ ifconfig

例如,如果你的 IP 地址是 192.168.0.100,那就訪問 http://192.168.0.100:8080

這是你會看到 FaaS UI(也叫 API 網關)。這是你定義、測試、調用功能的地方。

點擊名稱為 「func_markdown」 的 Markdown 轉換功能,輸入一些 Markdown(這是 Wikipedia 用來組織內容的語言)文本。

然後點擊 「invoke」。你會看到調用計數增加,屏幕下方顯示功能調用的結果。

部署你的第一個 Serverless 功能:

這一節的內容已經有相關的教程,但是我們需要幾個步驟來配置樹莓派。

獲取 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  

下載樣例

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

為樹莓派修補樣例模版

我們臨時修改我們的模版,讓它們能在樹莓派上工作:

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

這麼做是因為樹莓派和我們平時關注的大多數計算機使用不一樣的處理器架構。

了解 Docker 在樹莓派上的最新狀況,請查閱: 你需要了解的五件事

現在你可以跟著下面為 PC、筆記本和雲端所寫的教程操作,但我們在樹莓派上要先運行一些命令。

注意第 3 步:

  • 把你的功能放到先前從 GitHub 下載的 faas-cli 文件夾中,而不是 ~/functinos/hello-python 里。
  • 同時,在 stack.yml 文件中把 localhost 替換成第一個樹莓派的 IP 地址。

集群可能會花費幾分鐘把 Serverless 功能下載到相關的樹莓派上。你可以用下面的命令查看你的服務,確保副本一項顯示 「1/1」:

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

繼續閱讀教程: 使用 OpenFaaS 運行你的第一個 Serverless Python 功能

關於 Node.js 或者其它語言的更多信息,可以進一步訪問 FaaS 倉庫

檢查功能的指標

既然使用 Serverless,你也不想花時間監控你的功能。幸運的是,OpenFaaS 內建了 Prometheus 指標檢測,這意味著你可以追蹤每個功能的運行時長和調用頻率。

指標驅動自動伸縮

如果你給一個功能生成足夠的負載,OpenFaaS 將自動擴展你的功能;當需求消失時,你又會回到單一副本的狀態。

這個請求樣例你可以複製到瀏覽器中:

只要把 IP 地址改成你的即可。

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

這些請求使用 PromQL(Prometheus 請求語言)編寫。第一個請求返回功能調用的頻率:

rate(gateway_function_invocation_total[20s])  

第二個請求顯示每個功能的副本數量,最開始應該是每個功能只有一個副本。

gateway_service_count  

如果你想觸發自動擴展,你可以在樹莓派上嘗試下面指令:

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

查看 Prometheus 的 「alerts」 頁面,可以知道你是否產生足夠的負載來觸發自動擴展。如果沒有,你可以嘗試在多個終端同時運行上面的指令。

當你降低負載,副本數量顯示在你的第二個圖表中,並且 gateway_service_count 指標再次降回 1。

結束演講

我們現在配置好了 Docker、Swarm, 並且讓 OpenFaaS 運行代碼,把樹莓派像大型計算機一樣使用。

希望大家支持這個項目,星標 FaaS 的 GitHub 倉庫

你是如何搭建好了自己的 Docker Swarm 集群並且運行 OpenFaaS 的呢?在 Twitter @alexellisuk 上分享你的照片或推文吧。

觀看我在 Dockercon 上關於 OpenFaaS 的視頻

我在 Austin 的 Dockercon 上展示了 OpenFaaS。——觀看介紹和互動例子的視頻: https://www.youtube.com/embed/-h2VTE9WnZs

有問題?在下面的評論中提出,或者給我發郵件,邀請我進入你和志同道合者討論樹莓派、Docker、Serverless 的 Slack channel。

想要學習更多關於樹莓派上運行 Docker 的內容?

我建議從 你需要了解的五件事 開始,它包含了安全性、樹莓派和普通 PC 間微妙差別等話題。

via: https://blog.alexellis.io/your-serverless-raspberry-pi-cluster/

作者:Alex Ellis 譯者:haoqixu 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國