1. 程式人生 > 其它 >OpenStack學習系列之九:多種網路型別下的例項之間網路通訊問題詳解

OpenStack學習系列之九:多種網路型別下的例項之間網路通訊問題詳解

    OpenStack的neutron元件實現了跨宿主機例項之間的網路分配和通訊功能,其中網路中使用了Linux的網路名稱空間來實現網路的隔離,相關資料可以參考:https://www.cnblogs.com/djoker/p/15974846.html 在OpenStack的部署安裝中,在ens19和ens20兩個物理網絡卡上分別建立了provider和inside兩個網路,這兩個網路型別是一樣的,都是flat網路型別,藉助橋接將物理網絡卡和例項的虛擬網絡卡進行橋接,實現網路通訊。

flat網路型別

    在安裝部署OpenStack時設定網路部分已經添加了兩個網路,分別是provider(繫結網絡卡ens19)和inside(繫結網絡卡ens20),這兩個網路都是flat網路,將例項的虛擬網絡卡和物理網絡卡橋接在一起。在控制節點node1上可以看到兩個橋接網絡卡brqd1e4b37b-ee和brq6f032080-47並分別橋接ens19和ens20。     獲取OpenStack的網路資訊可以看到,brqd1e4b37b-ee對應的網路ID為d1e4b37b-eeb7-4934-aab7-dec537139a3a,而brq6f032080-47對應的網路ID為6f032080-473d-4aa8-8cc3-074f23ecc4dd
[root@node1 ~]# openstack network list
+--------------------------------------+----------+--------------------------------------+
| ID                                   | Name     | Subnets                              |
+--------------------------------------+----------+--------------------------------------+
| 6f032080-473d-4aa8-8cc3-074f23ecc4dd | inside   | 11eec460-caf2-45d1-ad79-432106b07f59 |
| d1e4b37b-eeb7-4934-aab7-dec537139a3a | provider | d439dfdb-8e80-4d30-a415-f7015c2108bc |
+--------------------------------------+----------+--------------------------------------+
    對應關係如下所示:
OpenStack Network ID 網路名詞 宿主機橋接網絡卡 橋接物理網絡卡
d1e4b37b-eeb7-4934-aab7-dec537139a3a provider brqd1e4b37b-ee ens19
6f032080-473d-4aa8-8cc3-074f23ecc4dd inside brq6f032080-47 ens20
    這裡以provider網路為例,檢視provider網路的網路名稱空間,可以通過獲取的OpenStack network的ID來確認為qdhcp-d1e4b37b-eeb7-4934-aab7-dec537139a3a
[root@node1 ~]# ip netns ls
qdhcp-d1e4b37b-eeb7-4934-aab7-dec537139a3a (id: 1)
qdhcp-6f032080-473d-4aa8-8cc3-074f23ecc4dd (id: 0)
    檢視provider網路的名稱空間的網路資訊,可以看到其中的虛擬網絡卡為ns-3e628810-83,同時配置了IP地址為172.16.1.10,這裡的IP地址用於啟動DHCP服務並對外分配IP地址
[root@node1 ~]# ip netns exec qdhcp-d1e4b37b-eeb7-4934-aab7-dec537139a3a ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ns-3e628810-83@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether fa:16:3e:78:a1:95 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.16.1.10/24 brd 172.16.1.255 scope global ns-3e628810-83
       valid_lft forever preferred_lft forever
    inet 169.254.169.254/32 brd 169.254.169.254 scope global ns-3e628810-83
       valid_lft forever preferred_lft forever
    inet6 fe80::a9fe:a9fe/64 scope link 
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fe78:a195/64 scope link 
       valid_lft forever preferred_lft forever
    而對應網路名稱空間內虛擬網絡卡ns-3e628810-83的宿主機上的虛擬網絡卡為tap3e628810-83,可以看到和ens19為橋接在一起
brqd1e4b37b-ee		8000.862a331edfda	no		ens19
							tap3e628810-83
    而provider和inside之所以分別繫結在ens19和ens20兩個網絡卡,是在neutron元件配置中/etc/neutron/plugins/ml2/linuxbridge_agent.ini配置檔案中已經指定。
[linux_bridge] 
physical_interface_mappings = provider:ens19,inside:ens20
    建立兩個例項在不同的計算節點上,網路使用provider網路,當例項執行之後,測試網路通訊和檢視網絡卡橋接狀態     建立兩個例項並檢視網路和執行主機資訊,可以看到test-1例項執行在node4上,而test-2例項執行在node3上
[root@node1 ~]# openstack server list --long
+--------------------------------------+--------+--------+------------+-------------+-----------------------+--------------------------+--------------------------+-------------+-----------+-------------------+-------+------------+
| ID                                   | Name   | Status | Task State | Power State | Networks              | Image Name               | Image ID                 | Flavor Name | Flavor ID | Availability Zone | Host  | Properties |
+--------------------------------------+--------+--------+------------+-------------+-----------------------+--------------------------+--------------------------+-------------+-----------+-------------------+-------+------------+
| 59b013a2-9880-4396-a022-81db284d6f2c | test-1 | ACTIVE | None       | Running     | provider=172.16.1.136 | N/A (booted from volume) | N/A (booted from volume) | m1.nano     | 0         | nova              | node4 |            |
| 8259be88-a207-4c96-bb91-9574c8264034 | test-2 | ACTIVE | None       | Running     | provider=172.16.1.43  | N/A (booted from volume) | N/A (booted from volume) | m1.nano     | 0         | nova              | node3 |            |
+--------------------------------------+--------+--------+------------+-------------+-----------------------+--------------------------+--------------------------+-------------+-----------+-------------------+-------+------------+
    登入test-1例項的控制檯檢視IP地址並測試和例項test-2的網路是可以通行的     此時檢視node4上的網路資訊,橋介面brqd1e4b37b-ee和控制節點上的橋接網絡卡名稱一樣,且ens19和tapb47c3f02-3b為橋接網絡卡。其中tapb47c3f02-3b為虛擬網絡卡對,一段在宿主機上和ens19作為橋接,另一端在例項中。而node3上的網路情況和node4一樣。

