在OpenStack方面也工作了一年多了,有一点点心得。终于有时间记录下来,希望对别人能有一点点帮助。不对的地方请赐教,我先谢了。
下面我简单介绍一下Neutron网络从虚机到默认网桥br-int的路径和涉及到的一些概念,这样有助于对Neutron安装中问题的调试。简单来说,虚机的网卡会连接到一个由Neutron创建的Linux Bridge上,然后通过一对veth pair连接到OpenVSwitch(ovs)的bridge(一般默认为br-int)上。根据您的配置,从br-int上又可以连接到外部网络或者其他OpenStack tenant network。为什么要用一个Linux Bridge,而不是ovs bridge,是因为Neutron的Security Group机制使用的iptables技术,它只能用在Linux Bridge上。
1. 找出虚机(demo9)的ID
[root@ip]# nova show demo9
+--------------------------------------+------------------------------------------------------------+
| Property | Value |
+--------------------------------------+------------------------------------------------------------+
| OS-DCF:diskConfig | MANUAL |
| OS-EXT-AZ:availability_zone | nova |
| OS-EXT-SRV-ATTR:host | x.x.x.x |
| OS-EXT-SRV-ATTR:hypervisor_hostname | x.x.x.x |
| OS-EXT-SRV-ATTR:instance_name | instance-00000009 |
2.用虚机的ID找出网卡的ID。虚机的网络配置可以从libvirt的配置中读到。
[root@ip]# cat /etc/libvirt/qemu/instance-00000009.xml|grep -b3 tap
2523- <interface type='bridge'>
2553- <mac address='fa:16:3e:37:c0:2b'/>
2594- <source bridge='qbr6298f624-95'/>
2634: <target dev='tap6298f624-95'/>
2671- <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
2753- </interface>
2770- <serial type='file'>
[root@ip]# brctl show
bridge name bridge id STP enabled interfaces
qbr6298f624-95 8000.aa9a367d02ec no qvb6298f624-95
tap6298f624-95
4.qvbxxx和qvoxxx形成了一个veth pair。veth pair是两个连接在一起的端口,就像一根铜线,从一个端口进入的数据,会从另外一端出来。
[root@ip]# ip -d link show|grep -b3 6298f624-95
1026- link/ether d2:07:58:f8:11:3f brd ff:ff:ff:ff:ff:ff
1081-20: tep2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN
1163- link/ether c6:af:e2:f7:3f:da brd ff:ff:ff:ff:ff:ff
1218:23: qbr6298f624-95: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN
1310- link/ether aa:9a:36:7d:02:ec brd ff:ff:ff:ff:ff:ff
1365:24: qvo6298f624-95: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
1472- link/ether 8a:5c:1c:6c:81:12 brd ff:ff:ff:ff:ff:ff
1527- veth
1537:25: qvb6298f624-95: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
1644- link/ether aa:9a:36:7d:02:ec brd ff:ff:ff:ff:ff:ff
1699- veth
1709:26: tap6298f624-95: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 500
1812- link/ether fe:16:3e:37:c0:2b brd ff:ff:ff:ff:ff:ff
如果不太清楚veth pair的配对,可以用ethtool找出另外一端的ID号(例如 25: qvb6298f624-95)
[root@ip]# ethtool -S qvo6298f624-95
NIC statistics:
peer_ifindex: 25
5.veth pair的一端最后接在了br-int上。
[root@ip]# ovs-vsctl show|grep -b3 6298f624-95
1001- Port br-int
1021- Interface br-int
1050- type: internal
1081: Port "qvo6298f624-95"
1111- tag: 1
1130: Interface "qvo6298f624-95"
1169- Bridge br-tun
1187- Port "gre0"
1207- Interface "gre0"
了解了Neutron网络的路径,有利于我们排查网络路径上的问题。假定我们给虚机分配的IP为10.0.20.2/24。将一个不用的IP付给所在linux bridge即可ping通虚机。
[root@ip]# ifconfig qbr6298f624-95 10.0.20.100/24
[root@ip]# ping -c3 10.0.20.2
PING 10.0.20.2 (10.0.20.2) 56(84) bytes of data.
64 bytes from 10.0.20.2: icmp_seq=1 ttl=64 time=3.93 ms
64 bytes from 10.0.20.2: icmp_seq=2 ttl=64 time=0.572 ms
64 bytes from 10.0.20.2: icmp_seq=3 ttl=64 time=1.73 ms
另外利用Neutron提供的neutron-debug工具也可以检查tenant网络的连通性。neutron-debug可以在指定的网络中加入测试端口(probe),用来执行命令。probe创建后的ID可以从probe-list中得到。
[root@ip]# export NEUTRON_TEST_CONFIG_FILE=/etc/neutron/l3_agent.ini
[root@ip]# neutron-debug probe-create 9f6b9038-6738-4222-ba2e-84304a182c38
[root@ip]# neutron-debug probe-exec e84d33b8-9230-485b-8988-cc8090173499 'ping -c3 10.0.10.2'
PING 10.0.10.2 (10.0.10.2) 56(84) bytes of data.
64 bytes from 10.0.10.2: icmp_seq=1 ttl=64 time=0.086 ms
64 bytes from 10.0.10.2: icmp_seq=2 ttl=64 time=0.069 ms
64 bytes from 10.0.10.2: icmp_seq=3 ttl=64 time=0.093 ms
参考文章