容器可能部署在云上(公有云或者私有云),也可能部署在数据中心物理宿主机上。云的场景涉及到虚拟网络,数据中心场景就是传统的物理网络,这些环境的网络架构以及底层技术有着很大的差异,这一节分析下。

      不管是云的场景还是传统的数据中心场景,部署容器的宿主机之间的网络,抽象归纳起来需要具备下面的两个条件:

  • 可以通过二层交换机、或者三层路由器互相访问。
  • 源容器的“原始IP包”,经过中间的各个虚拟的还是物理的设备(veth、bridge、tun等)、节点(交换机、路由器等),不会因为一些原因被修改、丢弃,及时的送到目的容器。

     那么,如何满足这两个条件,即本节所讨论的:容器对底层网络环境的要求。

 

     这第一个条件,比较容易满足:

  • 二层互通,宿主机在同一物理网络VLAN、或者同一虚拟网络VXLAN。通过mac地址+vlanID,或者mac地址+vniID寻址转发。
  • 三层互通,宿主机在不同网络。物理网络的路由器,云平台虚拟网络的SDN,通过路由、或者流表转发互通。

   

 这第二个条件,“原始IP包”不能被丢弃、修改,及时送到目的地(这里就不要求可靠性吗?),咋看起来真有点挑战性。

我们先来具体分析下不同的容器网络方案中,这个“原始IP”包经过中间网络过程中,是如何一层层封装的。

kubernetes容器底层网络要求

 

   如图所示,“原始IP包”,经过veth-pair到达宿主机协议栈,再经过udp、vxlan、Ip-tunnel封装路由,最后由宿主机的物理设备eth0发出,显然封装的报文payload可能的最大长度已经超出了以太网数据帧最大payload值1500,由此可能会产生两个问题:

  • “原始IP包”被分片,目的容器收到端片的报文。
  • 路径MTU装不下封装后的报文,报文被丢弃。

   

 

 

 

相关文章:

猜你喜欢
相关资源
相似解决方案