如何配置OVN路由器?
概覽
基于我上一篇文章中的實(shí)驗(yàn)環(huán)境,我現(xiàn)在將三層網(wǎng)絡(luò)基礎(chǔ)功能添加到OVN中。最終呈現(xiàn)出來的將是由邏輯路由器連接的一對邏輯交換機(jī)。 另外,路由器將被配置為通過OVN中內(nèi)置的DHCP服務(wù)來提供IP地址。
重構(gòu)邏輯組件
由于設(shè)置開始變得更加復(fù)雜,我們將重新構(gòu)建網(wǎng)絡(luò)架構(gòu)。 新的邏輯網(wǎng)絡(luò)拓?fù)淙缦拢?/p>
- 2 臺邏輯交換機(jī) switches: “dmz” 和“inside”
- 邏輯路由器“tenant1”,它連接著兩個(gè)邏輯交換機(jī)
- IP網(wǎng)絡(luò)“dmz” :172.16.255.128/26
- IP網(wǎng)絡(luò)“inside”:172.16.255.192/26
- 每個(gè)邏輯交換機(jī)上各有一對“虛擬機(jī)”
新的邏輯網(wǎng)絡(luò)如下圖所示
理解路由
在本次實(shí)驗(yàn)中,我們將創(chuàng)建一個(gè)OVN路由器,即“分布式邏輯路由器”(DLR)。 DLR不同于傳統(tǒng)路由器,因?yàn)樗皇俏锢淼脑O(shè)備,而是一種邏輯架構(gòu)(與邏輯交換機(jī)不同)。 DLR僅作為OVS中的一個(gè)功能而存在:換句話說,每個(gè)OVS實(shí)例能夠在overlay網(wǎng)絡(luò)轉(zhuǎn)發(fā)流量之前先在本地模擬出一個(gè)三層路由器。
創(chuàng)建邏輯交換機(jī)和邏輯路由器
在ubuntu1上定義邏輯交換機(jī):
- ovn-nbctl ls-add inside
- ovn-nbctl ls-add dmz
添加邏輯路由器及其關(guān)聯(lián)的路由器和交換機(jī)端口:
- # 添加路由器tenant1
- ovn-nbctl lr-add tenant1
- # 為路由器tenant1創(chuàng)建一個(gè)連接到dmz交換機(jī)的端口
- ovn-nbctl lrp-add tenant1 tenant1-dmz 02:ac:10:ff:01:29 172.16.255.129/26
- # 為dmz交換機(jī)創(chuàng)建用于連接到路由器tenant1的端口dmz-tenant1
- ovn-nbctl lsp-add dmz dmz-tenant1
- ovn-nbctl lsp-set-type dmz-tenant1 router
- ovn-nbctl lsp-set-addresses dmz-tenant1 02:ac:10:ff:01:29
- ovn-nbctl lsp-set-options dmz-tenant1 router-port=tenant1-dmz
- #為路由器tenant1創(chuàng)建一個(gè)連接到inside交換機(jī)的端口
- ovn-nbctl lrp-add tenant1 tenant1-inside 02:ac:10:ff:01:93 172.16.255.193/26
- #為inside交換機(jī)創(chuàng)建用于連接到路由器tenant1的端口inside-tenant1
- ovn-nbctl lsp-add inside inside-tenant1
- ovn-nbctl lsp-set-type inside-tenant1 router
- ovn-nbctl lsp-set-addresses inside-tenant1 02:ac:10:ff:01:93
- ovn-nbctl lsp-set-options inside-tenant1 router-port=tenant1-inside
- ovn-nbctl show
添加 DHCP
OVN中的DHCP與大多數(shù)的解決方案有點(diǎn)不同。 大多數(shù)人的想法是管理員將:
- 給定子網(wǎng)定義一組DHCP選項(xiàng)
- 創(chuàng)建邏輯交換機(jī)端口,給該端口定義MAC地址和IP地址
- 為該端口分配DHCP選項(xiàng)。
- 將端口安全設(shè)置為僅允許分配的地址
下面,我們將要給4臺虛擬機(jī)配置邏輯端口。
在ubuntu1上:
- ovn-nbctl lsp-add dmz dmz-vm1
- ovn-nbctl lsp-set-addresses dmz-vm1 "02:ac:10:ff:01:30 172.16.255.130"
- ovn-nbctl lsp-set-port-security dmz-vm1 "02:ac:10:ff:01:30 172.16.255.130"
- ovn-nbctl lsp-add dmz dmz-vm2
- ovn-nbctl lsp-set-addresses dmz-vm2 "02:ac:10:ff:01:31 172.16.255.131"
- ovn-nbctl lsp-set-port-security dmz-vm2 "02:ac:10:ff:01:31 172.16.255.131"
- ovn-nbctl lsp-add inside inside-vm3
- ovn-nbctl lsp-set-addresses inside-vm3 "02:ac:10:ff:01:94 172.16.255.194"
- ovn-nbctl lsp-set-port-security inside-vm3 "02:ac:10:ff:01:94 172.16.255.194"
- ovn-nbctl lsp-add inside inside-vm4
- ovn-nbctl lsp-set-addresses inside-vm4 "02:ac:10:ff:01:95 172.16.255.195"
- ovn-nbctl lsp-set-port-security inside-vm4 "02:ac:10:ff:01:95 172.16.255.195"
- ovn-nbctl show
您可能已經(jīng)注意到,與上一個(gè)實(shí)驗(yàn)不同,現(xiàn)在通過一條命令就能定義mac和IP地址。 IP地址定義實(shí)現(xiàn)了我們的2個(gè)目的:
- 它通過OVN在本地應(yīng)答其知道的IP / MAC的ARP請求來實(shí)現(xiàn)ARP抑制。
- 從哪個(gè)端口收到DHCP請求,就會從哪個(gè)接口分配IP地址。通過這種方式來實(shí)現(xiàn)DHCP。
接下來,我們需要定義DHCP選項(xiàng)并將它們分配給邏輯端口。這里的處理將與我們以前看到的有點(diǎn)不同,因?yàn)槲覀儗⒅苯优cOVN NB數(shù)據(jù)庫進(jìn)行交互。 用這種方式的原因是需要捕獲DHCP_Options中的UUID,以便我們可以將UUID分配給交換機(jī)端口。 為此,我們將把捕獲的ovn-nbctl命令的結(jié)果輸出到一對bash變量中。
- dmzDhcp="$(ovn-nbctl create DHCP_Options cidr=172.16.255.128/26 \
- options="\"server_id\"=\"172.16.255.129\" \"server_mac\"=\"02:ac:10:ff:01:29\" \
- \"lease_time\"=\"3600\" \"router\"=\"172.16.255.129\"")"
- echo $dmzDhcp
- insideDhcp="$(ovn-nbctl create DHCP_Options cidr=172.16.255.192/26 \
- options="\"server_id\"=\"172.16.255.193\" \"server_mac\"=\"02:ac:10:ff:01:93\" \
- \"lease_time\"=\"3600\" \"router\"=\"172.16.255.193\"")"
- echo $insideDhcp
- ovn-nbctl dhcp-options-list
如果您想了解有關(guān)OVN NB數(shù)據(jù)庫的更多信息,請參閱ovn-nb的手冊(譯者注:http://openvswitch.org/support/dist-docs/ovn-nb.5.pdf)。
現(xiàn)在,我們將使用存儲在變量中的UUID為邏輯交換機(jī)端口分配DHCP_Options。
- ovn-nbctl lsp-set-dhcpv4-options dmz-vm1 $dmzDhcp
- ovn-nbctl lsp-get-dhcpv4-options dmz-vm1
- ovn-nbctl lsp-set-dhcpv4-options dmz-vm2 $dmzDhcp
- ovn-nbctl lsp-get-dhcpv4-options dmz-vm2
- ovn-nbctl lsp-set-dhcpv4-options inside-vm3 $insideDhcp
- ovn-nbctl lsp-get-dhcpv4-options inside-vm3
- ovn-nbctl lsp-set-dhcpv4-options inside-vm4 $insideDhcp
- ovn-nbctl lsp-get-dhcpv4-options inside-vm4
配置虛擬機(jī)
與上一個(gè)實(shí)驗(yàn)一樣,我們將使用OVS內(nèi)部端口和網(wǎng)絡(luò)命名空間構(gòu)建的“偽虛擬機(jī)”。 現(xiàn)在的區(qū)別是,我們將使用DHCP進(jìn)行地址分配。
接下來我們將設(shè)置虛擬機(jī)。
在ubuntu2上:
- ip netns add vm1
- ovs-vsctl add-port br-int vm1 -- set interface vm1 type=internal
- ip link set vm1 address 02:ac:10:ff:01:30
- ip link set vm1 netns vm1
- ovs-vsctl set Interface vm1 external_ids:iface-id=dmz-vm1
- ip netns exec vm1 dhclient vm1
- ip netns exec vm1 ip addr show vm1
- ip netns exec vm1 ip route show
- ip netns add vm3
- ovs-vsctl add-port br-int vm3 -- set interface vm3 type=internal
- ip link set vm3 address 02:ac:10:ff:01:94
- ip link set vm3 netns vm3
- ovs-vsctl set Interface vm3 external_ids:iface-id=inside-vm3
- ip netns exec vm3 dhclient vm3
- ip netns exec vm3 ip addr show vm3
- ip netns exec vm3 ip route show
在 ubuntu3上:
- ip netns add vm2
- ovs-vsctl add-port br-int vm2 -- set interface vm2 type=internal
- ip link set vm2 address 02:ac:10:ff:01:31
- ip link set vm2 netns vm2
- ovs-vsctl set Interface vm2 external_ids:iface-id=dmz-vm2
- ip netns exec vm2 dhclient vm2
- ip netns exec vm2 ip addr show vm2
- ip netns exec vm2 ip route show
- ip netns add vm4
- ovs-vsctl add-port br-int vm4 -- set interface vm4 type=internal
- ip link set vm4 address 02:ac:10:ff:01:95
- ip link set vm4 netns vm4
- ovs-vsctl set Interface vm4 external_ids:iface-id=inside-vm4
- ip netns exec vm4 dhclient vm4
- ip netns exec vm4 ip addr show vm4
- ip netns exec vm4 ip route show
測試網(wǎng)絡(luò)連通性
在ubuntu2上,從vm1測試網(wǎng)絡(luò)連通性:
- # ping vm1的默認(rèn)網(wǎng)關(guān)
- root@ubuntu2:~# ip netns exec vm1 ping 172.16.255.129
- PING 172.16.255.129 (172.16.255.129) 56(84) bytes of data.
- 64 bytes from 172.16.255.129: icmp_seq=1 ttl=254 time=0.689 ms
- 64 bytes from 172.16.255.129: icmp_seq=2 ttl=254 time=0.393 ms
- 64 bytes from 172.16.255.129: icmp_seq=3 ttl=254 time=0.483 ms
- # 從 overlay網(wǎng)絡(luò)ping vm2(跨越整個(gè) tenant1)
- root@ubuntu2:~# ip netns exec vm1 ping 172.16.255.131
- PING 172.16.255.131 (172.16.255.131) 56(84) bytes of data.
- 64 bytes from 172.16.255.131: icmp_seq=1 ttl=64 time=2.16 ms
- 64 bytes from 172.16.255.131: icmp_seq=2 ttl=64 time=0.573 ms
- 64 bytes from 172.16.255.131: icmp_seq=3 ttl=64 time=0.446 ms
- # 經(jīng)過 router ping通 vm3(跨越整個(gè) overlay網(wǎng)絡(luò))
- root@ubuntu2:~# ip netns exec vm1 ping 172.16.255.194
- PING 172.16.255.194 (172.16.255.194) 56(84) bytes of data.
- 64 bytes from 172.16.255.194: icmp_seq=1 ttl=63 time=1.37 ms
- 64 bytes from 172.16.255.194: icmp_seq=2 ttl=63 time=0.077 ms
- 64 bytes from 172.16.255.194: icmp_seq=3 ttl=63 time=0.076 ms
- #經(jīng)過 router ping 通vm4(跨越整個(gè) overlay網(wǎng)絡(luò))
- root@ubuntu2:~# ip netns exec vm1 ping 172.16.255.195
- PING 172.16.255.195 (172.16.255.195) 56(84) bytes of data.
- 64 bytes from 172.16.255.195: icmp_seq=1 ttl=63 time=1.79 ms
- 64 bytes from 172.16.255.195: icmp_seq=2 ttl=63 time=0.605 ms
- 64 bytes from 172.16.255.195: icmp_seq=3 ttl=63 time=0.503 ms
結(jié)語
OVN使得第三層overlay網(wǎng)絡(luò)易于部署和管理。 另外像DHCP的服務(wù)直接構(gòu)建到系統(tǒng)中的方式,有助于減少構(gòu)建有效的SDN解決方案所需的外部組件的數(shù)量。 在下一篇文章中,將討論如何將我們(當(dāng)前隔離的)overlay網(wǎng)絡(luò)連接到外部世界。
譯者簡介:鄭敏先,就職于諾云系統(tǒng)(上海)有限公司。工作地點(diǎn)為南京的諾云研發(fā)中心。擔(dān)任解決方案工程師。