bridge name	bridge id		STP enabled	interfaces
brqd1e4b37b-ee		8000.0e9decd1b677	no		ens19
							tapb47c3f02-3b

vlan網路型別

    flat網路型別需要每個網路都繫結一個物理網絡卡,且兩個flat網路型別的網路無法繫結同一個屋裡網絡卡。當例項網路不斷增加時已經無法滿足需求,此時就需要vlan網路型別。vlan網路可以在一個物理網絡卡上新增多個,此時需要物理網絡卡和連線的交換機上的網口配置為trunk介面型別,並允許vlan網路型別的vlan ID。     vlan網型別的配置,在neutron元件的配置中/etc/neutron/plugins/ml2/ml2_conf.ini已經指定,並呼叫網路橋接外掛/etc/neutron/plugins/ml2/linuxbridge_agent.ini。可以看到vlan網路型別呼叫的provider網路,其中vlanID為1001到2000,而provider網路繫結的物理網絡卡為ens19。所以需要調整ens19物理網絡卡對應的交換機網口為trunk口並允許vlan1001到vlan2000可以通過。
# /etc/neutron/plugins/ml2/ml2_conf.ini
[ml2] 
type_drivers = local,flat,vlan,gre,vxlan,geneve
[ml2_type_vlan] 
network_vlan_ranges = provider:1001:2000
# /etc/neutron/plugins/ml2/linuxbridge_agent.ini
[linux_bridge] 
physical_interface_mappings = provider:ens19,inside:ens20
    在Dashboard新增vlan網路中新增vlan網路。需要在管理員選單下的網路頁面中完成新增網路的操作。     建立網路輸入名稱、專案和網路型別,這裡選擇vlan,物理網路就是provider,會自動查詢到網絡卡ens19,vlanID為1001,需要在範圍1001到2000中。     輸入網路地址172.17.0.0/24,閘道器172.17.0.1

    輸入地址池,172.17.0.10,172.17.0.100

    vlan1001網路建立完成

    在控制節點node1上檢視網路相關資訊,首先獲取OpenStack的網路資訊,可以看到剛剛新增的vlan1001網路,ID為54886452-55a2-437f-aa99-238e55403fc7
[root@node1 ~]# . admin-openrc 
[root@node1 ~]# openstack network list
+--------------------------------------+----------+--------------------------------------+
| ID                                   | Name     | Subnets                              |
+--------------------------------------+----------+--------------------------------------+
| 54886452-55a2-437f-aa99-238e55403fc7 | vlan1001 | ec33a0a5-4019-4f31-a5d8-2ca86d2c9fa2 |
| 6f032080-473d-4aa8-8cc3-074f23ecc4dd | inside   | 11eec460-caf2-45d1-ad79-432106b07f59 |
| d1e4b37b-eeb7-4934-aab7-dec537139a3a | provider | d439dfdb-8e80-4d30-a415-f7015c2108bc |
+--------------------------------------+----------+--------------------------------------+
    檢視控制節點上的網路名稱空間,可以看到多了一個qdhcp-54886452-55a2-437f-aa99-238e55403fc7,這個名稱空間和OpenStack的網路id是對應的,檢視該網路名稱空間下的網路IP地址可以證實。
[root@node1 ~]# ip netns ls
qdhcp-54886452-55a2-437f-aa99-238e55403fc7 (id: 2)
qdhcp-d1e4b37b-eeb7-4934-aab7-dec537139a3a (id: 1)
qdhcp-6f032080-473d-4aa8-8cc3-074f23ecc4dd (id: 0)
[root@node1 ~]# ip netns exec qdhcp-54886452-55a2-437f-aa99-238e55403fc7 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ns-13daa25c-58@if10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether fa:16:3e:5d:ed:b9 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.10/24 brd 172.17.0.255 scope global ns-13daa25c-58
       valid_lft forever preferred_lft forever
    inet 169.254.169.254/32 brd 169.254.169.254 scope global ns-13daa25c-58
       valid_lft forever preferred_lft forever
    inet6 fe80::a9fe:a9fe/64 scope link 
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fe5d:edb9/64 scope link 
       valid_lft forever preferred_lft forever
    新增的vlan1001的網路名稱空間中的ns-13daa25c-58虛擬網絡卡和宿主機上的網絡卡tap13daa25c-58是一對虛擬網絡卡,而tap13daa25c-58和ens19.1001宿主機上的vlan網絡卡是橋接網絡卡,這樣就可以通過ens19.1001網絡卡和其他宿主機上的例項通訊。
