利用OpenVSwitch在多台主机上部署Docker的教程
Docker  /  管理员 发布于 4年前   256
【编者的话】当你在一台主机上成功运行Docker容器后,信心满满地打算将其扩展到多台主机时,却发现前面的尝试只相当于写了个Hello World的入门程序,多主机的网络设置成了下一道门槛。在你尝试各种方案时不妨先看看本文,或许就会豁然开朗,发现原来也不复杂。嗯,是的,本文用到了 OpenVSwitch。
运行Docker已经不是什么新鲜事,网上有很多入门教程来帮助你在一台主机上运行容器。这台主机可以是Linux服务器,也可以是Mac(借助类似boot2docker的项目)。
在多台主机上运行却是另外一回事……
可选方案:
分别在每台主机上运行Docker,在公网或内网网卡上暴露端口以便容器间相互通讯。这可能比较麻烦,而且会引发安全问题。
运行类似Weave的中间层方案来完全地抽象网络。这个项目前景不错,不过还太年轻,尚未与compose(之前的fig)或maestro-ng这类编排工具整合。
运行类似Deis或Flynn的Docker多主机一站式方案。这可能不在你的考虑范围内。
在主机间的网状网络中创建一个共享网桥,让Docker服务在那运行容器。这听起来有点复杂,不过……本文中我们将看到这可以非常容易地完成!
概述
基本上,我们将执行以下步骤:
就是这样。重启服务或重启服务器后,你将获得一个具备连接冗余(link redundancy)的全网状网络,Docker服务可以在专用的IP范围(不会重叠)上运行容器,并且不需要在公网或内网网卡上暴露所有端口就能互联。很棒,对么?
技术
简单列一下我们用到的技术:
我们将假定服务器运行的是Ubuntu Server 14.04.02 LTS x64,对于其它系统,你可能需要修改下面提供的各项配置。
安装
Docker
无需多言,遵循官网提供的指南就行。稍后我们将深入其配置,以便运行于服务器上的不同Docker服务可相互协作。
OpenVSwitch
糟糕的是,默认仓库里OpenVSwitch安装包不可用(或过期了),我们需要自己构建.deb文件(一次),然后分发给不同主机。为了保持生产机的整洁,可另外找台小主机来安装开发包,并构建安装包。
OpenVSwitch GitHub上有详细的构建手册。
执行下列命令来构建安装包(新版请按要求修改):
#获取最新存档wget http://openvswitch.org/releases/openvswitch-2.3.1.tar.gztar xzvf openvswitch-2.3.1.tar.gzcd openvswitch-2.3.1#安装依赖sudo apt-get install -y build-essential fakeroot debhelper \ autoconf automake bzip2 libssl-dev \ openssl graphviz python-all procps \ python-qt4 python-zopeinterface \ python-twisted-conch libtool# 构建(不使用并行检查)DEB_BUILD_OPTIONS='parallel=8 nocheck' fakeroot debian/rules binary# 得到最新deb文件并复制到某处cd ..ls -al *deb
现在你有了新的.deb安装包,接下来将其推送并安装到所有主机上。
# 复制包到各主机并ssh登录scp -r *deb user@remote_host:~/.ssh user@remote_host# 安装一些依赖(后面需要)并安装包sudo apt-get install -y bridge-utilssudo dpkg -i openvswitch-common_2.3.1-1_amd64.deb \ openvswitch-switch_2.3.1-1_amd64.deb
配置
网络
你可以使用OpenVSwitch提供的不同命令行工具来构建网状网络(比如ovs-vsctl),不过Ubuntu提供了一个辅助工具让你可以通过/etc/network/interfaces文件定义网络。
假定三台主机:1.1.1.1、2.2.2.2和3.3.3.3,可以通过上述IP相互ping通,它们是在公网或内网上并不重要。host1的/etc/network/interfaces大概如下。
...# eth0、eth1和lo配置...# auto:为了有效地在主机启动时启动它# br0=br0:防止在`ifquery --list`时被找到auto br0=br0allow-ovs br0iface br0 inet manualovs_type OVSBridgeovs_ports gre1 gre2ovs_extra set bridge ${IFACE} stp_enable=truemtu 1462# 没有auto,这是ovs的一个额外配置# 两台主机的gre名字必须相符allow-br0 gre1iface gre1 inet manualovs_type OVSPortovs_bridge br0ovs_extra set interface ${IFACE} type=gre options:remote_ip=2.2.2.2allow-br0 gre2iface gre2 inet manualovs_type OVSPortovs_bridge br0ovs_extra set interface ${IFACE} type=gre options:remote_ip=3.3.3.3# auto:启动时创建# 定义docker要使用的docker0,并(在可用时)连接到到OpenVSwitch创建的br0网桥上# 每台主机需要使用不同的IP地址(不要相互冲突!)auto docker0=docker0iface docker0 inet staticaddress 172.17.42.1network 172.17.0.0netmask 255.255.0.0bridge_ports br0mtu 1462
在其它主机上要对这个配置上做些调整:remote_ip的IP地址要相互配对。
几点说明:
如果现在重启服务器,你将拥有一个具备冗余的网状网络,你可以运行以下命令来测试:
Docker
我们现在有了一个完善的网络,每个Docker服务都可以将它们的容器挂接到docker0网桥上。让Docker自动完成这步不是很棒么?答案在于Docker有能力分配一个最小的IP地址池!
对于该示例,我们假定:
如果你的主机多于3台,你需要细分一个每个范围,或根据组织需要对整个网络拓扑结构进行重新考虑。
host1的配置文件(/etc/default/docker)是这样的:
BRIDGE=docker0CIDR=172.17.64.0/18wait_ip() {address=$(ip add show $BRIDGE | grep 'inet ' | awk '{print $2}')[ -z "$address" ] && sleep $1 || :}wait_ip 5wait_ip 15DOCKER_OPTS="-H unix:///var/run/docker.sock-H tcp://0.0.0.0:2375--fixed-cidr=$CIDR--bridge $BRIDGE--mtu 1462"
你可以根据需要修改DOCKER_OPTS配置,添加镜像、不安全的registry、DNS等等。
说明:
结语
重启一下(至少保证启动时所有东西都会自动上线)。
你可以试试以下命令看看一切是否正常。
# 访问host1ssh user@host1# 运行一个新容器docker run -ti ubuntu bash# 检查IP(在容器内运行)ip add | grep eth0## 在其他窗口中## 访问另一台主机(host2或3)ssh user@host2# 运行一个新容器docker run -ti ubuntu bash# Ping其他的容器!ping $IP
这不是一份指导如何在多主机上设置Docker的权威指南,欢迎大家提出批评(译者注:译稿也一样,请大家多多指正)。很多想法是在整体安装时产生的,本文尽可能详细地说明了为何选择这个或那个选项。
如果将分级网桥、VLAN等包括进来,事情将更复杂,不过那超出了本文的范围。;)
显然,更完整的网络是有需求的,而且看起来这个已经在开发中。
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号