【技巧】一条命令取代etcd+flannel,全网贯通无需端口映射


【编者的话】 我是吴健,来自上海Hypers 国内顶尖的大数据分析公司,参加过“云雀Docker巨好玩”并获得一等奖,年纪尚小请大家多多指教。因为有人提出了这个想法,我之前已经成功实践过这些实验,自己也就把百度和Google不到的私房菜贡献出来,只有一个要求,希望大家互相帮助,不要自吹自擂就行,多多分享。

因为我是思科CCNP认证,天生的网络达人,所以才能想出这样的解决方案。顺便向大家推荐下云雀平台Daocloud。希望大家互相扶持,互相帮助,与DockOne&OSChina还有所有的开源社区一起推动国内的Docker商用和技术能力。

本人保证发的文章都是原创,如被商业用途请联系我。

我的部署环境如下:
  1. 只要能跑Docker的主机都没问题 两台虚拟机
  2. VM1=虚拟机1 VM2=虚拟机2
  3. 一台带RIP功能的家用路由器
    ###技术介绍
    改变桥接网卡(Docker0)的IP地址,默认为172.17.42.1/16。你这图不错借来用用 @冯明振
    1.png

    如上图所示。VM1的Docker0网桥地址为172.17.1.254/24,VM2的Docker0网桥地址为172.17.2.254/24。


从容器1到容器2所拥有的Docker0桥下的IP地址无法互相通信。VM1的eth0也无法访问VM2的docker0,VM2也是彼此彼此。

但通过设定静态路由的方法就可以解决这个问题。你另外张图也不错借来用用 @冯明振。
2.png

设定静态路由的方法如下:
VM1#route add -net 172.17.2.0 netmask 255.255.255.0 gw 10.10.103.92
VM2#route add -net 172.17.1.0 netmask 255.255.255.0 gw 10.10.103.91

这样容器1和容器2就能互相访问,VM1也能访问VM2的docker0,同样VM2有是如此

但问题来了!

如果有10台host都需要这样配置的话,每台host上就要敲九条路由信息
如果批量部署的情况下是自寻死路,根本无法管理。所以我想到了使用“动态路由”来让主机与主机之间互相学习对方的网段。

Linux上安装路由器的软件名为Quagga,它可以配置很多种企业级的动态路由协议。我使用的是RIPV2和OSPF同时开启,但安装Quagga的方法和配置命令,太过于繁琐。所以我将Quagga Docker化了。

下载quagga路由器

docker pull index.alauda.cn/georce/router

启动路由器

首先请确定你的所有的docker0网桥不在同一个网段!!!如:
VM1#ifconfig docker0 1.1.1.1/24
VM2#ifconfig docker0 2.2.2.2/24


VM1#docker run -itd --name=router --privileged --net=host index.alauda.cn/georce/router
VM2#docker run -itd --name=router --privileged --net=host index.alauda.cn/georce/router

就算过几分钟后你也看不出任何变化,但请你查看你的路由表。
VM1或VM2#route -n或者ip route


是不是出现了别的docker0的路由信息?请让容器1 ping下容器2,发现ping成功。

成功的人别太高兴,还有惊喜

让局域网里的Windows平台也直接访问容器1和容器2。首先我登陆了自己家的家用路由器,100块钱淘宝买的。查看路由表并没有开启RIP协议。
router1.jpg

开启RIPV2后发现家用的路由器已经学到了Docker路由器广播出来的路由条目:
router2.jpg

此时你应该可以PING通Docker0的私有IP地址。

访问Nginx容器

docker run -itd --name=nginx index.alauda.cn/library/nginx

router3.jpg

Ping一下试试:
router6.jpg

浏览器访问一下呢?
router4.jpg

17 个评论

赞原创。
田工 你想哭吗?
记得在InfoQ看到过 大众点评的高级工程师分享了从KVM转到docker的网络配置方法
http://www.infoq.com/cn/presentations/build-paas-platform-based-on-docker
多谢 陈艺华 实践中发现privileged 变成s的笔误
有些应用不能跨三层,所以这种网络方式还是有局限性的
Georce

Georce 回复 lethe

这也没办法 不过这种应用毕竟是少数而且肯定是不太适合部署在docker上的
学习了,我们最早实现就是类似这篇文章的前半段,但是让server自己学习网段确实没有想到~
确实不错,近期正好要搭建测试系统,实践一下,收了,多谢
Georce

Georce 回复 Kuhn

多多学习多多分享
Quagga这么神奇啊?
总实验的情况来看这个方案确实方便,但是有个问题,当管理的机器多的时候,比如 1000 台,由于 ospf 协议算法决定的,小的抖动都会网络的大变化,但是分区划分网络就失去了灵活性和方便性,不知道作者是否对于这样的情况的有测试?
Georce

Georce 回复 -10

你先能开1000台VM给自己看看再说
楼主实践的很好,像我这种不太懂网络的就会想着按部就班的etcd+flannel,支持楼主的原创加分享精神,为楼主点赞。
赞。假如宿主机有两个网段,一个作为内网,一个作为外网访问,怎么设置走内网?虽然走外网也能通。
flannel 坑有点多 目前发现进程没挂掉的情况下网络经常有故障 。。。
有没有考虑过如果跨机房或者跨地域呢??是不是可以拿BGP实现嘞????
这个镜像看来docker hub 没有保存过啊

要回复文章请先登录注册