[root@node1 ~]# brctl show 
bridge name	bridge id		STP enabled	interfaces
brq54886452-55		8000.862a331edfda	no		ens19.1001
							tap13daa25c-58
    建立兩個例項在不同的計算節點上,網路使用vlan1001網路,當例項執行之後,測試網路通訊和檢視網絡卡橋接狀態     建立兩個例項並檢視網路和執行主機資訊,可以看到vlan-test-1例項執行在node4上,而vlan-test-2例項執行在node3上
[root@node1 ~]# openstack server list --long
+--------------------------------------+-------------+--------+------------+-------------+----------------------+--------------------------+--------------------------+-------------+-----------+-------------------+-------+------------+
| ID                                   | Name        | Status | Task State | Power State | Networks             | Image Name               | Image ID                 | Flavor Name | Flavor ID | Availability Zone | Host  | Properties |
+--------------------------------------+-------------+--------+------------+-------------+----------------------+--------------------------+--------------------------+-------------+-----------+-------------------+-------+------------+
| 1063b59c-5680-4a38-ab25-10f364fe2bb6 | vlan-test-1 | ACTIVE | None       | Running     | vlan1001=172.17.0.46 | N/A (booted from volume) | N/A (booted from volume) | m1.nano     | 0         | nova              | node4 |            |
| 946e1f20-c31f-4a38-bf42-fd3eb82af472 | vlan-test-2 | ACTIVE | None       | Running     | vlan1001=172.17.0.33 | N/A (booted from volume) | N/A (booted from volume) | m1.nano     | 0         | nova              | node3 |            |
+--------------------------------------+-------------+--------+------------+-------------+----------------------+--------------------------+--------------------------+-------------+-----------+-------------------+-------+------------+
    登入vlan-test-1例項的控制檯檢視IP地址並測試和例項vlan-test-2的網路是可以通行的     此時檢視node4上的網路資訊,橋介面brq54886452-55和控制節點上的橋接網絡卡名稱一樣,且ens19.1001和tap5c14401a-3a為橋接網絡卡。其中tap5c14401a-3a為虛擬網絡卡對,一端在宿主機上和ens19.1001作為橋接,另一端在例項中。而node3上的網路情況和node4一樣。
brq54886452-55		8000.0e9decd1b677	no		ens19.1001
							tap5c14401a-3a
    使用vlan1001網路的例項如果想訪問外部網路,需要ens19物理網絡卡相連的交換機的網口設定為trunk,且在vlan網路ID為1001中有對應的閘道器來轉發流量即可。

vxlan網路型別

    vxlan網路型別是三層網路,例項和例項之間通過vxlan網路來通訊,類似例項之間建立了隧道來通訊。它沒有vlan網路型別的vlanID號的限制,也沒有flat網路型別需要繫結物理網絡卡的限制。但是因為是三層網路,所以外部訪問vxlan網路的例項時需要額外配置路由。     在neutron元件的配置中已經指定了vxlan的相關配置
# /etc/neutron/plugins/ml2/ml2_conf.ini
[ml2]
type_drivers = local,flat,vlan,gre,vxlan,geneve
ml2_type_vxlan = vni_ranges 1:1000             # 設定vxlan的ID範圍
# /etc/neutron/plugins/ml2/linuxbridge_agent.ini
[vxlan]
enable_vxlan = true
local_ip = 192.168.31.101   # 宿主機之間轉發例項資料的使用的ip地址,vxlan會自動工作在該ip所在的網絡卡,即ens18
    Dashboard新增vxlan網路,建立網路時的名稱為vxlan1,網路型別為vxlan,段ID為1     網路地址範圍為172.16.1.10/24,閘道器設定為172.16.1.1

    輸入地址池172.16.1.10,172,16.1.100

    vxlan1網路建立完成

    在控制節點node1上檢視網路相關資訊,首先獲取OpenStack的網路資訊,可以看到剛剛新增的vlan1001網路,ID為54886452-55a2-437f-aa99-238e55403fc7

[root@node1 ~]# . admin-openrc 
[root@node1 ~]# openstack network list
+--------------------------------------+----------+--------------------------------------+
| ID                                   | Name     | Subnets                              |
+--------------------------------------+----------+--------------------------------------+
| 5415275c-9c56-4f09-aab3-3eabde4f4eb0 | vxlan1   | b7cf01d1-1331-4d1b-a86a-00e58a0f3c3a |
| 54886452-55a2-437f-aa99-238e55403fc7 | vlan1001 | ec33a0a5-4019-4f31-a5d8-2ca86d2c9fa2 |
| 6f032080-473d-4aa8-8cc3-074f23ecc4dd | inside   | 11eec460-caf2-45d1-ad79-432106b07f59 |
| d1e4b37b-eeb7-4934-aab7-dec537139a3a | provider | d439dfdb-8e80-4d30-a415-f7015c2108bc |
+--------------------------------------+----------+--------------------------------------+
    檢視控制節點上的網路名稱空間,可以看到多了一個qdhcp-5415275c-9c56-4f09-aab3-3eabde4f4eb0,這個名稱空間和OpenStack的網路id是對應的,檢視該網路名稱空間下的網路IP地址可以證實。
