9美元迷你计算机,构建Docker Swarm,实现物联网集群

利用Docker 1.12中的Swarm模式,我们能够非常轻松地构建起一套Docker Swarm,并将各类ARM设备对接为物联网集群。

自己动手,玩转Docker,here we go!

 

qq%e6%88%aa%e5%9b%be20161207193745

 

下面让我们利用WiFi网络对接几套价值9美元的C.H.I.P.小计算机与一台RaspberryPi Zero。

第一步:安装Docker Machine

首先,需要确保将Docker Machine安装在本地计算设备之上。这里使用的是Mac设备,但大家也可以在Linux或者Windows上使用Docker Machine。

使用以下命令即可轻松检查Docker Machine的当前版本。

docker-machine --version
 docker-machine version 0.8.0, build b85aac1

第二步:利用Docker Machine准备全部C.H.I.P.小计算机

为了将多台小计算机接入Docker Swarm集群,需要首先安装Docker 1.12——相关操作流程非常简单,大家可以参阅《9美元C.H.I.P.小计算机Docker 1.12安装指南》(http://blog.hypriot.com/post/install-docker-on-chip-computer/)。之后利用标准Docker Machine通过安全Docker API端口接入各C.H.I.P.小计算机,同时为各设备提供一个独特的网络主机名称。在Docker Machine的帮助下,我们可以轻松立足于Mac、Linux或者Windows设备接入Swarm集群当中的任意小计算机设备。

下面来看各个小计算机上需要执行的各项操作:

  1. 刷新C.H.I.P.小计算机而后安装Docker 1.12.1
  2. 检测IP地址并使用Docker Machine
  3. 重启Avahi守护程序或者重启C.H.I.P.小计算机
  4. 通过网络以及Docker API检查该设备的连接性

以FEL模式刷新小计算机,UART控制线连接方式如下:

 

qq%e6%88%aa%e5%9b%be20161207193753

 

在首台小计算机完成了Docker安装之后,需要利用其IP地址并运行docker-machine create,而后确保指向Docker Engine的网络访问安全可靠。在命令中使用了–debug标记以获取更详尽的输出结果,大家可以看到后台中的全部细节。不过在其余小计算机中可以省略这一标记。

CHIP_IP_ADDRESS=192.168.2.112
 CHIP_NODENAME=swarm-chip01

docker-machine --debug create \
 --driver=generic \
 --engine-storage-driver=overlay \
 --generic-ip-address=$CHIP_IP_ADDRESS \
 $CHIP_NODENAME

在成功运行以上命令后,小计算机会被附加至Docker Machine当中。

docker-machine ls --filter name=swarm*
 NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
 swarm-chip01 - generic Running tcp://192.168.2.112:2376 v1.12.1

在此小计算机当中,大家可以看到其主机名称已经发生了变更。通过细致检查可以更好地理解这一切的幕后运作原理。现在使用Docker Machine命令以接入该设备。

docker-machine ssh swarm-chip01
 root@swarm-chip01:~#

其主机名称已经变更为swarm-chip01。

root@chip:~# cat /etc/hostname
 swarm-chip01

这里包含有新的本地回环地址127.0.1.1 swarm-chip01。

root@chip:~# cat /etc/hosts
 127.0.0.1 chip
 127.0.0.1 localhost
 ::1 localhost ip6-localhost ip6-loopback
 ff02::1ip6-allnodes
 ff02::2ip6-allrouters

127.0.1.1 swarm-chip01

下面检查我们是否能够利用小计算机的新主机名称通过网络进行接入。

ping -c 3 swarm-chip01.local
 ping: cannot resolve swarm-chip01.local: Unknown host

遗憾的是,Avahi服务发现守护程序并没有变更该主机名称,需要手动将其重启使变更生效,从而让WiFi网络利用新的主机名称接入该C.H.I.P.小计算机。另外,也可以直接重启小计算机来激活各项变更。下面让我们通过Docker Machine实现。

docker-machine ssh swarm-chip01 systemctl restart avahi-daemon.service

而后再将用ping命令进行检验。

ping -c 3 swarm-chip01.local
 PING swarm-chip01.local (192.168.2.112): 56 data bytes
 64 bytes from 192.168.2.112: icmp_seq=0 ttl=64 time=105.129 ms
 64 bytes from 192.168.2.112: icmp_seq=1 ttl=64 time=3.529 ms
 64 bytes from 192.168.2.112: icmp_seq=2 ttl=64 time=48.178 ms

--- swarm-chip01.local ping statistics ---
 3 packets transmitted, 3 packets received, 0.0% packet loss
 round-trip min/avg/max/stddev = 3.529/52.279/105.129/41.579 ms

现在大家需要在其它小计算机上重复以上步骤。完成之后,我们就做好了全部准备工作,并拥有一份已经接入Docker Machine的设备清单。这套集群拥有6台小计算机,其中每台皆属于Alpha单元,且以完全一致的方式进行运作。

docker-machine ls --filter name=swarm*
 NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
 swarm-chip01 - generic Running tcp://192.168.2.112:2376 v1.12.1
 swarm-chip02 - generic Running tcp://192.168.2.116:2376 v1.12.1
 swarm-chip03 - generic Running tcp://192.168.2.117:2376 v1.12.1
 swarm-chip04 - generic Running tcp://192.168.2.118:2376 v1.12.1
 swarm-chip05 - generic Running tcp://192.168.2.120:2376 v1.12.1
 swarm-chip06 - generic Running tcp://192.168.2.104:2376 v1.12.1

第三步:初始化Swarm,创建一个Swarm管理节点

在小计算机准备就绪之后,就可以对Swarm集群进行初始化了。首先创建一个Swarm管理节点,而后将其它小计算机作为额外Swarm管理节点或者Swarm工作节点。各个步骤皆可在每台设备上通过一条命令实现。

以下命令用于对Swarm集群进行初始化。

docker-machine ssh swarm-chip01 docker swarm init
 Swarm initialized: current node (8174iszkmn4u4wwjogam8bsrw) is now a manager.

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

docker swarm join \
 --token SWMTKN-1-2olhigqvrmxkbby00qarokzdd6cmy0ovak6fst77y4qnec4ufv-4utgsw8ed9a0cyxx86yygqvzt \
 192.168.2.112:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

这时首台Swarm管理节点就开始运行了。

docker-machine ssh swarm-chip01 docker node ls
 ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
 8174iszkmn4u4wwjogam8bsrw * swarm-chip01 Ready Active Leader

第四步:设置Swarm实现高可用性,添加更多Swarm管理节点

为了构建一套高可用性Swarm集群,需要添加2个额外的Swarm管理节点。首先需要从当前Swarm管理节点处获取访问令牌来加入新的Swarm管理节点。大家需要了解的是,默认情况下各Swarm节点间的流量受到全面控制。

docker-machine ssh swarm-chip01 docker swarm join-token manager
 To add a manager to this swarm, run the following command:

docker swarm join \
 --token SWMTKN-1-2olhigqvrmxkbby00qarokzdd6cmy0ovak6fst77y4qnec4ufv-beiuuzahvn9f7c1q42irqzncb \
 192.168.2.112:2377

利用这条命令,可以添加swarm-chip02与swarm-chip02两个节点作为Swarm管理节点,具体步骤为在各节点上执行以下命令:

docker-machine ssh swarm-chip02 \
 docker swarm join \
 --token SWMTKN-1-2olhigqvrmxkbby00qarokzdd6cmy0ovak6fst77y4qnec4ufv-beiuuzahvn9f7c1q42irqzncb \
 192.168.2.112:2377
 This node joined a swarm as a manager.

docker-machine ssh swarm-chip03 \
 docker swarm join \
 --token SWMTKN-1-2olhigqvrmxkbby00qarokzdd6cmy0ovak6fst77y4qnec4ufv-beiuuzahvn9f7c1q42irqzncb \
 192.168.2.112:2377
 This node joined a swarm as a manager.

大家可以查询3个Swarm管理节点中的任何一个,来获取Swarm状态以及全部Swarm节点列表。

docker-machine ssh swarm-chip01 docker node ls
 ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
 1qelz3ttd54mh8fb57hf67ff1 swarm-chip03 Ready Active Reachable
 8174iszkmn4u4wwjogam8bsrw * swarm-chip01 Ready Active Leader
 ctggddtwrg0ybrwpa52heaz9c swarm-chip02 Ready Active Reachable
 OSX: dieter@DietersMacBookPro in ~/code/github/hypriot/blog on deploy-swarm-on-chip-with-docker-machine

docker-machine ssh swarm-chip02 docker node ls
 ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
 1qelz3ttd54mh8fb57hf67ff1 swarm-chip03 Ready Active Reachable
 8174iszkmn4u4wwjogam8bsrw swarm-chip01 Ready Active Leader
 ctggddtwrg0ybrwpa52heaz9c * swarm-chip02 Ready Active Reachable
 OSX: dieter@DietersMacBookPro in ~/code/github/hypriot/blog on deploy-swarm-on-chip-with-docker-machine

docker-machine ssh swarm-chip03 docker node ls
 ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
 1qelz3ttd54mh8fb57hf67ff1 * swarm-chip03 Ready Active Reachable
 8174iszkmn4u4wwjogam8bsrw swarm-chip01 Ready Active Leader
 ctggddtwrg0ybrwpa52heaz9c swarm-chip02 Ready Active Reachable

第五步:扩展Swarm规模,附加全部Swarm工作节点

现在将其余小计算机设备作为Swarm工作节点添加到集群当中。为了实现这一目标,需要使用来自初始Swarm创建命令中的令牌。不过如果你忘记了此令牌,可以利用以下命令查询任一Swarm管理节点,再次查看此令牌。

docker-machine ssh swarm-chip02 docker swarm join-token worker
 To add a worker to this swarm, run the following command:

docker swarm join \
 --token SWMTKN-1-2olhigqvrmxkbby00qarokzdd6cmy0ovak6fst77y4qnec4ufv-4utgsw8ed9a0cyxx86yygqvzt \
 192.168.2.116:2377

下面逐一添加各工作节点。

docker-machine ssh swarm-chip04 \
 docker swarm join \
 --token SWMTKN-1-2olhigqvrmxkbby00qarokzdd6cmy0ovak6fst77y4qnec4ufv-4utgsw8ed9a0cyxx86yygqvzt \
 192.168.2.112:2377
 This node joined a swarm as a worker.

docker-machine ssh swarm-chip05 \
 docker swarm join \
 --token SWMTKN-1-2olhigqvrmxkbby00qarokzdd6cmy0ovak6fst77y4qnec4ufv-4utgsw8ed9a0cyxx86yygqvzt \
 192.168.2.112:2377
 This node joined a swarm as a worker.

docker-machine ssh swarm-chip06 \
 docker swarm join \
 --token SWMTKN-1-2olhigqvrmxkbby00qarokzdd6cmy0ovak6fst77y4qnec4ufv-4utgsw8ed9a0cyxx86yygqvzt \
 192.168.2.112:2377
 This node joined a swarm as a worker.

到这里,我们已经将全部6台小计算机设备添加到了Swarm集群当中,其中3台为Swarm管理节点,其余3台为Swarm工作节点。

第六步:附加额外的Pi Zero作为Swarm工作节点

我们可以在Swarm集群当中使用多种ARM设备。这里添加另一种不同设备,即Raspberry Pi Zero,其配备有RedBear IoT pHAT以实现WiFI/蓝牙连接功能。

 

qq%e6%88%aa%e5%9b%be20161207193804

 

可以看到,我们能够非常轻松地利用HypriotOS for RPi以及Hypriot刷机工具配合Docker 1.12.1创建新的ARM设备,并通过WiFi将其添加至集群当中。

对SD卡进行刷新,而后启动Raspberry Pi Zero。

flash -n swarm-raspi01 -s "WLAN-R46VFR" -p "************" https://github.com/hypriot/image-builder-rpi/releases/download/v1.0.0/hypriotos-rpi-v1.0.0.img.zip

检测此Pi Zero的IP地址。

ping -c 3 swarm-raspi01.local
 PING swarm-raspi01.local (192.168.2.119): 56 data bytes
 64 bytes from 192.168.2.119: icmp_seq=0 ttl=64 time=617.658 ms
 64 bytes from 192.168.2.119: icmp_seq=1 ttl=64 time=26.326 ms
 64 bytes from 192.168.2.119: icmp_seq=2 ttl=64 time=1187.048 ms

--- swarm-raspi01.local ping statistics ---
 3 packets transmitted, 3 packets received, 0.0% packet loss
 round-trip min/avg/max/stddev = 26.326/610.344/1187.048/473.891 ms

为此Pi Zero准备SSH接入机制,使用用户名=pirate,而密码=hypriot。

ssh-keygen -R 192.168.2.119
 ssh-copy-id pirate@192.168.2.119
 ssh pirate@192.168.2.119
 uname -a
 Linux swarm-raspi01 4.4.15-hypriotos+ #2 PREEMPT Mon Jul 25 09:18:11 UTC 2016 armv6l GNU/Linux
 exit

登录并在Pi之上安装一项fix,从而使用标准Docker Machine二进制代码。

ssh pirate@192.168.2.119
 curl -sSL https://github.com/DieterReuter/arm-docker-fixes/raw/master/001-fix-docker-machine-1.8.0-create-for-arm/apply-fix-001.sh | bash

回到Mac设备端,这时可以运行Docker Machine并接入至Raspi。如大家所见,这里使用了–generic-ssh-user=pirate标记,因为我们使用了其它用户名称以替代默认的root。

RASPI_IP_ADDRESS=192.168.2.119
 RASPI_NODENAME=swarm-raspi01

docker-machine --debug create \
 --driver=generic \
 --engine-storage-driver=overlay \
 --generic-ip-address=$RASPI_IP_ADDRESS \
 --generic-ssh-user=pirate \
 $RASPI_NODENAME

几分钟之后,Raspberry Pi Zero即可通过Docker Machine实现访问,其接入方式与其它小计算机完全一致。

docker-machine ls --filter name=swarm*
 NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
 swarm-chip01 - generic Running tcp://192.168.2.112:2376 v1.12.1
 swarm-chip02 - generic Running tcp://192.168.2.116:2376 v1.12.1
 swarm-chip03 - generic Running tcp://192.168.2.117:2376 v1.12.1
 swarm-chip04 - generic Running tcp://192.168.2.118:2376 v1.12.1
 swarm-chip05 - generic Running tcp://192.168.2.120:2376 v1.12.1
 swarm-chip06 - generic Running tcp://192.168.2.104:2376 v1.12.1
 swarm-raspi01 - generic Running tcp://192.168.2.119:2376 v1.12.1

最后,我们添加这最后一台Swarm工作节点,即运行有HypriotOS 1.0.1与Docker 1.12.1的Raspberry Pi Zero。

docker-machine ssh swarm-raspi01 \
 docker swarm join \
 --token SWMTKN-1-2olhigqvrmxkbby00qarokzdd6cmy0ovak6fst77y4qnec4ufv-4utgsw8ed9a0cyxx86yygqvzt \
 192.168.2.112:2377
 This node joined a swarm as a worker.

第七步:检查完整的Swarm集群

利用docker node ls命令,我们可以立足任意Swarm管理节点列出全部当前Swarm节点,在终端窗口的输出结果中查看其角色及运行状态。

docker-machine ssh swarm-chip03 docker node ls
 ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
 1qelz3ttd54mh8fb57hf67ff1 * swarm-chip03 Ready Active Reachable
 3inlk62a6l3afqp570nnus12f swarm-raspi01 Ready Active
 7jvz6c8a852rve1r21fordkfa swarm-chip04 Ready Active
 8174iszkmn4u4wwjogam8bsrw swarm-chip01 Ready Active Leader
 91ee08vkwuh3f6yelc4ci46se swarm-chip05 Ready Active
 agglzv8ju0diwpd665nbhdtti swarm-chip06 Ready Active
 ctggddtwrg0ybrwpa52heaz9c swarm-chip02 Ready Active Reachable

 

qq%e6%88%aa%e5%9b%be20161207193813

 

结果:一套运行有Docker1.12的混合型物联网Swarm集群构建完成

这就是我们创建完成的Swarm集群了,其由Anker负责USB供电,包含6台C.H.I.P. 小计算机与1台RaspberryPi Zero——全部设备皆通过WiFi网络接入,并运行Docker1.12.1的Swarm模式:

 

qq%e6%88%aa%e5%9b%be20161207193819

 

接下来呢?

利用这套硬件设置,我们现在已经拥有了包含7台ARM设备、经由WiFi实现连接的物联网集群。各节点间的往来流量全部默认受到安全控制,且可以集中方式通过Swarm管理节点进行限制。接下来,我们需要通过Docker Machine立足本地计算机进行安全接入,各ARM单片可分布在家庭环境下的各个位置,并运行承载不同任务的Docker容器……

版权归作者所有
原文链接:http://blog.hypriot.com/post/deploy-swarm-on-chip-with-docker-machine/
分享到:更多 ()