Docker、 Weave、 树莓派(Raspberry Pi) 和 一些网络云计算
jopen
10年前
【编者的话】Docker 、树莓派、云计算,分别对应着现在最火的三个领域,他们结合起来会有怎么样的火花了?未来是否会成为新的趋势?作者首先讲了面临的网络问题,并给出了解决方案。紧接着通过代码的形式介绍了自己的最佳实践。
如何使用简单的方法使云计算连接到任何设备
在过去几个月我已经尝试了 Weave 和 Docker,最近我想看看我是否可以将我家里使用的树莓派与我工作中操作的 云平台结合起来。理想的情况下,树莓派不一定非得放到家里,而是可以放在任何一个可通过互联网连接的地方。网络问题
网络依然是目前面临的最大难题。我们习惯于传统网络方法,以至于人们很难找到可以解决相应问题的方案。操作系统和网络 都是为应用程序提供服务。现代 UNX 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 平台,非常适合这些云区域之间私人互联自动化类型的场景,并且是免费的。设置大概看起来像下图:
通常你需要设置一些 IPSEC 或 SSL VN 隧道来连接环境,但是涉及的烦人配置步骤只是为了得到一个私人互联。幸运的是云区域已经在 3 层对互联加密了。真正的问题开始于当你需要把流量路由到远程主机或者是有多个网关直接连通公共和内部网络的时候(像在服务器 2)。甚至对我来说,我已经专业于主机和网络的业务 20 年之久,这意味着我必须在它上面思考和工作以确保正确设置路由。太浪费时间并让我非常的失望。
一个使用 Docker 和 Weave 的解决方案
使用Docker 可以创建微服务或者是在容器中运行成熟的 Linux 发行版,这里有非常多的管理选项处理它们,但这次我不会讨论它。Weave 是一个为跨主机的容器提供虚拟网络的工具。在这里,我们主要使用了其两个主要特性:
- 为多主机上的容器规划同一子网的功能(虚拟 2 层有效广播域)
- 为 Docker 容器提供连接到 Weave 网络的自动路径发现
在设置完 Weave 后,解决方案看起来像这样:
在从服务器 1 到服务器 3 的路径发现上发生了一些神奇的事情:只要服务器之间有一条路径,Weave 就会自动转发数据包。Weave 将从邻居学习 MAC 地址,从这个方式的数据包学习下一跳(next-hop),详情请看 这里。
这么一设置我就可以带着我的 PI 到任何地方,只要我的网络(有状态的 outboud)可以开放 tcp/udp 的 6783 端口,它将一直连接到云设施。
组成
棘手的部分是在树莓派上运行 Docker 和 Weave,因为它需要最新的内核和用户空间以保证可以正常工作。经过在 odroid-u3 的 Ubuntu、Arch Linux 和 树莓派的 Raspbian 上做过几次试验后,我解决了:- 树莓派模型 B
- Raspbian Wheezy 更新到 Jessie 和 3.16 内核(我找不到一个合适的用于 Pi 的 Jessie 镜像)
- 当更新的时候,保证最小的 8GB SD 卡不会耗尽空间,你需要及时发现发现这个问题。
- 一批云虚拟机运行着 Debian Jessie(或者是任何你能运行 Docker+Weave 的系统)
设置树莓派
- 下载 Raspbian Wheezy 并写入你的 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-<version>-rpi
下载 Weave 源码(根据 Weave 文档)并构建它:
$ 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. ... 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 路由的!
在 Docker 中安装实际的应用程序(在我的案例中主要是 owncloud 和 samba),我把这个作为练习留给读者,玩的愉快点!
链接
故障排查
我一路上遇到的问题是使用旧的内核和其他的发行版(不影响最终的配置):- 由于缺少 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/%40ALGrende ... 4376d
来自:http://dockerone.com/article/56