[root@node1 ~]# ip netns ls
qdhcp-5415275c-9c56-4f09-aab3-3eabde4f4eb0 (id: 3)
qdhcp-54886452-55a2-437f-aa99-238e55403fc7 (id: 2)
qdhcp-d1e4b37b-eeb7-4934-aab7-dec537139a3a (id: 1)
qdhcp-6f032080-473d-4aa8-8cc3-074f23ecc4dd (id: 0)
[root@node1 ~]# ip netns exec qdhcp-5415275c-9c56-4f09-aab3-3eabde4f4eb0 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ns-74b9fa42-6a@if13: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default qlen 1000
    link/ether fa:16:3e:31:14:a6 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.16.1.10/24 brd 172.16.1.255 scope global ns-74b9fa42-6a
       valid_lft forever preferred_lft forever
    inet 169.254.169.254/32 brd 169.254.169.254 scope global ns-74b9fa42-6a
       valid_lft forever preferred_lft forever
    inet6 fe80::a9fe:a9fe/64 scope link 
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fe31:14a6/64 scope link 
       valid_lft forever preferred_lft forever
    新增的vxlan1的網路名稱空間中的ns-74b9fa42-6a虛擬網絡卡和宿主機上的網絡卡vxlan-1是一對虛擬網絡卡,而vxlan-1和ens18宿主機上的網絡卡是橋接網絡卡,這樣就可以通過ens18網絡卡和其他宿主機上的例項通訊。vxlan網路在宿主機上通過udp協議進行通訊,使用udp協議將資料包進行封裝,然後接收方解包後在轉發到對應例項中。
[root@node1 ~]#  brctl show 
bridge name	bridge id		STP enabled	interfaces
brq5415275c-9c		8000.7e2576bd20b3	no		tap74b9fa42-6a
							vxlan-1
# 可以看到介面為vxlan,id為1,工作在網絡卡ens8上,和neutron的配置一致,且通訊埠為udp 8472
[root@node1 ~]# ip -d link show vxlan-1
14: vxlan-1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master brq5415275c-9c state UNKNOWN mode DEFAULT group default qlen 1000
    link/ether 82:a3:88:c3:c2:e3 brd ff:ff:ff:ff:ff:ff promiscuity 1 minmtu 68 maxmtu 65535 
    vxlan id 1 group 224.0.0.1 dev ens18 srcport 0 0 dstport 8472 ttl auto ageing 300 udpcsum noudp6zerocsumtx noudp6zerocsumrx
    建立兩個例項在不同的計算節點上,網路使用vxlan1網路,當例項執行之後,測試網路通訊和檢視網絡卡橋接狀態     建立兩個例項並檢視網路和執行主機資訊,可以看到vxlan1-1例項執行在node4上,而vxlan2-2例項執行在node3上
[root@node1 ~]# openstack server list --long
+--------------------------------------+----------+--------+------------+-------------+--------------------+--------------------------+--------------------------+-------------+-----------+-------------------+-------+------------+
| ID                                   | Name     | Status | Task State | Power State | Networks           | Image Name               | Image ID                 | Flavor Name | Flavor ID | Availability Zone | Host  | Properties |
+--------------------------------------+----------+--------+------------+-------------+--------------------+--------------------------+--------------------------+-------------+-----------+-------------------+-------+------------+
| dc828568-f60c-4259-898c-8c43d5c1fe64 | vxlan1-2 | ACTIVE | None       | Running     | vxlan1=172.16.1.17 | N/A (booted from volume) | N/A (booted from volume) | m1.nano     | 0         | nova              | node3 |            |
| fdb2c8a0-4ed4-4842-ac5b-40aa9b6afb48 | vxlan1-1 | ACTIVE | None       | Running     | vxlan1=172.16.1.33 | N/A (booted from volume) | N/A (booted from volume) | m1.nano     | 0         | nova              | node4 |            |
+--------------------------------------+----------+--------+------------+-------------+--------------------+--------------------------+--------------------------+-------------+-----------+-------------------+-------+------------+
    登入vxlan1-1例項的控制檯檢視IP地址並測試和例項vxlan1-2的網路是可以通訊的     此時檢視node4上的網路資訊,橋介面brq5415275c-9c和控制節點上的橋接網絡卡名稱一樣,且vxlan-1和tap145db8f2-ce為橋接網絡卡。其中tap145db8f2-ce為虛擬網絡卡對,一端在宿主機上和vxlan-1作為橋接,另一端在例項中。而node3上的網路情況和node4一樣。同時vxlan因為neutron的配置中指定了管理網的IP地址,所以工作在ens18網絡卡上。

bridge name	bridge id		STP enabled	interfaces
brq5415275c-9c		8000.06bc46f08ed9	no		tap145db8f2-ce
							vxlan-1
[root@node4 ~]# ip -d link show vxlan-1
16: vxlan-1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master brq5415275c-9c state UNKNOWN mode DEFAULT group default qlen 1000
    link/ether 06:bc:46:f0:8e:d9 brd ff:ff:ff:ff:ff:ff promiscuity 1 minmtu 68 maxmtu 65535 
    vxlan id 1 local 192.168.31.104 dev ens18 srcport 0 0 dstport 8472 ttl auto ageing 300 udpcsum noudp6zerocsumtx noudp6zerocsumrx 
    當vxlan1-1例項去ping例項vxlan1-2的IP地址時,在vxlan1-1例項所在的宿主機node4的ens18網絡卡上抓包,抓包為udp 8472,可以看到如下資訊。
