上周三下午,某金融客户反馈虚拟机之间跨VLAN通信突然中断,但物理链路监控一切正常。运维同事反复检查交换机配置,折腾两小时没定位问题——最后发现是OpenStack Neutron的ML2插件里一个被误删的type_driver配置项,导致VLAN网络类型无法注册。
先看几个高频症状
网络虚拟化环境出问题,往往不像传统网络那样有明显告警。常见表现包括:
- 新建虚拟机无法获取IP(DHCP请求发出去,没响应)
- 同宿主机内VM能通,跨宿主机就丢包
- SDN控制器界面显示节点在线,但流表下发失败
- 容器Pod间通信时好时坏,且无规律
这些现象背后,可能横跨虚拟交换机、隧道封装、控制平面同步、元数据服务多个层面。
分层排查思路更省力
别一上来就翻Neutron日志或抓OVS流表。建议按“控制面→数据面→业务面”顺序快速过一遍:
1. 控制面是否在线?
以OpenDaylight或ONOS为例,先确认控制器集群状态:
curl -X GET http://controller:8181/restconf/operational/network-topology:network-topology返回401或空JSON?说明认证失败或REST接口未启用;返回503?大概率是ZooKeeper连接超时或集群脑裂。
2. 数据面是否连得上?
OVS虚拟交换机如果没和控制器握手成功,所有流表都是空的。登录宿主机执行:
ovs-vsctl show | grep -A 5 "Manager"看到 is_connected: false?立刻查防火墙:iptables -L INPUT | grep 6653。很多公司安全策略默认禁了OpenFlow端口,却忘了在虚拟化节点放行。
3. 业务面是否真断?
别轻信ping结果。某次故障中,ICMP能通,但TCP 80端口始终拒绝连接——最后发现是Linux内核参数 net.bridge.bridge-nf-call-iptables=1 被误设,导致iptables规则意外拦截了桥接流量。
三个容易踩坑的细节
① MTU不一致:物理网卡MTU设为9000(jumbo frame),但VXLAN隧道里没调大外层IP头的MTU,结果大包被静默丢弃。用 tcpdump -i any 'ip[2:2] > 1500' 抓包一眼就能识别。
② 时间不同步:Kubernetes + Calico环境中,节点时间偏差超500ms,BGP会话频繁震荡。用 chronyc tracking 检查偏移量,比看日志快得多。
③ 元数据服务失效:OpenStack里metadata agent挂了,虚拟机拿不到SSH密钥或自定义脚本。检查 systemctl status neutron-metadata-agent,再确认/var/log/neutron/metadata-agent.log里有没有 ConnectionRefusedError —— 很可能是nova-api服务端口监听错了地址。
工具链别只靠日志
除了journalctl -u openvswitch这类常规命令,试试这些轻量级手段:
- 查OVS流表匹配计数:
ovs-ofctl dump-flows br-int | grep -E "(priority=100|actions=drop)" - 验证VXLAN隧道连通性:
ovs-appctl fdb/show br-tun | grep "dst" - 检查Neutron端口绑定状态:
neutron port-show <port-id> | grep binding
某次VLAN隔离失效,就是binding:vif_type显示为unbound,顺藤摸瓜发现libvirt没加载vhost_net内核模块。