CNUTCon2016 已经落下帷幕,但是其精彩内容我们还在久久回味。今天小数为大家带来的是数人云CTO 肖德时在容器大会上的演讲实录,从理论说起,将实践进行到底,让我们一起来探讨容器网络的问题以及解决:)
Mesos 是数人云的主要的技术栈之一,并且我们很早就开始在实践 Mesos 应用。从数人云的角度,我们希望容器的快速分发能够帮助客户实现快速交付。现在 Mesos 社区的发展非常快, Mesos 有一个重要的特性 Unified Container ,让 Mesos 可以交付容器。而接下来有一个更热的话题—— 一容器一 IP ,在当前容器圈用网络方案如何解决这个问题,大家各显神通,但是真正能把网络和容器说清楚的并不是特别多,结合数人云长时间的积累和实践,在这里我想跟大家一起探讨容器的网络以及 Mesos 的解决方案,为大家提供一个参考。
Mesos 的网络问题
Mesos 1.0 其实已经有了一个完整的容器 Interface 的规范, CNCF ( Cloud Native Computing Foundation )提供了 Container Network Interface 的接口,希望在 Mesos 社区里规范网络的使用,让大家有一个接口能够复用网络。刚刚发布的 Mesos 1.0 会遇到一些问题。最常见的就是我们无法逾越的一容器一 IP ,对于这个问题大家都有各自的看法,但是 Mesos 的过程里面是 sandbox ,是没有 IP 的概念的,所以要思考如何用容器的方式获得 IP 。
第二,有了 IP 接着会出现服务发现的问题,什么是服务发现?最简单的是 DNS ,一个名字对多个 IP 。第三,有了网络之后,所有的数据之间有了联系,它们之间如何隔离是一个问题。例如,有一个数据库专门为业务 A 使用,另外一个数据库供业务 B 使用,就有两个 Wordpress ,这两个多租户之间没有任何的联系,我们希望它们之间的网络是隔离的, Mesos 有一个可以让大家立即使用的解决方案是 Calico 这个项目,虽然也有商业的公司在做这个项目,但是它的源码和思想是可以被复用的,所以我这次主要是与大家分享一容器一 IP 实现的方式。
实现一容器一 IP 为什么选择 Calico ?
互联网公司普遍是内存比较小但机器比较多,常常一两千台机器;但有的传统企业用的是大型机或者用的机器都比较大,他们的机器四五台机就能组成一个网络,内存比较多,一台机器可以跑两三百个容器,四五台机器能跑几千个容器,这就是 Clico 和一些第三方的解决方案要解决的问题——管理 IP 的网段,因为 IP 地址是有限的,并且真实的网段是一套,而所有的这些分的 IP 的网段也是真实的,要去管理它的冲突。现在大家想到的是自己搞一个 IP 的管理界面,对 IP 进行管理把它固定住,但当容器越来越多的时候,就会有很多问题。
针对数据中心东西向的解决方案, Calico 提出的一种方法是基于 BGP 协议。 BGP 协议是对路由规则进行控制,也就是说在没有 MAC 地址的情况下,路由有路由表,路由表多了以后有两件事,第一是要广播,第二是这个路由表大了,软件模拟的方式会有性能瓶颈,并且还要做精细化的访问控制。因为两个网段之间用的虚拟网段,有可能会冲突,一两个网段的时候可能没有问题,当几十个 APP 之间隔离的时候两个虚拟网段用的可能是同样的 IP 地址,要保证它们两个不通,如果通的话还要保证两个 IP 不能冲突。那么有没有更好的方式?有,就是 MAC Vlan ——用主机的方式管理虚机。
这与 Host 的模式(不用自己的虚拟网络,用原生的主机模式网络)相比,只是加了一层 MAC 地址的管理。但是它有一个比较大的问题是对硬件有依赖,因为 MAC 是要转 IP 的,而 IP 地址一定是有限的, MAC 地址也是有限的,如果有冲突都是靠硬件来控制的,它并不能很轻易地上云,云端 MAC 地址不受控制,基本上是在私有云的基础上用 MAC Vlan 的方法去做。对于 Mesos 的解决方案我们希望的是通用型的,有一个网络标准 CNI , Calico 是比较灵活的而有保障的。这是今天推荐这样一个方案的原由。
网络很复杂,讲讲基本功
Doker 非常好用,但是 Doker 内置 Swarm 的特性, Doker Swarm 就是两行命令就能创建的网络,非常简单。这个网络非常适合在测试环境和在单机的模式下调试网络,它有自己的 DNS 、名字、网络 IP ,也可以自己管理,非常方便。但是到了生产级别用网络 Mesos 容器方案的时候, Calico 这个方案可以帮助大家更好地理解和解决这个问题。
Calico 是如何做的?
这里它做了一个小小的手术,因为网络结构越复杂,要对封包做的越多,在这个网段里面跳一下的时候需要给消息包头打个标签, IP 要打不同的标签,才能到那个网络里面。它做了一个权衡,认为网络不要太多,可能就是一百台机器的规模,因为有 ARP 广播,广播风暴在网络里面非常常见, Mesos 本身又不管网络。 Calico 现在的做法就是在中间加了一个 Route Reflector 。 BIRD 也是第三方的,是 Linux 路由表的一个存储,它利用第三方的存储来存储自己的路由规则,然后保证这个路由规则能够被其它方主动去抓,这样就从原来推的方式变成抓的方式,简单地解决了这个问题。 Mesosphere 就是参考这个实现了一套类似于 Calico 的网络方案,叫 Minuteman ,也是开源的,在 open dcos 上面有这样一个方案,大家可以去参考。这个就是 Calico 具体的实现。
Mesosphere 最新的做法,是用的 Erlang 的模型做了一个 P2P 的网络结构。好处在于可以点对点地刷路由,也就是说这两台机器的应用之间有关联才去刷,如果没有关联,像 Calico 就刷一次,每个表都要刷,因为它不知道用户会不会在下一秒去启动新的容器,所以这种结构是传统的网络结构。但是 Mesosphere 的 Minuteman 做法就更先进一点,它的做法就是点对点地去刷,容器起来的时候去刷,局限性是只能在一个数据中心里面做这件事,因为它是一个实验型的项目,我们尚不清楚它的性能和规模,仅在此与大家分享一下。谢谢大家。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.