[root@node4 ~]# tcpdump  -n -i ens18 udp port 8472
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens18, link-type EN10MB (Ethernet), capture size 262144 bytes
14:16:56.322196 IP 192.168.31.104.47460 > 192.168.31.103.otv: OTV, flags [I] (0x08), overlay 0, instance 1
IP 172.16.1.33 > 172.16.1.17: ICMP echo request, id 49153, seq 0, length 64
14:16:56.322666 IP 192.168.31.103.59652 > 192.168.31.104.otv: OTV, flags [I] (0x08), overlay 0, instance 1
IP 172.16.1.17 > 172.16.1.33: ICMP echo reply, id 49153, seq 0, length 64
14:16:57.322516 IP 192.168.31.104.47460 > 192.168.31.103.otv: OTV, flags [I] (0x08), overlay 0, instance 1
IP 172.16.1.33 > 172.16.1.17: ICMP echo request, id 49153, seq 1, length 64
14:16:57.323099 IP 192.168.31.103.59652 > 192.168.31.104.otv: OTV, flags [I] (0x08), overlay 0, instance 1
IP 172.16.1.17 > 172.16.1.33: ICMP echo reply, id 49153, seq 1, length 64
14:16:58.322837 IP 192.168.31.104.47460 > 192.168.31.103.otv: OTV, flags [I] (0x08), overlay 0, instance 1
IP 172.16.1.33 > 172.16.1.17: ICMP echo request, id 49153, seq 2, length 64
14:16:58.323258 IP 192.168.31.103.59652 > 192.168.31.104.otv: OTV, flags [I] (0x08), overlay 0, instance 1
IP 172.16.1.17 > 172.16.1.33: ICMP echo reply, id 49153, seq 2, length 64
14:16:59.323134 IP 192.168.31.104.47460 > 192.168.31.103.otv: OTV, flags [I] (0x08), overlay 0, instance 1
IP 172.16.1.33 > 172.16.1.17: ICMP echo request, id 49153, seq 3, length 64
14:16:59.323876 IP 192.168.31.103.59652 > 192.168.31.104.otv: OTV, flags [I] (0x08), overlay 0, instance 1
IP 172.16.1.17 > 172.16.1.33: ICMP echo reply, id 49153, seq 3, length 64
14:17:01.329459 IP 192.168.31.104.45810 > 192.168.31.103.otv: OTV, flags [I] (0x08), overlay 0, instance 1
ARP, Request who-has 172.16.1.17 tell 172.16.1.33, length 28
14:17:01.330025 IP 192.168.31.103.55260 > 192.168.31.104.otv: OTV, flags [I] (0x08), overlay 0, instance 1
ARP, Reply 172.16.1.17 is-at fa:16:3e:74:ad:39, length 28
    vxlan網路型別和flat網路型別、vlan網路型別不同。flat網路型別和vlan網路型別可以通過外部的網路設定做路由轉發進行通訊,而vxlan網路型別和外部網路是無法通訊的,只是在宿主機的例項之間進行資料通訊,且是通過udp協議進行了封裝。     而不同vxlan網型別的例項之間可以通過OpenStack提供的路由功能進行通訊。這裡再新增一個vxlan網型別的網路為vxlan2,網路段為172.16.2.0/24,閘道器為172.16.2.1。修改vxlan網路型別的網路vxlan1和vxlan2為共享網路。在管理員選單下編輯網路可以修改。     使用vxlan2網路建立例項vxlan2-1,並測試vxlan2-1是否可以訪問vxlan1-1例項。測試結果發現在vxlan1-1中是無法ping同vxlan2-1例項的IP地址。

[root@node1 ~]# openstack server list --long
+--------------------------------------+----------+--------+------------+-------------+--------------------+--------------------------+--------------------------+-------------+-----------+-------------------+-------+------------+
| ID                                   | Name     | Status | Task State | Power State | Networks           | Image Name               | Image ID                 | Flavor Name | Flavor ID | Availability Zone | Host  | Properties |
+--------------------------------------+----------+--------+------------+-------------+--------------------+--------------------------+--------------------------+-------------+-----------+-------------------+-------+------------+
| c3bc87b0-49cb-42c3-ac34-5a73b7222daa | vxlan2-1 | ACTIVE | None       | Running     | vxlan2=172.16.2.19 | N/A (booted from volume) | N/A (booted from volume) | m1.nano     | 0         | nova              | node5 |            |
| dc828568-f60c-4259-898c-8c43d5c1fe64 | vxlan1-2 | ACTIVE | None       | Running     | vxlan1=172.16.1.17 | N/A (booted from volume) | N/A (booted from volume) | m1.nano     | 0         | nova              | node3 |            |
| fdb2c8a0-4ed4-4842-ac5b-40aa9b6afb48 | vxlan1-1 | ACTIVE | None       | Running     | vxlan1=172.16.1.33 | N/A (booted from volume) | N/A (booted from volume) | m1.nano     | 0         | nova              | node4 |            |
+--------------------------------------+----------+--------+------------+-------------+--------------------+--------------------------+--------------------------+-------------+-----------+-------------------+-------+------------+
    在OpenStack中新增路由,vxlan1和vlxna2的新增路由方式相同。新增vxlan1and2的路由如下:     新增完成後如下所示:

    在vxlan1and2的路由中新增介面,指定子網為vxlan1,並指定IP地址為172.16.1.1,因為在新增網路的時候指定的閘道器為172.16.1.1

    在vxlan1and2的路由中新增介面,指定子網為vxlan2,並指定IP地址為172.16.2.1,因為在新增網路的時候指定的閘道器為172.16.2.1

    新增完成後如下所示:

    新增完成後,此時從vxlan1-1訪問vxlan2-1的例項的IP地址,已經可以ping通。

