探索中国CIO人才现状 | 第四季调研报告
你将如何缓解容器网络带来的挑战?
2015-09-07  来源:techtarget

容器网络可能造成规模问题,在本文中,网络专家Jeff Loughridge探讨了网络工程师可采用哪些方法来应对这些挑战。

基于软件容器网络对NAT的依赖以及NAT自身的局限性,网络工程师在其基础设施内部署容器时面临一些显著的挑战,但通过了解容器主机如何支持NAT模式可帮助我们避免这些问题。

首先,让我们看看主机如何创建新的网络命名空间(这在概念上类似于MPLS/VPN模型中的虚拟路由和转发实例)以及被称为虚拟以太网(vEth)的特殊网络接口。vEth接口是用于连接命名空间的一对端点,主机将vEth的一端放在默认命名空间用于与外部世界通信,另一端放在新创建的命名空间。

默认命名空间中的vEth被绑定到桥接,例如Docker中的docker0以及LXC中的lxcbr0。主机使用Linux中的iptables来配置NAT以及轻量级动态主机配置协议(DHCP)服务器来分配地址,例如dnsmasq。

规避NAT

幸运的是,我们有技术可避免NAT。Cohesive Networks公司首席技术官Chris Swan在2014年Container Camp会议中谈论Docker网络时将其容器网络哲学恰当地总结为让容器成为“网络的一等公民”。

我们可以直接连接容器到主机的网络接口来实现这一点。容器与主机共享本地区域网络(LAN),它们从LAN的DHCP服务器获取IPv4地址或者使用静态机制。所有4层网络端口完全暴露,虽然这种直接的暴露比管理映射端口更好,但维持强大的安全状态需要纪律性。

直接连接到物理接口的一种方法是桥接vEth端点与面向互联网的物理接口。不过,这种方法需要修改物理端口,即移除IP地址并将其分配到桥接接口。

系统管理员可使用混淆命名的“macvlan”网络类型来连接到物理接口,而不需要使用vEth网络类型。Macvlan类型与IEEE 802.1Q VLAN无关;它可被认为复用多个MAC地址到单个网络接口的方法。Macvlan类型通常部署在桥接模式,实现更简单的桥接,而非传统的学习桥接—不需要学习,生成树协议也没必要。

消除NAT的第二种方法是将主机变成全面的路由器,甚至是使用边界网关协议的路由器。主机会将前缀路由到主机中的容器,每个容器会使用全球唯一的IP地址。在即将耗尽的IPv 4地址空间时代,提供IPv4独特地址显然不太现实。而IPv6让这种主机作为路由器的技术更加简洁;该协议的稀疏寻址模式允许巨大的易于管理的地址空间。

由于3层网络不会受到洪泛影响,它的使用消除了2层网络广播域中创建的大量故障域。你是否经历过数据中心范围的网络危机?单个以太网广播域几乎肯定遭遇过生成树故障或者其他洪泛相关的事件。

挑战:MAC地址的扩散

然而,连接容器接口到外部网络带来新的挑战:数据中心网络中大量可见的MAC地址。顶级机架(ToR)交换机可支持的MAC地址数量各有不同,但可处理更多MAC地址的交换机(而不会洪泛所有帧)花费更多。当MAC地址超过限制时,主机中的物理网络接口卡也可切换到混杂模式,这会降低性能。

在直接连接到主机物理接口的容器之间我们如何实现终端到终端的可达性,而不会让ToR交换机中2层网络转发表受到影响?2014年年底Linux内核中推出的ipvlan功能也许是答案。Macvlan驱动程序是使用MAC地址作为解复用器,而ipvlan驱动程序则是使用3层网络(IP)地址。当ipvlan驱动程序部署在L3模式时,容器MAC地址不会暴露在网络。只有物理接口的主机MAC地址在网络中可见。

Linux内核3.19中有ipvlan功能,但更稳定的功能出现在4.0-rc7及更高版本。在截至写这篇文章的时候,你将需要编译定制的内核来尝试ipvlan,因为Linux版本使用更旧更稳定的内核。

挑战:大规模vEth网络类型

最后,虽然在大多数容器环境可能不太明显,但为大规模部署使用vEth网络类型可能损害容器网络性能。谷歌公司Victor Marmol在其《容器和容器集群中的网络》的谈话中,他描述了其公司在使用vEth网络类型时,性能比默认命名空间降低了50%。

Macvlan和ipvlan功能消除了vEth网络类型所需要的一些处理工作,内核开发人员Eric W.Biederman将macvlan描述为“简单、愚蠢和快速”,而在ipvlan驱动程序中性能得到保持,期望在未来看到macvlan和ipvlan驱动程序在性能方面的改进。