树莓派

树莓派

DockOne微信分享( 九十五):树莓派上的Docker集群管理

niusmallnan 发表了文章 • 0 个评论 • 7401 次浏览 • 2016-11-16 13:31 • 来自相关话题

【编者的话】随着IOT市场的火热发展,Docker天然的轻量级以及帮助业务快速重构的特性,将会在IOT领域迎来巨大发展潜力,甚至有可能会比它在云端的潜力更大。本文将致力于构建一个利用Rancher&RancherOS来管理运行在树莓派上的容器集群。 ...查看全部
【编者的话】随着IOT市场的火热发展,Docker天然的轻量级以及帮助业务快速重构的特性,将会在IOT领域迎来巨大发展潜力,甚至有可能会比它在云端的潜力更大。本文将致力于构建一个利用Rancher&RancherOS来管理运行在树莓派上的容器集群。

目前业界主流基本都是在x86架构上使用Docker,除了因为Intel在服务器领域的绝对领导地位之外,x86 CPU的确在性能上有着卓越的表现。但是近些年来,随着云计算的迅猛发展,引来了数据中心的大规模建设,慢慢地大家对数据中心PUE尤其是CPU功耗有了更高的要求。ARM CPU虽然性能不如x86,但是在功耗上绝对有着无法比拟的优势,同时我们知道并不是所有的服务都有高性能的CPU需要。很多厂商在都对ARM服务器投入了研发资源,但是效果上目前来看并不是太好,ARM处理器在服务器领域并没有如在移动端那样被快速接受,主要是因为市场接受度及服务器市场的性能要求所致。
rpi-docker-0.png

但是在物联网(IOT)领域,ARM处理器却是霸主级的地位,毕竟在这个领域功耗胜过一切。那么我们可以想象,未来会占大市场的IOT设备中,会出现各种尺寸各种架构,内置操作系统也不统一,没有通用程序打包标准,几乎每种设备程序的开发框架均不同,IOT设备中程序部署升级回滚等操作不够灵活,等等这样那样的问题。

而这些问题,我们可以借鉴X86时代的经验,用Docker容器来解决它们。Docker能降低IOT应用管理的负载度,但是在物理设备和Docker之间,我们还需要一个轻量级的操作系统。这个OS需要是完全可以定制的,可以针对不同设备需求,裁剪或增加对应的程序模块,更小体积更少进程意味着更低的功耗。

根据以上判断和需求,我经过了一番探索,最终选择了RancherOS。它本身的特性是:

  • 真正容器化的Linux操作系统极致精简,所有服务(包括系统服务)均运行在容器中,可以以容器方式对其进行任意定制
  • 内置了Docker Engine,无需在安装系统后再进行Docker安装
  • 完全开源 https://github.com/rancher/os ,我们可以进行各种深度定制
  • 最最重要的,支持ARM

在RancherOS的整体架构中,最底层毋庸置疑是Linux kernel,系统启动后的PID 1用system-docker代替,由它来把udev、dhcp、console等系统服务启动,同时会启动user-docker,用户运行的应用程序均跑在user-docker下。
rpi-docker-1.png

我们以树莓派为例,将RancherOS部署在其之上。这里需要提示的是,RancherOS每个版本release之时,都会放出树莓派的支持版本,比如本次分享使用的v0.7.0版本https://github.com/rancher/os/releases/download/v0.7.0/rancheros-raspberry-pi.zip 。通过dd命令将RancherOS写到树莓派的SD卡上,通电点亮树莓派。
rpi-docker-2.png

查看PID 1是system-docker:
rpi-docker-3.png

通过system-docker ps 查看启动的系统服务:
rpi-docker-4.png