OpenStack路由分析

    OpenStack中新增路由,其實就是建立一個虛擬網絡卡對,一端和名稱空間中虛擬網絡卡對的另一個虛擬網絡卡所在的橋介面上,另一端在路由名稱空間中,且配置IP地址,然後在路由名稱空間中進行流量的轉發。 檢視路由的名稱空間
[root@node1 ~]# ip netns ls
qrouter-636634da-8514-4b6a-9a11-43ddf1cb5682 (id: 4)
   檢視橋接資訊,可以看到在brq5415275c-9c橋接上新添加了一個虛擬網絡卡tap5855715d-db,該網路和vxlan1網路相通;而在brqe1299b5f-86橋接上新添加了一個tapa374532d-00,該網路和vxlan2網路相通。
[root@node1 ~]# brctl show 
bridge name	bridge id		STP enabled	interfaces
brq5415275c-9c		8000.46ca3d9407da	no		tap5855715d-db
							tap74b9fa42-6a
							vxlan-1
brqe1299b5f-86		8000.2ed0545ab821	no		tapa374532d-00
							taped3f4470-9e
							vxlan-2
    檢視路由名稱空間qrouter-636634da-8514-4b6a-9a11-43ddf1cb5682中的網路資訊,可以看到在Dashboard配置的兩個網路的閘道器IP地址都在改路由名稱空間中,此時兩個網路就可以相互之間通訊。
[root@node1 ~]# ip netns exec qrouter-636634da-8514-4b6a-9a11-43ddf1cb5682 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: qr-5855715d-db@if26: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default qlen 1000
    link/ether fa:16:3e:dd:e1:a2 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.16.1.1/24 brd 172.16.1.255 scope global qr-5855715d-db
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fedd:e1a2/64 scope link 
       valid_lft forever preferred_lft forever
3: qr-a374532d-00@if27: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default qlen 1000
    link/ether fa:16:3e:a9:bd:74 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.16.2.1/24 brd 172.16.2.255 scope global qr-a374532d-00
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fea9:bd74/64 scope link 
       valid_lft forever preferred_lft forever
    vxlan網路型別通過路由的方式除了和另一個vxlan網路進行通訊外,還可以和其它網路型別的例項通訊,原理和上述一樣,但是因為預設路由(vxlan和flat網路型別的預設路由都是外部網路裝置)的問題,所以可能還需要在路由中新增靜態路由,同時例項上也可能需要配置額外的路由資訊。     因為vxlan網路的特殊性,如果外部需要訪問vxlan網路型別的例項提供的服務,需要通過浮動IP的方式來訪問。     新增浮動IP時,需要首先設定該vxlan的路由,並指定該路由的外部地址,這裡設定為inside,     因為vxlan1的網段和provider的網段相同,都是使用的172.16.1.0/24,如果設定外部網路為provider則會報錯,提示網路衝突

     分配浮動IP

    將分配的浮動IP地址進行關聯

    將分配的浮動IP地址10.1.0.50和例項ip地址172.16.1.33進行關聯。

    關聯之後可以從浮動ip這裡看到關聯資訊。

    此時就可以通過浮動IP地址來訪問例項,就是通過iptables做了IP地址的一對一對映。

OpenStack浮動IP分析

    OpenStack的浮動IP地址需要先做路由,然後配置浮動IP地址。通過檢視路由的網路名稱空間配置可以得知,浮動IP地址就是新增到路由的網路名稱空間中。在路由的網路名稱空間中添加了一個inside網路的IP地址:10.1.0.83/24,在做資料轉發時使用的路由IP地址。
[root@node1 ~]# ip netns exec qrouter-636634da-8514-4b6a-9a11-43ddf1cb5682  ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: qr-5855715d-db@if26: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default qlen 1000
    link/ether fa:16:3e:dd:e1:a2 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.16.1.1/24 brd 172.16.1.255 scope global qr-5855715d-db
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fedd:e1a2/64 scope link 
       valid_lft forever preferred_lft forever
3: qr-a374532d-00@if27: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default qlen 1000
    link/ether fa:16:3e:a9:bd:74 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.16.2.1/24 brd 172.16.2.255 scope global qr-a374532d-00
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fea9:bd74/64 scope link 
       valid_lft forever preferred_lft forever
6: qg-adbbc7d0-4e@if30: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether fa:16:3e:ce:1a:6b brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 10.1.0.83/24 brd 10.1.0.255 scope global qg-adbbc7d0-4e
       valid_lft forever preferred_lft forever
    inet 10.1.0.50/32 brd 10.1.0.50 scope global qg-adbbc7d0-4e
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fece:1a6b/64 scope link 
       valid_lft forever preferred_lft forever
# 而qg-adbbc7d0-4e虛擬網絡卡的另一端,tapadbbc7d0-4e和ens20和tapfea707b3-91作為橋介面
brq6f032080-47		8000.4a7c30e1d740	no		ens20
							tapadbbc7d0-4e
							tapfea707b3-91
