1. MTU配置问题
1.1. 问题描述
A、B、C实例网卡均使用同一VPC中的内网IP,且绑定了EIP。A、B实例所在宿主机不同,A、C实例在同一宿主机中,现象如下:
1)A、B、C实例的EIP相互ssh,登录正常;
2)在A、C实例的VPC内网IP相互ssh,登录正常;
3)在A、B实例的VPC内网IP相互ssh,登录超时;
1.2. 排查过程
1、查询ssh登录失败的debug信息
# ssh -vvv “VPC内网IP”
2、查询网卡mtu配置
# ifconfig ethX
3、修改mtu值
# ifconfig ethX mtu 1450 up
4、ssh登录
# ssh “VPC内网IP”
1.3. 问题分析
OpenStack Neutron 支持使用两种隧道网络技术 通用路由封装(GRE) 和 VxLAN 来实现虚拟的二层网络。这两种技术都需要使用 OpenStack 在计算和网络节点上建立隧道来传输封装的虚机发出的数据帧:
当前IaaS平台采用的是VxLAN技术,主要用于封装、转发2层报文。VxLAN 全称Virtual eXtensible Local Area Network,简单的说就是扩充了的 VLAN,其使得多个通过三层连接的网络可以表现的和直接通过一台一台物理交换机连接配置而成的网络一样处在一个 LAN 中。
VxLAN实现机制:
将二层报文加上个 VxLAN header,封装在一个 UDP 包中进行传输。VxLAN header 会包括一个 24 位的 ID(称为VNI)。
特点:
l VNID:24-bits,最大 16777216。每个不同的24-bits VNI 代表一个 VxLAN 网段。只有同一个网段中的虚机才能互相通信。
l VxLAN Port:目的UDP 端口,默认使用 4789 端口。用户可以自己配置。
l 两个 VTEP 之间的 VxLAN tunnels 是无状态的。
l VTEP 可以在虚拟交换机上,物理交换机或者物理服务器上通过软件或者硬件实现。
l 使用多播来传送未知目的的、广播或者多播帧。
l VTEP 不可以对 VxLAN包分段。
VxLAN网络设备主要角色:
(1)VTEP(VxLAN Tunnel End Point):直接与终端设备比如虚机连接的设备,负责原始以太报文的 VxLAN 封装和解封装,形态可以是虚拟交换机比如 Open vSwitch,也可以是物理交换机。
(2)VxLAN GW(VxLAN Gateway/二层网关):用于终结VxLAN网络,将VxLAN报文转换成对应的传统二层网络送到传统以太网络,适用于VxLAN网络内服务器与远端终端或远端服务器的二层互联。如在不同网络中做虚拟机迁移时,当业务需要传统网络中服务器与VxLAN网络中服务器在同一个二层中,此时需要使用VxLAN二层网关打通VxLAN网络和二层网络。如下图所示,VxLAN 10网络中的服务器要和IP网络中VLAN100的业务二层互通,此时就需要通过VxLAN的二层网关进行互联。VxLAN10的报文进入IP网络的流量,剥掉VxLAN的报文头,根据VxLAN的标签查询对应的VLAN网络(此处对应的是VLAN100),并据此在二层报文中加入VLAN的802.1Q报文送入IP网络;相反VLAN100的业务流量进入VxLAN也需要根据VLAN获知对应的VxLAN网络编号,根据目的MAC获知远端VTEP的IP地址,基于以上信息进行VxLAN封装后送入对应的VxLAN网络。可见,它除了具备 VTEP 的功能外,还负责 VLAN 报文与 VxLAN 报文之间的映射和转发,主要以物理交换机为主。
(3)VxLAN IP GW(VxLAN IP Gateway/三层网关):用于终结 VxLAN 网络,将 VxLAN 报文转换成传统三层报文送至 IP 网络,适用于 VxLAN 网络内服务器与远端终端之间的三层互访;同时也用作不同VxLAN网络互通。如下图所示,当服务器访问外部网络时,VxLAN三层网关剥离对应VxLAN报文封装,送入IP网络;当外部终端访问VxLAN内的服务器时,VxLAN根据目的IP地址确定所属VxLAN及所属的VTEP,加上对应的VxLAN报文头封装进入VxLAN网络。VxLAN之间的互访流量与此类似,VxLAN网关剥离VxLAN报文头,并基于目的IP地址确定所属VxLAN及所属的VTEP,重新封装后送入另外的VxLAN网络。可见,具有 VxLAN GW 的所有功能,此外,还负责处理不同VxLAN 之间的报文通信,同时也是数据中心内部服务向往发布业务的出口,主要以高性能物理交换机为主。
VTEP寻址:
每个 VTEP 包含两个 VxLAN 隧道。VTEP-1 收到二层ARP 帧1(A 要查找 B 的 MAC) 后,发出一个 DstIP 地址为VTEP多播组 239.1.1.1 的VxLAN 封装 UDP 包。该包会达到 VTEP-2 和 VTEP-3。VTEP-3收到后,因为目的 IP 地址不在它的范围内,丢弃该包,但是学习到了一条路径:MAC-A,VNI 10,VTEP-1-IP,它知道要到达 A 需要经过 VTEP-1 了。VTEP-2 收到后,发现目的 IP 地址是机器 B,交给 B,同时添加学习到的规则 MAC-A,VNI 10,VTEP-1-IP。B 发回响应帧后,VTEP-2 直接使用 VTEP-1 的IP 直接将它封装成三层包,通过物理网络直接到达 VTEP-1,再由它交给 A。VTEP-1 也学习到了一条规则 MAC-B,VNI10,VTEP-2-IP。
环境中VxLAN组网
逻辑 VxLAN Tunnel:建立在物理的 VxLAN 网络之上,向虚机提供虚拟的二层网络,以 VNID 做区分。
VTEP (VxLAN Tunnel End Point):对虚机的二层包封装和解封。
数据流向:
发送端:
1)计算目的地址:Linux 内核在发送之前会检查数据帧的目的MAC地址,需要选择目的 VTEP。
l 如果是广播或者多播地址,则使用其 VNI 对应的 VxLANgroup 组播地址,该多播组内所有的 VTEP 将收到该多播包。
l 如果是单播地址,如果 Linux 的 MAC 表中包含该 MAC 地址对应的目的 VTEP 地址,则使用它;
l 如果是单播地址,但是 LInux 的 MAC 表中不包含该 MAC 地址对应的目的 VTEP IP,那么使用该 VNI 对应的组播地址。
l 添加Headers:依次添加 VxLAN header,UDP header,IP header。
接收端:
1) UDP监听:因为 VxLAN 利用了 UDP,所以它在接收的时候势必须要有一个 UDP server 在监听某个端口,这个是在 VxLAN 初始化的时候完成的。
2) IP包剥离:一层一层剥离出原始的数据帧,交给TCP/IP 栈,由它交给虚机。
MTU问题:
VXLAN 模式下虚拟机中的 mtu 最大值为1450,也就是只能小于1450,大于这个值会导致 openvswitch 传输分片,进而导致虚拟机中数据包数据重传,从而导致网络性能下降。
计算方法如下:
vxlan mtu =1450 = 1500 – 20(ip头) – 8(udp头) – 8(vxlan头) – 14(以太网头)
通过查看系统网卡配置(虚拟机+物理计算节点),mtu值均为1500,故导致此次问题。
1.4. 解决方案
当前环境使用Overlay网络技术,即在一种网络架构上叠加的虚拟化技术模式,其大体框架是对基础网络不进行大规模修改的条件下,实现应用在网络上的承载,并能与其它网络业务分离,并且以基于IP的基础网络技术为主。Overlay 技术是在现有的物理网络之上构建一个虚拟网络,上层应用只与虚拟网络相关。一个Overlay网络主要由三部分组成:
l 边缘设备:是指与虚拟机直接相连的设备
l 控制平面:主要负责虚拟隧道的建立维护以及主机可达性信息的通告
l 转发平面:承载 Overlay 报文的物理网络
如上图所示,控制平面主机与主机之间建立虚拟隧道依靠VxLAN技术,而物理主机则通过网卡绑定技术提供物理网络连接,通过修改所有物理计算节点bond网卡的配置文件,将mtu值改为9000(大多数设备厂商都支持),可修复此次问题。操作如下:
# vim/etc/sysconfig/network-script/ifcfg-bondX
添加一行:MTU=9000
重启网卡即可。