正常来说,我们都得设置一下docker registry mirror,这样方便pull镜像。RancherOS的配置,都是通过ros config命令来配置,比如设置user-docker的mirror:
$ sudo ros config set rancher.docker.extra_args [--registry-mirror,https://xxxxxxx]
$ sudo system-docker restart docker # 重启user-docker

最终,可以看到:
rpi-docker-5.png

RancherOS有一个我认为比较好的特性,就是支持很方便的对Docker Engine版本进行切换。目前Docker迭代的速度并不慢,实际上很多程序不一定会兼容比较新的Engine,Docker Engine版本的管理变得越来越重要。尤其是在测试环境中,我们有时确实需要变换Docker Engine版本,来构建测试场景:
$ sudo ros engine list  #查看当前版本支持的engine有哪些
disabled docker-1.10.3
disabled docker-1.11.2
current docker-1.12.1
$ sudo ros engine switch docker-1.11.2 #切换docker-1.11版本

此外,如果对Docker Engine有更特殊的需求,还可以定制自己的版本,然后让system-docker来加载它。

只需将编译好的Docker Engine放到Scratch镜像中即可:
rpi-docker-6.png

这部分可以参考:https://github.com/rancher/os-engines

另外,如果习惯了使用相应Linux发行版的命令行,那么也可以加载对应的Console镜像(当然如果考虑精简系统也可不必加载):
rpi-docker-7.png

此部分需要进行深度定制,可以参考:https://github.com/rancher/os-images
rpi-docker-8.png

RancherOS更多酷炫的功能,可以访问官方的文档:http://docs.rancher.com/os

RancherOS介绍完毕后,我们可以在单机树莓派上做容器管理了,喜欢命令行的当然最好,喜欢UI管理的,推荐两款可以在树莓派上运行的管理程序。

portainer https://github.com/portainer/portainer ,其有专门的arm镜像 portainer/portainer:arm ,运行后:
$ docker run --restart=always -d -p 9000:9000 --privileged -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer:arm

rpi-docker-9.png

更加简约的 ui-for-docker https://github.com/kevana/ui-for-docker ,运行如下:
$ docker run --restart=always -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock hypriot/rpi-dockerui

rpi-docker-10.png

单机树莓派之后,我们就要考虑如何将多个树莓派组成Docker集群。一提到Docker集群,我们就会考虑需要编排引擎的支持,无非就是主流的Mesos、Kubernetes、Swarm,还有非主流的Cattle、Nomad之流。那么在IOT场景下,我们最需要考虑的就是精简,所以我选择了新版的Swarm。将RancherOS的Engine切换到1.12.3,然后构建Swarm集群。

简单得执行swarm init和join后,我们就得到了一个树莓派Docker集群:
rpi-docker-11.png

然后我们可以快速执行一个小demo:
swarmkit demo
$ docker service create --replicas 1 -p 80 --name app armhf/httpd
$ docker service scale app=2
$ docker service ps app

rpi-docker-12.png

更多ARM相关的Docker镜像,可以到这两个地方查找:

* https://hub.docker.com/r/armhf
* https://hub.docker.com/u/aarch64

RancherOS设计之初是为了构建一个运行Rancher的轻量级操作系统,那么Rancher本身在ARM的支持上也在不断推进中,相应的PR也有提交:https://github.com/rancher/rancher/pull/4704 。不过目前来看,对rancher-server的ARM化还是比较麻烦,对agent的节点支持ARM相对简单一些,也就是说rancher-server仍然运行在x86架构上,而Agent节点可以支持ARM和x86。

Kubernetes的ARM支持在社区中也有很多人在做,比如:https://github.com/luxas/kubernetes-on-arm ,来自社区的分享:
rpi-docker-13.png

秀一下,我的“家庭树莓派数据中心”:
rpi-docker-14.png

最后,我要特别感谢RancherOS的开发者们,他们帮助我解决了很多问题;另外还要特别感谢MBH树莓派社区的伙伴,提供了硬件设备,支持我的技术探索,并提供了很多帮助。
#Q&A
Q:先问一个问题,您家里的树莓集群用来做什么?有哪些场景会用到树莓Docker?

A:这个需求点来自 MBH树莓派社区的朋友,他们提出希望能够简化多个树莓派上部署程序,同时我对未来Docker在arm服务器上的运行抱有很大期望,我只是对这块进行了一些探索。目前还没有找到真实的需求点,还需要更深入的落地。



Q:您对CoreOS和RancherOS的区别或优劣势上,您是怎么看的?多谢!

A:实际上使用了CoreOS和RancherOS后,会发现这两个在思路和理念上确实很像。RancherOS比CoreOS的容器化做的更加深入,CoreOS的稳定性会更好。RancherOS设计面向Rancher,CoreOS更多会考虑Kubernetes。CoreOS应该会持续深耕服务器端,而RancherOS也许会在IOT端发力一下。



Q:树莓派的内存不大,单个主机上容器数会有很大限制吧?

A:树莓派上跑是为了只是为了单纯简化程序部署,当然不会追求计算密度。计算密度那是服务器关注的事,另外,树莓派的内存不大只是暂时的。



Q:请问在arm架构里partition是怎么做的?

A:dd写完镜像后,默认又一个根分区,可以再建一个分区,把docker的目录挂上去,这样能充分利用整个sd卡。



Q:RancherOS上使用Docker,应用能在容器中通过GPU执行浮点运算吗?需要装驱动吗?在哪装?

A: RancherOS是一个完全可以定制的操作系统。只要有对应的module,都可以初始化到RancherOS中。



以上内容根据2016年11月15日晚微信群分享内容整理。分享人张智博(niusmallnan),初出茅庐在阿里巴巴口碑网,参与本地搜索业务研发工作,后与朋友联合创办美食点评社区“美食行”,之后在各种公司从事云计算研发工作。Rancher中国社区布道师,MBH树莓派社区成员,OpenStack中国社区长期作者。热爱coding,热爱技术分享,技术宅&科幻粉,树莓派热血青年。 DockOne每周都会组织定向的技术分享,欢迎感兴趣的同学加微信:liyingjiesz,进群参与,您有想听的话题或者想分享的话题都可以给我们留言。

Docker、 Weave、 树莓派(Raspberry Pi) 和 一些网络云计算

叶可强 发表了文章 • 1 个评论 • 9593 次浏览 • 2014-12-18 14:39 • 来自相关话题

【编者的话】Docker 、树莓派、云计算,分别对应着现在最火的三个领域,他们结合起来会有怎么样的火花了?未来是否会成为新的趋势?作者首先讲了面临的网络问题,并给出了解决方案。紧接着通过代码的形式介绍了自己的最佳实践。 如何使用简单 ...查看全部
【编者的话】Docker 、树莓派、云计算,分别对应着现在最火的三个领域,他们结合起来会有怎么样的火花了?未来是否会成为新的趋势?作者首先讲了面临的网络问题,并给出了解决方案。紧接着通过代码的形式介绍了自己的最佳实践。

如何使用简单的方法使云计算连接到任何设备

在过去几个月我已经尝试了 [Weave][1] 和 [Docker][2],最近我想看看我是否可以将我家里使用的树莓派与我工作中操作的[云平台][3]结合起来。理想的情况下,树莓派不一定非得放到家里,而是可以放在任何一个可通过互联网连接的地方。

网络问题

网络依然是目前面临的最大难题。我们习惯于传统网络方法,以至于人们很难找到可以解决相应问题的方案。操作系统和网络都是为应用程序提供服务。现代 UN*X Sun Solaris (zones)首先实现了进程隔离,紧接着FreeBSD (jails)和 稍后的 OpenVZ / Linux-vserver为 Docker 的出现铺平了道路,随着内核中 namespace/cgroups 的开发 ,现在这已经是一个相对成熟的技术。在 Weave 加入后,整个世界都将被颠覆。

我想通过云上的私人 dropbox-like 服务器(应用程序 B)来连接我家里的 NAS 存储解决方案(应用程序 A),以保证所有文件可用以及从云中的另一个服务器提供一些额外的内容的能力(应用程序 C)。

安装

为了证明这一点,我开始在我的 Pi 上部署 Weave 并连接上我在 Interoute 虚拟数据中心设置的 Docker/Weave。 Interoute 有一个完整的网络 / IaaS 平台,非常适合这些云区域之间私人互联自动化类型的场景,并且是免费的。

设置大概看起来像下图:
1-POeFWxJue2ukz0Z6cjH5jg.jpeg

通常你需要设置一些 IPSEC 或 SSL VPN 隧道来连接环境,但是涉及的烦人配置步骤只是为了得到一个私人互联。幸运的是云区域已经在 3 层对互联加密了。真正的问题开始于当你需要把流量路由到远程主机或者是有多个网关直接连通公共和内部网络的时候(像在服务器 2)。甚至对我来说,我已经专业于主机和网络的业务 20 年之久,这意味着我必须在它上面思考和工作以确保正确设置路由。太浪费时间并让我非常的失望。

一个使用 Docker 和 Weave 的解决方案

使用Docker 可以创建微服务或者是在容器中运行成熟的 Linux 发行版,这里有非常多的管理选项处理它们,但这次我不会讨论它。

Weave 是一个为跨主机的容器提供虚拟网络的工具。在这里,我们主要使用了其两个主要特性:

- 为多主机上的容器规划同一子网的功能(虚拟 2 层有效广播域)
- 为 Docker 容器提供连接到 Weave 网络的自动路径发现

在设置完 Weave 后,解决方案看起来像这样:
1-2wo2anFiX4Gk1a2_yZzQuA.jpeg

在从服务器 1 到服务器 3 的路径发现上发生了一些神奇的事情:只要服务器之间有一条路径,Weave 就会自动转发数据包。Weave 将从邻居学习 MAC 地址,从这个方式的数据包学习下一跳(next-hop),详情请看[这里][6]。

这么一设置我就可以带着我的 PI 到任何地方,只要我的网络(有状态的 outboud)可以开放 tcp/udp 的 6783 端口,它将一直连接到云设施。

组成

棘手的部分是在树莓派上运行 Docker 和 Weave,因为它需要最新的内核和用户空间以保证可以正常工作。经过在 odroid-u3 的 Ubuntu、Arch Linux 和 树莓派的 Raspbian 上做过几次试验后,我解决了:

- 树莓派模型 B
- [Raspbian Wheezy][7] 更新到 Jessie 和 3.16 内核(我找不到一个合适的用于 Pi 的 Jessie 镜像)
- 当更新的时候,保证最小的 8GB SD 卡不会耗尽空间,你需要及时发现发现这个问题。
- 一批云虚拟机运行着 Debian Jessie(或者是任何你能运行 Docker+Weave 的系统)

设置树莓派

    []下载 [Raspbian Wheezy][8] 并写入你的 SD 卡[/][]启动后,Pi 改变了在 `/etc/apt/sources.list ` 中所有从 Wheezy 到 Jessie 的引用并且运行:[/]
``` # sudo apt-get update # sudo apt-get -y upgrade # sudo apt-get -y dist-upgrade ```休息会,这将会花费很长时间。确保偶尔的按 y,然后继续 sleeping(按 NO 来改变 dphys-swapfile,因为它将创建 1gb swapfile & raspbian 使用一个大部分未使用的 100MB swapfile 代替 )。确保在 Pi 上安装了 3.16 内核,libpcap-dev, Mercurial, Docker (我们需要 Docker 来构建 Weave) 和 Go:```# sudo apt-get install linux-image-rpi# sudo apt-get install libpcap-dev# sudo apt-get install mercurial# sudo apt-get install golang-go# sudo apt-get install docker.io```Jessie 使用 systemd,确保 Docker 正在运行:```# sudo systemctl start docker```现在改变 /boot/config.txt 来包含(在我的示例中是 vmlinuz-3.16.0.4-rpi):```kernel=/boot/vmlinuz--rpi```下载 Weave 源码(根据 [Weave 文档][9])并构建它:```$ cd ~ $ mkdir go$ export GOPATH=~/go $ export PATH=$PATH:$GOPATH/bin $ cd $GOPATH$ WEAVE=github.com/zettio/weave$ git clone https://$WEAVE$ cd src/$WEAVE$ make``` 使用 Docker 和 Weave 配置 3 台服务器在云服务器安装 Docker:```# sudo -i# apt-get install docker.io```安装 Weave 脚本:```# wget -O /usr/local/bin/weave https://raw.githubusercontent.com/zettio/weave/master/weave# chmod a+x /usr/local/bin/weave```一旦所有的主机都运行了 Docker,在第一台主机上这样做:```# weave launch -password ```任何额外的主机通过运行相同的命令加上一个已经配置的主机 IP 地址都可以被添加,像这样:```# weave launch -password ```仅仅要求防火墙配置支持 TCP 和 UDP 连接到 Weave 主机的 6783 端口。现在在树莓派上运行:```# weave run 10.0.1.1/24 -t -i --name ApplicationA resin/rpi-raspbian:jessie /bin/bash```并且在云主机上运行:```# weave run 10.0.1.2/24 -t -i --name ApplicationB ubuntu /bin/bash # weave run 10.0.1.3/24 -t -i --name ApplicationC ubuntu /bin/bash```连接(attach )和测试:```# docker attach ```当你已经连接到 vm,你可以 ping 在 10.0.1.0/24 网络的其他主机。甚至在 server 3 的容器被连接到在 server 1 的容器,尽管他们直接没有直接连接:所有流量都是自动通过 server 2 路由的!
1-4M9iA_0Wx8kaM5nXwuk6Bw.png
在 Docker 中安装实际的应用程序(在我的案例中主要是 owncloud 和 samba),我把这个作为练习留给读者,玩的愉快点! 链接
    [][Weave][11][/][][Docker][12][/][][Raspbian][13][/][][Debian][14][/][][Interoute VDC][15][/]
故障排查我一路上遇到的问题是使用旧的内核和其他的发行版(不影响最终的配置):
    []由于缺少 libpcap,Arch Linux 不能编译 Weave,虽然 headers 存在。没有耐心找出依赖项[/][]在 /usr/local/bin/weave 脚本中有一行为 bridge 设置 MTU,在老的内核/驱动上是不支持的,你需要获取:[/]
> RTNETLINK:该操作不支持 我修改了该脚本来在 bridge 开始创建的时候设置 MTU,因为我的设置支持,但是后来遇到了其他问题。
    []大部分发行版的内核作为镜像分发给 raspberry/arm 是不够新的以至于不适合运行 Docker 或者是缺少 cgroups 内核配置。我为 Raspbian 解决了这个问题,linux-image-rpi(目前是 linux-image-3.16.0.4-rpi)包。 [/]
想法/风险
    []使用 Weave ,你是潜在的桥接到安全域,这可能会影响你的安全策略[/][]我没有详细看关于 Weave 使用 `-password` 选项实现安全的细节。没有以一个整体对该设置的安全作评论。我将深入研究,并根据需要更新。[/][]disclaimer:在 ARM 上,Docker 不是官方支持的,有潜在的问题![/]

这是一个实验设置(目前为止)。

原文地址:https://medium.com/@ALGrendel/docker-weave-a-little-cloud-and-a-raspberry-pi-381f73a4376d
[1]: https://github.com/zettio/weave
[2]: https://www.docker.com/
[3]: http://cloudstore.interoute.com/main/WhatInterouteVDC
[6]: https://github.com/zettio/weave/blob/master/docs/architecture.txt
[7]: http://www.raspberrypi.org/downloads/
[8]: http://www.raspberrypi.org/downloads/
[9]: http://zettio.github.io/weave/building.html
[11]: https://github.com/zettio/weave
[12]: http://docker.io/
[13]: http://www.raspbian.org/
[14]: https://www.debian.org/
[15]: http://cloudstore.interoute.com/

DockOne微信分享( 九十五):树莓派上的Docker集群管理

niusmallnan 发表了文章 • 0 个评论 • 7401 次浏览 • 2016-11-16 13:31 • 来自相关话题

【编者的话】随着IOT市场的火热发展,Docker天然的轻量级以及帮助业务快速重构的特性,将会在IOT领域迎来巨大发展潜力,甚至有可能会比它在云端的潜力更大。本文将致力于构建一个利用Rancher&RancherOS来管理运行在树莓派上的容器集群。 ...查看全部
【编者的话】随着IOT市场的火热发展,Docker天然的轻量级以及帮助业务快速重构的特性,将会在IOT领域迎来巨大发展潜力,甚至有可能会比它在云端的潜力更大。本文将致力于构建一个利用Rancher&RancherOS来管理运行在树莓派上的容器集群。

目前业界主流基本都是在x86架构上使用Docker,除了因为Intel在服务器领域的绝对领导地位之外,x86 CPU的确在性能上有着卓越的表现。但是近些年来,随着云计算的迅猛发展,引来了数据中心的大规模建设,慢慢地大家对数据中心PUE尤其是CPU功耗有了更高的要求。ARM CPU虽然性能不如x86,但是在功耗上绝对有着无法比拟的优势,同时我们知道并不是所有的服务都有高性能的CPU需要。很多厂商在都对ARM服务器投入了研发资源,但是效果上目前来看并不是太好,ARM处理器在服务器领域并没有如在移动端那样被快速接受,主要是因为市场接受度及服务器市场的性能要求所致。
rpi-docker-0.png

但是在物联网(IOT)领域,ARM处理器却是霸主级的地位,毕竟在这个领域功耗胜过一切。那么我们可以想象,未来会占大市场的IOT设备中,会出现各种尺寸各种架构,内置操作系统也不统一,没有通用程序打包标准,几乎每种设备程序的开发框架均不同,IOT设备中程序部署升级回滚等操作不够灵活,等等这样那样的问题。

而这些问题,我们可以借鉴X86时代的经验,用Docker容器来解决它们。Docker能降低IOT应用管理的负载度,但是在物理设备和Docker之间,我们还需要一个轻量级的操作系统。这个OS需要是完全可以定制的,可以针对不同设备需求,裁剪或增加对应的程序模块,更小体积更少进程意味着更低的功耗。

根据以上判断和需求,我经过了一番探索,最终选择了RancherOS。它本身的特性是:

  • 真正容器化的Linux操作系统极致精简,所有服务(包括系统服务)均运行在容器中,可以以容器方式对其进行任意定制
  • 内置了Docker Engine,无需在安装系统后再进行Docker安装
  • 完全开源 https://github.com/rancher/os ,我们可以进行各种深度定制
  • 最最重要的,支持ARM

在RancherOS的整体架构中,最底层毋庸置疑是Linux kernel,系统启动后的PID 1用system-docker代替,由它来把udev、dhcp、console等系统服务启动,同时会启动user-docker,用户运行的应用程序均跑在user-docker下。
rpi-docker-1.png

我们以树莓派为例,将RancherOS部署在其之上。这里需要提示的是,RancherOS每个版本release之时,都会放出树莓派的支持版本,比如本次分享使用的v0.7.0版本https://github.com/rancher/os/releases/download/v0.7.0/rancheros-raspberry-pi.zip 。通过dd命令将RancherOS写到树莓派的SD卡上,通电点亮树莓派。
rpi-docker-2.png

查看PID 1是system-docker:
rpi-docker-3.png

通过system-docker ps 查看启动的系统服务:
rpi-docker-4.png

正常来说,我们都得设置一下docker registry mirror,这样方便pull镜像。RancherOS的配置,都是通过ros config命令来配置,比如设置user-docker的mirror:
$ sudo ros config set rancher.docker.extra_args [--registry-mirror,https://xxxxxxx]
$ sudo system-docker restart docker # 重启user-docker

最终,可以看到:
rpi-docker-5.png

RancherOS有一个我认为比较好的特性,就是支持很方便的对Docker Engine版本进行切换。目前Docker迭代的速度并不慢,实际上很多程序不一定会兼容比较新的Engine,Docker Engine版本的管理变得越来越重要。尤其是在测试环境中,我们有时确实需要变换Docker Engine版本,来构建测试场景:
$ sudo ros engine list  #查看当前版本支持的engine有哪些
disabled docker-1.10.3
disabled docker-1.11.2
current docker-1.12.1
$ sudo ros engine switch docker-1.11.2 #切换docker-1.11版本

此外,如果对Docker Engine有更特殊的需求,还可以定制自己的版本,然后让system-docker来加载它。

只需将编译好的Docker Engine放到Scratch镜像中即可:
rpi-docker-6.png

这部分可以参考:https://github.com/rancher/os-engines

另外,如果习惯了使用相应Linux发行版的命令行,那么也可以加载对应的Console镜像(当然如果考虑精简系统也可不必加载):
rpi-docker-7.png

此部分需要进行深度定制,可以参考:https://github.com/rancher/os-images
rpi-docker-8.png

RancherOS更多酷炫的功能,可以访问官方的文档:http://docs.rancher.com/os

RancherOS介绍完毕后,我们可以在单机树莓派上做容器管理了,喜欢命令行的当然最好,喜欢UI管理的,推荐两款可以在树莓派上运行的管理程序。

portainer https://github.com/portainer/portainer ,其有专门的arm镜像 portainer/portainer:arm ,运行后:
$ docker run --restart=always -d -p 9000:9000 --privileged -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer:arm

rpi-docker-9.png

更加简约的 ui-for-docker https://github.com/kevana/ui-for-docker ,运行如下:
$ docker run --restart=always -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock hypriot/rpi-dockerui

rpi-docker-10.png

单机树莓派之后,我们就要考虑如何将多个树莓派组成Docker集群。一提到Docker集群,我们就会考虑需要编排引擎的支持,无非就是主流的Mesos、Kubernetes、Swarm,还有非主流的Cattle、Nomad之流。那么在IOT场景下,我们最需要考虑的就是精简,所以我选择了新版的Swarm。将RancherOS的Engine切换到1.12.3,然后构建Swarm集群。

简单得执行swarm init和join后,我们就得到了一个树莓派Docker集群:
rpi-docker-11.png

然后我们可以快速执行一个小demo:
swarmkit demo
$ docker service create --replicas 1 -p 80 --name app armhf/httpd
$ docker service scale app=2
$ docker service ps app

rpi-docker-12.png

更多ARM相关的Docker镜像,可以到这两个地方查找:

* https://hub.docker.com/r/armhf
* https://hub.docker.com/u/aarch64

RancherOS设计之初是为了构建一个运行Rancher的轻量级操作系统,那么Rancher本身在ARM的支持上也在不断推进中,相应的PR也有提交:https://github.com/rancher/rancher/pull/4704 。不过目前来看,对rancher-server的ARM化还是比较麻烦,对agent的节点支持ARM相对简单一些,也就是说rancher-server仍然运行在x86架构上,而Agent节点可以支持ARM和x86。

Kubernetes的ARM支持在社区中也有很多人在做,比如:https://github.com/luxas/kubernetes-on-arm ,来自社区的分享:
rpi-docker-13.png

秀一下,我的“家庭树莓派数据中心”:
rpi-docker-14.png

最后,我要特别感谢RancherOS的开发者们,他们帮助我解决了很多问题;另外还要特别感谢MBH树莓派社区的伙伴,提供了硬件设备,支持我的技术探索,并提供了很多帮助。
#Q&A
Q:先问一个问题,您家里的树莓集群用来做什么?有哪些场景会用到树莓Docker?

A:这个需求点来自 MBH树莓派社区的朋友,他们提出希望能够简化多个树莓派上部署程序,同时我对未来Docker在arm服务器上的运行抱有很大期望,我只是对这块进行了一些探索。目前还没有找到真实的需求点,还需要更深入的落地。



Q:您对CoreOS和RancherOS的区别或优劣势上,您是怎么看的?多谢!

A:实际上使用了CoreOS和RancherOS后,会发现这两个在思路和理念上确实很像。RancherOS比CoreOS的容器化做的更加深入,CoreOS的稳定性会更好。RancherOS设计面向Rancher,CoreOS更多会考虑Kubernetes。CoreOS应该会持续深耕服务器端,而RancherOS也许会在IOT端发力一下。



Q:树莓派的内存不大,单个主机上容器数会有很大限制吧?

A:树莓派上跑是为了只是为了单纯简化程序部署,当然不会追求计算密度。计算密度那是服务器关注的事,另外,树莓派的内存不大只是暂时的。



Q:请问在arm架构里partition是怎么做的?

A:dd写完镜像后,默认又一个根分区,可以再建一个分区,把docker的目录挂上去,这样能充分利用整个sd卡。



Q:RancherOS上使用Docker,应用能在容器中通过GPU执行浮点运算吗?需要装驱动吗?在哪装?

A: RancherOS是一个完全可以定制的操作系统。只要有对应的module,都可以初始化到RancherOS中。



以上内容根据2016年11月15日晚微信群分享内容整理。分享人张智博(niusmallnan),初出茅庐在阿里巴巴口碑网,参与本地搜索业务研发工作,后与朋友联合创办美食点评社区“美食行”,之后在各种公司从事云计算研发工作。Rancher中国社区布道师,MBH树莓派社区成员,OpenStack中国社区长期作者。热爱coding,热爱技术分享,技术宅&科幻粉,树莓派热血青年。 DockOne每周都会组织定向的技术分享,欢迎感兴趣的同学加微信:liyingjiesz,进群参与,您有想听的话题或者想分享的话题都可以给我们留言。

Docker、 Weave、 树莓派(Raspberry Pi) 和 一些网络云计算

叶可强 发表了文章 • 1 个评论 • 9593 次浏览 • 2014-12-18 14:39 • 来自相关话题

【编者的话】Docker 、树莓派、云计算,分别对应着现在最火的三个领域,他们结合起来会有怎么样的火花了?未来是否会成为新的趋势?作者首先讲了面临的网络问题,并给出了解决方案。紧接着通过代码的形式介绍了自己的最佳实践。 如何使用简单 ...查看全部
【编者的话】Docker 、树莓派、云计算,分别对应着现在最火的三个领域,他们结合起来会有怎么样的火花了?未来是否会成为新的趋势?作者首先讲了面临的网络问题,并给出了解决方案。紧接着通过代码的形式介绍了自己的最佳实践。

如何使用简单的方法使云计算连接到任何设备

在过去几个月我已经尝试了 [Weave][1] 和 [Docker][2],最近我想看看我是否可以将我家里使用的树莓派与我工作中操作的[云平台][3]结合起来。理想的情况下,树莓派不一定非得放到家里,而是可以放在任何一个可通过互联网连接的地方。

网络问题

网络依然是目前面临的最大难题。我们习惯于传统网络方法,以至于人们很难找到可以解决相应问题的方案。操作系统和网络都是为应用程序提供服务。现代 UN*X Sun Solaris (zones)首先实现了进程隔离,紧接着FreeBSD (jails)和 稍后的 OpenVZ / Linux-vserver为 Docker 的出现铺平了道路,随着内核中 namespace/cgroups 的开发 ,现在这已经是一个相对成熟的技术。在 Weave 加入后,整个世界都将被颠覆。

我想通过云上的私人 dropbox-like 服务器(应用程序 B)来连接我家里的 NAS 存储解决方案(应用程序 A),以保证所有文件可用以及从云中的另一个服务器提供一些额外的内容的能力(应用程序 C)。

安装

为了证明这一点,我开始在我的 Pi 上部署 Weave 并连接上我在 Interoute 虚拟数据中心设置的 Docker/Weave。 Interoute 有一个完整的网络 / IaaS 平台,非常适合这些云区域之间私人互联自动化类型的场景,并且是免费的。

设置大概看起来像下图:
1-POeFWxJue2ukz0Z6cjH5jg.jpeg

通常你需要设置一些 IPSEC 或 SSL VPN 隧道来连接环境,但是涉及的烦人配置步骤只是为了得到一个私人互联。幸运的是云区域已经在 3 层对互联加密了。真正的问题开始于当你需要把流量路由到远程主机或者是有多个网关直接连通公共和内部网络的时候(像在服务器 2)。甚至对我来说,我已经专业于主机和网络的业务 20 年之久,这意味着我必须在它上面思考和工作以确保正确设置路由。太浪费时间并让我非常的失望。

一个使用 Docker 和 Weave 的解决方案

使用Docker 可以创建微服务或者是在容器中运行成熟的 Linux 发行版,这里有非常多的管理选项处理它们,但这次我不会讨论它。

Weave 是一个为跨主机的容器提供虚拟网络的工具。在这里,我们主要使用了其两个主要特性:

- 为多主机上的容器规划同一子网的功能(虚拟 2 层有效广播域)
- 为 Docker 容器提供连接到 Weave 网络的自动路径发现

在设置完 Weave 后,解决方案看起来像这样:
1-2wo2anFiX4Gk1a2_yZzQuA.jpeg

在从服务器 1 到服务器 3 的路径发现上发生了一些神奇的事情:只要服务器之间有一条路径,Weave 就会自动转发数据包。Weave 将从邻居学习 MAC 地址,从这个方式的数据包学习下一跳(next-hop),详情请看[这里][6]。

这么一设置我就可以带着我的 PI 到任何地方,只要我的网络(有状态的 outboud)可以开放 tcp/udp 的 6783 端口,它将一直连接到云设施。

组成

棘手的部分是在树莓派上运行 Docker 和 Weave,因为它需要最新的内核和用户空间以保证可以正常工作。经过在 odroid-u3 的 Ubuntu、Arch Linux 和 树莓派的 Raspbian 上做过几次试验后,我解决了:

- 树莓派模型 B
- [Raspbian Wheezy][7] 更新到 Jessie 和 3.16 内核(我找不到一个合适的用于 Pi 的 Jessie 镜像)
- 当更新的时候,保证最小的 8GB SD 卡不会耗尽空间,你需要及时发现发现这个问题。
- 一批云虚拟机运行着 Debian Jessie(或者是任何你能运行 Docker+Weave 的系统)

设置树莓派

    []下载 [Raspbian Wheezy][8] 并写入你的 SD 卡[/][]启动后,Pi 改变了在 `/etc/apt/sources.list ` 中所有从 Wheezy 到 Jessie 的引用并且运行:[/]
``` # sudo apt-get update # sudo apt-get -y upgrade # sudo apt-get -y dist-upgrade ```休息会,这将会花费很长时间。确保偶尔的按 y,然后继续 sleeping(按 NO 来改变 dphys-swapfile,因为它将创建 1gb swapfile & raspbian 使用一个大部分未使用的 100MB swapfile 代替 )。确保在 Pi 上安装了 3.16 内核,libpcap-dev, Mercurial, Docker (我们需要 Docker 来构建 Weave) 和 Go:```# sudo apt-get install linux-image-rpi# sudo apt-get install libpcap-dev# sudo apt-get install mercurial# sudo apt-get install golang-go# sudo apt-get install docker.io```Jessie 使用 systemd,确保 Docker 正在运行:```# sudo systemctl start docker```现在改变 /boot/config.txt 来包含(在我的示例中是 vmlinuz-3.16.0.4-rpi):```kernel=/boot/vmlinuz--rpi```下载 Weave 源码(根据 [Weave 文档][9])并构建它:```$ cd ~ $ mkdir go$ export GOPATH=~/go $ export PATH=$PATH:$GOPATH/bin $ cd $GOPATH$ WEAVE=github.com/zettio/weave$ git clone https://$WEAVE$ cd src/$WEAVE$ make``` 使用 Docker 和 Weave 配置 3 台服务器在云服务器安装 Docker:```# sudo -i# apt-get install docker.io```安装 Weave 脚本:```# wget -O /usr/local/bin/weave https://raw.githubusercontent.com/zettio/weave/master/weave# chmod a+x /usr/local/bin/weave```一旦所有的主机都运行了 Docker,在第一台主机上这样做:```# weave launch -password ```任何额外的主机通过运行相同的命令加上一个已经配置的主机 IP 地址都可以被添加,像这样:```# weave launch -password ```仅仅要求防火墙配置支持 TCP 和 UDP 连接到 Weave 主机的 6783 端口。现在在树莓派上运行:```# weave run 10.0.1.1/24 -t -i --name ApplicationA resin/rpi-raspbian:jessie /bin/bash```并且在云主机上运行:```# weave run 10.0.1.2/24 -t -i --name ApplicationB ubuntu /bin/bash # weave run 10.0.1.3/24 -t -i --name ApplicationC ubuntu /bin/bash```连接(attach )和测试:```# docker attach ```当你已经连接到 vm,你可以 ping 在 10.0.1.0/24 网络的其他主机。甚至在 server 3 的容器被连接到在 server 1 的容器,尽管他们直接没有直接连接:所有流量都是自动通过 server 2 路由的!
1-4M9iA_0Wx8kaM5nXwuk6Bw.png
在 Docker 中安装实际的应用程序(在我的案例中主要是 owncloud 和 samba),我把这个作为练习留给读者,玩的愉快点! 链接
    [][Weave][11][/][][Docker][12][/][][Raspbian][13][/][][Debian][14][/][][Interoute VDC][15][/]
故障排查我一路上遇到的问题是使用旧的内核和其他的发行版(不影响最终的配置):
    []由于缺少 libpcap,Arch Linux 不能编译 Weave,虽然 headers 存在。没有耐心找出依赖项[/][]在 /usr/local/bin/weave 脚本中有一行为 bridge 设置 MTU,在老的内核/驱动上是不支持的,你需要获取:[/]
> RTNETLINK:该操作不支持 我修改了该脚本来在 bridge 开始创建的时候设置 MTU,因为我的设置支持,但是后来遇到了其他问题。
    []大部分发行版的内核作为镜像分发给 raspberry/arm 是不够新的以至于不适合运行 Docker 或者是缺少 cgroups 内核配置。我为 Raspbian 解决了这个问题,linux-image-rpi(目前是 linux-image-3.16.0.4-rpi)包。 [/]
想法/风险
    []使用 Weave ,你是潜在的桥接到安全域,这可能会影响你的安全策略[/][]我没有详细看关于 Weave 使用 `-password` 选项实现安全的细节。没有以一个整体对该设置的安全作评论。我将深入研究,并根据需要更新。[/][]disclaimer:在 ARM 上,Docker 不是官方支持的,有潜在的问题![/]

这是一个实验设置(目前为止)。

原文地址:https://medium.com/@ALGrendel/docker-weave-a-little-cloud-and-a-raspberry-pi-381f73a4376d
[1]: https://github.com/zettio/weave
[2]: https://www.docker.com/
[3]: http://cloudstore.interoute.com/main/WhatInterouteVDC
[6]: https://github.com/zettio/weave/blob/master/docs/architecture.txt
[7]: http://www.raspberrypi.org/downloads/
[8]: http://www.raspberrypi.org/downloads/
[9]: http://zettio.github.io/weave/building.html
[11]: https://github.com/zettio/weave
[12]: http://docker.io/
[13]: http://www.raspbian.org/
[14]: https://www.debian.org/
[15]: http://cloudstore.interoute.com/

DockOne微信分享( 九十五):树莓派上的Docker集群管理

niusmallnan 发表了文章 • 0 个评论 • 7401 次浏览 • 2016-11-16 13:31 • 来自相关话题

【编者的话】随着IOT市场的火热发展,Docker天然的轻量级以及帮助业务快速重构的特性,将会在IOT领域迎来巨大发展潜力,甚至有可能会比它在云端的潜力更大。本文将致力于构建一个利用Rancher&RancherOS来管理运行在树莓派上的容器集群。 ...查看全部
【编者的话】随着IOT市场的火热发展,Docker天然的轻量级以及帮助业务快速重构的特性,将会在IOT领域迎来巨大发展潜力,甚至有可能会比它在云端的潜力更大。本文将致力于构建一个利用Rancher&RancherOS来管理运行在树莓派上的容器集群。

目前业界主流基本都是在x86架构上使用Docker,除了因为Intel在服务器领域的绝对领导地位之外,x86 CPU的确在性能上有着卓越的表现。但是近些年来,随着云计算的迅猛发展,引来了数据中心的大规模建设,慢慢地大家对数据中心PUE尤其是CPU功耗有了更高的要求。ARM CPU虽然性能不如x86,但是在功耗上绝对有着无法比拟的优势,同时我们知道并不是所有的服务都有高性能的CPU需要。很多厂商在都对ARM服务器投入了研发资源,但是效果上目前来看并不是太好,ARM处理器在服务器领域并没有如在移动端那样被快速接受,主要是因为市场接受度及服务器市场的性能要求所致。
rpi-docker-0.png

但是在物联网(IOT)领域,ARM处理器却是霸主级的地位,毕竟在这个领域功耗胜过一切。那么我们可以想象,未来会占大市场的IOT设备中,会出现各种尺寸各种架构,内置操作系统也不统一,没有通用程序打包标准,几乎每种设备程序的开发框架均不同,IOT设备中程序部署升级回滚等操作不够灵活,等等这样那样的问题。

而这些问题,我们可以借鉴X86时代的经验,用Docker容器来解决它们。Docker能降低IOT应用管理的负载度,但是在物理设备和Docker之间,我们还需要一个轻量级的操作系统。这个OS需要是完全可以定制的,可以针对不同设备需求,裁剪或增加对应的程序模块,更小体积更少进程意味着更低的功耗。

根据以上判断和需求,我经过了一番探索,最终选择了RancherOS。它本身的特性是:

  • 真正容器化的Linux操作系统极致精简,所有服务(包括系统服务)均运行在容器中,可以以容器方式对其进行任意定制
  • 内置了Docker Engine,无需在安装系统后再进行Docker安装
  • 完全开源 https://github.com/rancher/os ,我们可以进行各种深度定制
  • 最最重要的,支持ARM

在RancherOS的整体架构中,最底层毋庸置疑是Linux kernel,系统启动后的PID 1用system-docker代替,由它来把udev、dhcp、console等系统服务启动,同时会启动user-docker,用户运行的应用程序均跑在user-docker下。
rpi-docker-1.png

我们以树莓派为例,将RancherOS部署在其之上。这里需要提示的是,RancherOS每个版本release之时,都会放出树莓派的支持版本,比如本次分享使用的v0.7.0版本https://github.com/rancher/os/releases/download/v0.7.0/rancheros-raspberry-pi.zip 。通过dd命令将RancherOS写到树莓派的SD卡上,通电点亮树莓派。
rpi-docker-2.png

查看PID 1是system-docker:
rpi-docker-3.png

通过system-docker ps 查看启动的系统服务:
rpi-docker-4.png

正常来说,我们都得设置一下docker registry mirror,这样方便pull镜像。RancherOS的配置,都是通过ros config命令来配置,比如设置user-docker的mirror:
$ sudo ros config set rancher.docker.extra_args [--registry-mirror,https://xxxxxxx]
$ sudo system-docker restart docker # 重启user-docker

最终,可以看到:
rpi-docker-5.png

RancherOS有一个我认为比较好的特性,就是支持很方便的对Docker Engine版本进行切换。目前Docker迭代的速度并不慢,实际上很多程序不一定会兼容比较新的Engine,Docker Engine版本的管理变得越来越重要。尤其是在测试环境中,我们有时确实需要变换Docker Engine版本,来构建测试场景:
$ sudo ros engine list  #查看当前版本支持的engine有哪些
disabled docker-1.10.3
disabled docker-1.11.2
current docker-1.12.1
$ sudo ros engine switch docker-1.11.2 #切换docker-1.11版本

此外,如果对Docker Engine有更特殊的需求,还可以定制自己的版本,然后让system-docker来加载它。

只需将编译好的Docker Engine放到Scratch镜像中即可:
rpi-docker-6.png

这部分可以参考:https://github.com/rancher/os-engines

另外,如果习惯了使用相应Linux发行版的命令行,那么也可以加载对应的Console镜像(当然如果考虑精简系统也可不必加载):
rpi-docker-7.png

此部分需要进行深度定制,可以参考:https://github.com/rancher/os-images
rpi-docker-8.png

RancherOS更多酷炫的功能,可以访问官方的文档:http://docs.rancher.com/os

RancherOS介绍完毕后,我们可以在单机树莓派上做容器管理了,喜欢命令行的当然最好,喜欢UI管理的,推荐两款可以在树莓派上运行的管理程序。

portainer https://github.com/portainer/portainer ,其有专门的arm镜像 portainer/portainer:arm ,运行后:
$ docker run --restart=always -d -p 9000:9000 --privileged -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer:arm

rpi-docker-9.png

更加简约的 ui-for-docker https://github.com/kevana/ui-for-docker ,运行如下:
$ docker run --restart=always -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock hypriot/rpi-dockerui

rpi-docker-10.png

单机树莓派之后,我们就要考虑如何将多个树莓派组成Docker集群。一提到Docker集群,我们就会考虑需要编排引擎的支持,无非就是主流的Mesos、Kubernetes、Swarm,还有非主流的Cattle、Nomad之流。那么在IOT场景下,我们最需要考虑的就是精简,所以我选择了新版的Swarm。将RancherOS的Engine切换到1.12.3,然后构建Swarm集群。

简单得执行swarm init和join后,我们就得到了一个树莓派Docker集群:
rpi-docker-11.png

然后我们可以快速执行一个小demo:
swarmkit demo
$ docker service create --replicas 1 -p 80 --name app armhf/httpd
$ docker service scale app=2
$ docker service ps app

rpi-docker-12.png

更多ARM相关的Docker镜像,可以到这两个地方查找:

* https://hub.docker.com/r/armhf
* https://hub.docker.com/u/aarch64

RancherOS设计之初是为了构建一个运行Rancher的轻量级操作系统,那么Rancher本身在ARM的支持上也在不断推进中,相应的PR也有提交:https://github.com/rancher/rancher/pull/4704 。不过目前来看,对rancher-server的ARM化还是比较麻烦,对agent的节点支持ARM相对简单一些,也就是说rancher-server仍然运行在x86架构上,而Agent节点可以支持ARM和x86。

Kubernetes的ARM支持在社区中也有很多人在做,比如:https://github.com/luxas/kubernetes-on-arm ,来自社区的分享:
rpi-docker-13.png

秀一下,我的“家庭树莓派数据中心”:
rpi-docker-14.png

最后,我要特别感谢RancherOS的开发者们,他们帮助我解决了很多问题;另外还要特别感谢MBH树莓派社区的伙伴,提供了硬件设备,支持我的技术探索,并提供了很多帮助。
#Q&A
Q:先问一个问题,您家里的树莓集群用来做什么?有哪些场景会用到树莓Docker?

A:这个需求点来自 MBH树莓派社区的朋友,他们提出希望能够简化多个树莓派上部署程序,同时我对未来Docker在arm服务器上的运行抱有很大期望,我只是对这块进行了一些探索。目前还没有找到真实的需求点,还需要更深入的落地。



Q:您对CoreOS和RancherOS的区别或优劣势上,您是怎么看的?多谢!

A:实际上使用了CoreOS和RancherOS后,会发现这两个在思路和理念上确实很像。RancherOS比CoreOS的容器化做的更加深入,CoreOS的稳定性会更好。RancherOS设计面向Rancher,CoreOS更多会考虑Kubernetes。CoreOS应该会持续深耕服务器端,而RancherOS也许会在IOT端发力一下。



Q:树莓派的内存不大,单个主机上容器数会有很大限制吧?

A:树莓派上跑是为了只是为了单纯简化程序部署,当然不会追求计算密度。计算密度那是服务器关注的事,另外,树莓派的内存不大只是暂时的。



Q:请问在arm架构里partition是怎么做的?

A:dd写完镜像后,默认又一个根分区,可以再建一个分区,把docker的目录挂上去,这样能充分利用整个sd卡。



Q:RancherOS上使用Docker,应用能在容器中通过GPU执行浮点运算吗?需要装驱动吗?在哪装?

A: RancherOS是一个完全可以定制的操作系统。只要有对应的module,都可以初始化到RancherOS中。



以上内容根据2016年11月15日晚微信群分享内容整理。分享人张智博(niusmallnan),初出茅庐在阿里巴巴口碑网,参与本地搜索业务研发工作,后与朋友联合创办美食点评社区“美食行”,之后在各种公司从事云计算研发工作。Rancher中国社区布道师,MBH树莓派社区成员,OpenStack中国社区长期作者。热爱coding,热爱技术分享,技术宅&科幻粉,树莓派热血青年。 DockOne每周都会组织定向的技术分享,欢迎感兴趣的同学加微信:liyingjiesz,进群参与,您有想听的话题或者想分享的话题都可以给我们留言。

Docker、 Weave、 树莓派(Raspberry Pi) 和 一些网络云计算

叶可强 发表了文章 • 1 个评论 • 9593 次浏览 • 2014-12-18 14:39 • 来自相关话题

【编者的话】Docker 、树莓派、云计算,分别对应着现在最火的三个领域,他们结合起来会有怎么样的火花了?未来是否会成为新的趋势?作者首先讲了面临的网络问题,并给出了解决方案。紧接着通过代码的形式介绍了自己的最佳实践。 如何使用简单 ...查看全部
【编者的话】Docker 、树莓派、云计算,分别对应着现在最火的三个领域,他们结合起来会有怎么样的火花了?未来是否会成为新的趋势?作者首先讲了面临的网络问题,并给出了解决方案。紧接着通过代码的形式介绍了自己的最佳实践。

如何使用简单的方法使云计算连接到任何设备

在过去几个月我已经尝试了 [Weave][1] 和 [Docker][2],最近我想看看我是否可以将我家里使用的树莓派与我工作中操作的[云平台][3]结合起来。理想的情况下,树莓派不一定非得放到家里,而是可以放在任何一个可通过互联网连接的地方。

网络问题

网络依然是目前面临的最大难题。我们习惯于传统网络方法,以至于人们很难找到可以解决相应问题的方案。操作系统和网络都是为应用程序提供服务。现代 UN*X Sun Solaris (zones)首先实现了进程隔离,紧接着FreeBSD (jails)和 稍后的 OpenVZ / Linux-vserver为 Docker 的出现铺平了道路,随着内核中 namespace/cgroups 的开发 ,现在这已经是一个相对成熟的技术。在 Weave 加入后,整个世界都将被颠覆。

我想通过云上的私人 dropbox-like 服务器(应用程序 B)来连接我家里的 NAS 存储解决方案(应用程序 A),以保证所有文件可用以及从云中的另一个服务器提供一些额外的内容的能力(应用程序 C)。

安装

为了证明这一点,我开始在我的 Pi 上部署 Weave 并连接上我在 Interoute 虚拟数据中心设置的 Docker/Weave。 Interoute 有一个完整的网络 / IaaS 平台,非常适合这些云区域之间私人互联自动化类型的场景,并且是免费的。

设置大概看起来像下图:
1-POeFWxJue2ukz0Z6cjH5jg.jpeg

通常你需要设置一些 IPSEC 或 SSL VPN 隧道来连接环境,但是涉及的烦人配置步骤只是为了得到一个私人互联。幸运的是云区域已经在 3 层对互联加密了。真正的问题开始于当你需要把流量路由到远程主机或者是有多个网关直接连通公共和内部网络的时候(像在服务器 2)。甚至对我来说,我已经专业于主机和网络的业务 20 年之久,这意味着我必须在它上面思考和工作以确保正确设置路由。太浪费时间并让我非常的失望。

一个使用 Docker 和 Weave 的解决方案

使用Docker 可以创建微服务或者是在容器中运行成熟的 Linux 发行版,这里有非常多的管理选项处理它们,但这次我不会讨论它。

Weave 是一个为跨主机的容器提供虚拟网络的工具。在这里,我们主要使用了其两个主要特性:

- 为多主机上的容器规划同一子网的功能(虚拟 2 层有效广播域)
- 为 Docker 容器提供连接到 Weave 网络的自动路径发现

在设置完 Weave 后,解决方案看起来像这样:
1-2wo2anFiX4Gk1a2_yZzQuA.jpeg

在从服务器 1 到服务器 3 的路径发现上发生了一些神奇的事情:只要服务器之间有一条路径,Weave 就会自动转发数据包。Weave 将从邻居学习 MAC 地址,从这个方式的数据包学习下一跳(next-hop),详情请看[这里][6]。

这么一设置我就可以带着我的 PI 到任何地方,只要我的网络(有状态的 outboud)可以开放 tcp/udp 的 6783 端口,它将一直连接到云设施。

组成

棘手的部分是在树莓派上运行 Docker 和 Weave,因为它需要最新的内核和用户空间以保证可以正常工作。经过在 odroid-u3 的 Ubuntu、Arch Linux 和 树莓派的 Raspbian 上做过几次试验后,我解决了:

- 树莓派模型 B
- [Raspbian Wheezy][7] 更新到 Jessie 和 3.16 内核(我找不到一个合适的用于 Pi 的 Jessie 镜像)
- 当更新的时候,保证最小的 8GB SD 卡不会耗尽空间,你需要及时发现发现这个问题。
- 一批云虚拟机运行着 Debian Jessie(或者是任何你能运行 Docker+Weave 的系统)

设置树莓派

    []下载 [Raspbian Wheezy][8] 并写入你的 SD 卡[/][]启动后,Pi 改变了在 `/etc/apt/sources.list ` 中所有从 Wheezy 到 Jessie 的引用并且运行:[/]
``` # sudo apt-get update # sudo apt-get -y upgrade # sudo apt-get -y dist-upgrade ```休息会,这将会花费很长时间。确保偶尔的按 y,然后继续 sleeping(按 NO 来改变 dphys-swapfile,因为它将创建 1gb swapfile & raspbian 使用一个大部分未使用的 100MB swapfile 代替 )。确保在 Pi 上安装了 3.16 内核,libpcap-dev, Mercurial, Docker (我们需要 Docker 来构建 Weave) 和 Go:```# sudo apt-get install linux-image-rpi# sudo apt-get install libpcap-dev# sudo apt-get install mercurial# sudo apt-get install golang-go# sudo apt-get install docker.io```Jessie 使用 systemd,确保 Docker 正在运行:```# sudo systemctl start docker```现在改变 /boot/config.txt 来包含(在我的示例中是 vmlinuz-3.16.0.4-rpi):```kernel=/boot/vmlinuz--rpi```下载 Weave 源码(根据 [Weave 文档][9])并构建它:```$ cd ~ $ mkdir go$ export GOPATH=~/go $ export PATH=$PATH:$GOPATH/bin $ cd $GOPATH$ WEAVE=github.com/zettio/weave$ git clone https://$WEAVE$ cd src/$WEAVE$ make``` 使用 Docker 和 Weave 配置 3 台服务器在云服务器安装 Docker:```# sudo -i# apt-get install docker.io```安装 Weave 脚本:```# wget -O /usr/local/bin/weave https://raw.githubusercontent.com/zettio/weave/master/weave# chmod a+x /usr/local/bin/weave```一旦所有的主机都运行了 Docker,在第一台主机上这样做:```# weave launch -password ```任何额外的主机通过运行相同的命令加上一个已经配置的主机 IP 地址都可以被添加,像这样:```# weave launch -password ```仅仅要求防火墙配置支持 TCP 和 UDP 连接到 Weave 主机的 6783 端口。现在在树莓派上运行:```# weave run 10.0.1.1/24 -t -i --name ApplicationA resin/rpi-raspbian:jessie /bin/bash```并且在云主机上运行:```# weave run 10.0.1.2/24 -t -i --name ApplicationB ubuntu /bin/bash # weave run 10.0.1.3/24 -t -i --name ApplicationC ubuntu /bin/bash```连接(attach )和测试:```# docker attach ```当你已经连接到 vm,你可以 ping 在 10.0.1.0/24 网络的其他主机。甚至在 server 3 的容器被连接到在 server 1 的容器,尽管他们直接没有直接连接:所有流量都是自动通过 server 2 路由的!
1-4M9iA_0Wx8kaM5nXwuk6Bw.png
在 Docker 中安装实际的应用程序(在我的案例中主要是 owncloud 和 samba),我把这个作为练习留给读者,玩的愉快点! 链接
    [][Weave][11][/][][Docker][12][/][][Raspbian][13][/][][Debian][14][/][][Interoute VDC][15][/]
故障排查我一路上遇到的问题是使用旧的内核和其他的发行版(不影响最终的配置):
    []由于缺少 libpcap,Arch Linux 不能编译 Weave,虽然 headers 存在。没有耐心找出依赖项[/][]在 /usr/local/bin/weave 脚本中有一行为 bridge 设置 MTU,在老的内核/驱动上是不支持的,你需要获取:[/]
> RTNETLINK:该操作不支持 我修改了该脚本来在 bridge 开始创建的时候设置 MTU,因为我的设置支持,但是后来遇到了其他问题。
    []大部分发行版的内核作为镜像分发给 raspberry/arm 是不够新的以至于不适合运行 Docker 或者是缺少 cgroups 内核配置。我为 Raspbian 解决了这个问题,linux-image-rpi(目前是 linux-image-3.16.0.4-rpi)包。 [/]
想法/风险
    []使用 Weave ,你是潜在的桥接到安全域,这可能会影响你的安全策略[/][]我没有详细看关于 Weave 使用 `-password` 选项实现安全的细节。没有以一个整体对该设置的安全作评论。我将深入研究,并根据需要更新。[/][]disclaimer:在 ARM 上,Docker 不是官方支持的,有潜在的问题![/]

这是一个实验设置(目前为止)。

原文地址:https://medium.com/@ALGrendel/docker-weave-a-little-cloud-and-a-raspberry-pi-381f73a4376d
[1]: https://github.com/zettio/weave
[2]: https://www.docker.com/
[3]: http://cloudstore.interoute.com/main/WhatInterouteVDC
[6]: https://github.com/zettio/weave/blob/master/docs/architecture.txt
[7]: http://www.raspberrypi.org/downloads/
[8]: http://www.raspberrypi.org/downloads/
[9]: http://zettio.github.io/weave/building.html
[11]: https://github.com/zettio/weave
[12]: http://docker.io/
[13]: http://www.raspbian.org/
[14]: https://www.debian.org/
[15]: http://cloudstore.interoute.com/