# 檢視inside的網路名稱空間可以看到,tapfea707b3-91和ns-fea707b3-91是一對,這樣inside網路和vxlan1的網路就可以通訊了
[root@node1 ~]# ip netns exec qdhcp-6f032080-473d-4aa8-8cc3-074f23ecc4dd ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ns-fea707b3-91@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether fa:16:3e:02:67:64 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 169.254.169.254/32 brd 169.254.169.254 scope global ns-fea707b3-91
       valid_lft forever preferred_lft forever
    inet 10.1.0.10/24 brd 10.1.0.255 scope global ns-fea707b3-91
       valid_lft forever preferred_lft forever
    inet6 fe80::a9fe:a9fe/64 scope link 
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fe02:6764/64 scope link 
       valid_lft forever preferred_lft forever
    然後在路由的網路名稱空間中配置一個DNAT來完成浮動IP和例項IP的一對一對映
[root@node1 ~]# ip netns exec qrouter-636634da-8514-4b6a-9a11-43ddf1cb5682  iptables -t nat -L neutron-l3-agent-OUTPUT -n
Chain neutron-l3-agent-OUTPUT (1 references)
target     prot opt source               destination         
DNAT       all  --  0.0.0.0/0            10.1.0.50            to:172.16.1.33

例項如何獲取IP地址

    這裡通過分析vxlan1-1例項獲取dhcp分配的IP地址過程,來詳解例項時如何獲取DHCP分配的IP地址的。其他網路型別的例項獲取DHCP分配的IP地址流程是一樣的。 當建立vxlan1網路之後,會在控制節點node1上建立一個vxlan-1介面,並工作在ens18網絡卡上。並建立一個橋接網絡卡和一對虛擬網絡卡,虛擬網絡卡一段在物理機上和vxlan-1進行橋接,另一段分配到網路名稱空間中,並設定IP地址,然後啟動dnsmasq來啟動dhcp服務,對例項分配IP地址。

檢視控制節點網路情況

    檢視vxlan-1工作在ens18網絡卡上,啟動dev ens18表示工作的網絡卡
[root@node1 ~]# ip -d link show vxlan-1
14: vxlan-1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master brq5415275c-9c state UNKNOWN mode DEFAULT group default qlen 1000
    link/ether 82:a3:88:c3:c2:e3 brd ff:ff:ff:ff:ff:ff promiscuity 1 minmtu 68 maxmtu 65535 
    vxlan id 1 group 224.0.0.1 dev ens18 srcport 0 0 dstport 8472 ttl auto ageing 300 udpcsum noudp6zerocsumtx noudp6zerocsumrx
    vxlan-1和虛擬網絡卡tap74b9fa42-6a為橋接。
[root@node1 ~]# brctl show brq5415275c-9c
bridge name	bridge id		STP enabled	interfaces
brq5415275c-9c		8000.46ca3d9407da	no		tap5855715d-db
							tap74b9fa42-6a
							vxlan-1
    而虛擬網絡卡tap74b9fa42-6a的另一段ns-74b9fa42-6a在網路名稱空間中,並啟動dnsmasq通過該網絡卡接受例項的dhcp請求。
[root@node1 ~]# ip netns exec qdhcp-5415275c-9c56-4f09-aab3-3eabde4f4eb0 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ns-74b9fa42-6a@if13: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default qlen 1000
    link/ether fa:16:3e:31:14:a6 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.16.1.10/24 brd 172.16.1.255 scope global ns-74b9fa42-6a
       valid_lft forever preferred_lft forever
    inet 169.254.169.254/32 brd 169.254.169.254 scope global ns-74b9fa42-6a
       valid_lft forever preferred_lft forever
    inet6 fe80::a9fe:a9fe/64 scope link 
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fe31:14a6/64 scope link 
       valid_lft forever preferred_lft forever
    獲取工作在網路名稱空間中的程序ID,並檢視該程序可以看到程序為dnsmasq,OpenStack使用dnsmasq服務為例項提供dhcp服務。
[root@node1 ~]# ip netns  pids qdhcp-5415275c-9c56-4f09-aab3-3eabde4f4eb0 
83979
[root@node1 ~]# ps -ef | grep 83979
dnsmasq    83979       1  0 15:29 ?        00:00:00 dnsmasq --no-hosts --no-resolv --pid-file=/var/lib/neutron/dhcp/5415275c-9c56-4f09-aab3-3eabde4f4eb0/pid --dhcp-hostsfile=/var/lib/neutron/dhcp/5415275c-9c56-4f09-aab3-3eabde4f4eb0/host --addn-hosts=/var/lib/neutron/dhcp/5415275c-9c56-4f09-aab3-3eabde4f4eb0/addn_hosts --dhcp-optsfile=/var/lib/neutron/dhcp/5415275c-9c56-4f09-aab3-3eabde4f4eb0/opts --dhcp-leasefile=/var/lib/neutron/dhcp/5415275c-9c56-4f09-aab3-3eabde4f4eb0/leases --dhcp-match=set:ipxe,175 --dhcp-userclass=set:ipxe6,iPXE --local-service --bind-dynamic --dhcp-range=set:subnet-b7cf01d1-1331-4d1b-a86a-00e58a0f3c3a,172.16.1.0,static,255.255.255.0,86400s --dhcp-option-force=option:mtu,1450 --dhcp-lease-max=256 --conf-file=/dev/null --domain=openstacklocal
root       87373   84789  0 16:17 pts/0    00:00:00 grep --color=auto 83979
    檢視dnsmasq的主機資訊,可以看到對外提供指定主機dhcp資訊,這個和例項的配置資訊是一直的。172.16.1.33為例項vxlan1-1的IP地址
[root@node1 ~]# cat /var/lib/neutron/dhcp/5415275c-9c56-4f09-aab3-3eabde4f4eb0/host
fa:16:3e:de:6e:86,host-172-16-1-33.openstacklocal,172.16.1.33
fa:16:3e:dd:e1:a2,host-172-16-1-1.openstacklocal,172.16.1.1
fa:16:3e:74:ad:39,host-172-16-1-17.openstacklocal,172.16.1.17
[root@node1 ~]# openstack server list
+--------------------------------------+----------+--------+-------------------------------+--------------------------+---------+
| ID                                   | Name     | Status | Networks                      | Image                    | Flavor  |
+--------------------------------------+----------+--------+-------------------------------+--------------------------+---------+
| c3bc87b0-49cb-42c3-ac34-5a73b7222daa | vxlan2-1 | ACTIVE | vxlan2=172.16.2.19            | N/A (booted from volume) | m1.nano |
| dc828568-f60c-4259-898c-8c43d5c1fe64 | vxlan1-2 | ACTIVE | vxlan1=172.16.1.17            | N/A (booted from volume) | m1.nano |
| fdb2c8a0-4ed4-4842-ac5b-40aa9b6afb48 | vxlan1-1 | ACTIVE | vxlan1=172.16.1.33, 10.1.0.50 | N/A (booted from volume) | m1.nano |
+--------------------------------------+----------+--------+-------------------------------+--------------------------+---------+

檢視計算節點網路情況

    檢視node4網路的vxlan-1工作在ens18,同控制節點一致
[root@node4 ~]# ip -d link show vxlan-1
16: vxlan-1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master brq5415275c-9c state UNKNOWN mode DEFAULT group default qlen 1000
    link/ether 06:bc:46:f0:8e:d9 brd ff:ff:ff:ff:ff:ff promiscuity 1 minmtu 68 maxmtu 65535 
    vxlan id 1 local 192.168.31.104 dev ens18 srcport 0 0 dstport 8472 ttl auto ageing 300 udpcsum noudp6zerocsumtx noudp6zerocsumrx
    vxlan-1和虛擬網絡卡tap145db8f2-ce為橋接,而tap145db8f2-ce的另一端在例項中,此時例項就可以獲取dhcp分配的IP地址
[root@node4 ~]# brctl show  brq5415275c-9c
bridge name	bridge id		STP enabled	interfaces
brq5415275c-9c		8000.06bc46f08ed9	no		tap145db8f2-ce
							vxlan-1
    而OpenStack為了更加的安全,配置了相關的iptables規則。關閉網路的dhcp並啟用外部的dhcp伺服器,可以獲取到IP地址,但是因為有相關的iptables規則導致無法和外部通訊。
[root@node4 ~]# iptables -nv -L neutron-linuxbri-i145db8f2-c
Chain neutron-linuxbri-i145db8f2-c (1 references)
 pkts bytes target     prot opt in     out     source               destination         
 1298  118K RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED /* Direct packets associated with a known session to the RETURN chain. */
    2   730 RETURN     udp  --  *      *       0.0.0.0/0            172.16.1.33          udp spt:67 dpt:68  
    0     0 RETURN     udp  --  *      *       0.0.0.0/0            255.255.255.255      udp spt:67 dpt:68
    0     0 RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0            match-set NIPv49612db0d-b44e-4eba-9e8e- src
    5   300 RETURN     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22
    1    84 RETURN     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           
    0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            state INVALID /* Drop packets that appear related to an existing connection (e.g. TCP ACK/FIN) but do not have an entry in conntrack. */
    2   658 neutron-linuxbri-sg-fallback  all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* Send unmatched traffic to the fallback chain. */
    
Chain neutron-linuxbri-o145db8f2-c (2 references)
target     prot opt source               destination         
RETURN     udp  --  0.0.0.0              255.255.255.255      udp spt:68 dpt:67 /* Allow DHCP client traffic. */
neutron-linuxbri-s145db8f2-c  all  --  0.0.0.0/0            0.0.0.0/0           
RETURN     udp  --  0.0.0.0/0            0.0.0.0/0            udp spt:68 dpt:67 /* Allow DHCP client traffic. */
DROP       udp  --  0.0.0.0/0            0.0.0.0/0            udp spt:67 dpt:68 /* Prevent DHCP Spoofing by VM. */     
RETURN     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED /* Direct packets associated with a known session to the RETURN chain. */
RETURN     all  --  0.0.0.0/0            0.0.0.0/0           
DROP       all  --  0.0.0.0/0            0.0.0.0/0            state INVALID /* Drop packets that appear related to an existing connection (e.g. TCP ACK/FIN) but do not
 have an entry in conntrack. */
neutron-linuxbri-sg-fallback  all  --  0.0.0.0/0            0.0.0.0/0            /* Send unmatched traffic to the fallback chain. */
# 這裡限制了ip和網絡卡mac地址,只是無法訪問,但是例項是可以獲取到dhcp分配的網路IP地址
[root@node4 ~]# iptables -nv -L neutron-linuxbri-s145db8f2-c
Chain neutron-linuxbri-s145db8f2-c (1 references)
 pkts bytes target     prot opt in     out     source               destination         
 1876  164K RETURN     all  --  *      *       172.16.1.33          0.0.0.0/0            MAC FA:16:3E:DE:6E:86 /* Allow traffic from defined IP/MAC pairs. */
    0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* Drop traffic without an IP/MAC allow rule. */
    同時在ebtable中的nat鏈中限制了網路的arp資訊
ebtable -L -t nat