1. 程式人生 > >SDN控制器之OVN實驗六:配置整合容器的OVN網路

SDN控制器之OVN實驗六:配置整合容器的OVN網路

概覽

接著我的上一篇文章,本文討論的主題是整合的容器的OVN。 在本實驗結束時,我們將建立一個容器主機“VM”(虛擬機器),其中包含一對容器。 這些容器將直接繫結到OVN邏輯交換機中,並且可以直接從邏輯網路內的所有虛擬機器訪問。

OVN 容器網路模型

根據官方的OVN架構文件,OVN的容器網路選擇使用VLAN Trunk作為連線到容器主機VM的方式,並要求來自每個容器的流量被隔離在一個唯一的VLAN內。這也意味著在OVN和容器主機之間必須對VLAN資訊進行同步,以確保它們在同一時間給特定容器使用哪個VLAN tag。通過這種方式,它對容器主機施加了一定程度的控制,以確保主機上的容器被相互隔離。

我把OVN實現步驟細分為三步:

  • 建立一個連線主機VM的邏輯埠。

  • 為容器定義邏輯埠,將它們對映到“父”虛擬機器邏輯埠,並定義要使用的VLAN tag。

  • OVN配置OVS流,將被VLAN標記的流量從“父”虛擬機器的邏輯埠對映到目標容器的邏輯埠。

下圖描述了這種設計:

 

當前環境資訊

在開始之前,請花點時間看一下當前環境資訊。

物理網路拓撲:

 

OVN 邏輯網路拓撲:

 

定義邏輯網路

在本次實驗中,我將建立一個新的偽“虛擬機器”,vm5,它將託管我們的偽“容器”。新虛擬機器將接入到現有的DMZ交換機,和vm1和vm2相鄰。 我們將對新虛擬機器及其容器使用DHCP。在為vm5建立邏輯埠之前,我們需要檢視在上一篇文章中為DMZ網路建立的DHCP選項。 我們將直接查詢OVN北向資料庫以獲取此DHCP選項相關資訊。

我這個實驗環境的輸出結果是:

 

root@ubuntu1:~# ovn-nbctl list DHCP_Options

_uuid               : 7e32cec4-957e-46fa-a4cc-34218e1e17c8

cidr                : "172.16.255.192/26"

external_ids        : {}

options             : {lease_time="3600", router="172.16.255.193", server_id="172.16.255.193", server_mac="02:ac:10:ff:01:93"}

 

_uuid               : c0c29381-c945-4507-922a-cb87f76c4581

cidr                : "172.16.255.128/26"

external_ids        : {}

options             : {lease_time="3600", router="172.16.255.129", server_id="172.16.255.129", server_mac="02:ac:10:ff:01:29"}

我們獲取到了192.16.255.128/26”網路的UUID(在我的環境是c0c29381-c945-4507-922a-cb87f76c4581)。 捕獲此UUID以在稍後的命令中使用。

讓我們為vm5建立邏輯埠。 你現在應該對這些命令不陌生了。 請務必將{uuid}替換為上述DHCP選項條目中的UUID。

在ubuntu1上執行:

 

ovn-nbctl lsp-add dmz dmz-vm5

ovn-nbctl lsp-set-addresses dmz-vm5 "02:ac:10:ff:01:32 172.16.255.132"

ovn-nbctl lsp-set-port-security dmz-vm5 "02:ac:10:ff:01:32 172.16.255.132"

ovn-nbctl lsp-set-dhcpv4-options dmz-vm5 {uuid}

現在我們將為在vm5上執行的容器建立邏輯埠。 此過程幾乎與建立正常的邏輯埠相同,需要注意有幾個新的命令。

在ubuntu1上進行如下操作:

 

# 建立邏輯埠c51

ovn-nbctl lsp-add dmz dmz-c51

ovn-nbctl lsp-set-addresses dmz-c51 "02:ac:10:ff:01:33 172.16.255.133"

ovn-nbctl lsp-set-port-security dmz-c51 "02:ac:10:ff:01:33 172.16.255.133"

ovn-nbctl lsp-set-dhcpv4-options dmz-c51 {uuid}

 

#設定c51的父邏輯埠和vlan tag

ovn-nbctl set Logical_Switch_Port dmz-c51 parent_name=dmz-vm5

ovn-nbctl set Logical_Switch_Port dmz-c51 tag=51

 

#建立邏輯埠c52

ovn-nbctl lsp-add dmz dmz-c52

ovn-nbctl lsp-set-addresses dmz-c52 "02:ac:10:ff:01:34 172.16.255.134"

ovn-nbctl lsp-set-port-security dmz-c52 "02:ac:10:ff:01:34 172.16.255.134"

ovn-nbctl lsp-set-dhcpv4-options dmz-c52 {uuid}

 

#設定c52的父邏輯埠和vlan tag

ovn-nbctl set Logical_Switch_Port dmz-c52 parent_name=dmz-vm5

ovn-nbctl set Logical_Switch_Port dmz-c52 tag=52

因此,唯一的區別是為容器邏輯埠設定了一個parent_name和vlan tag。 您可以通過檢視資料庫條目來驗證這些。

我這個實驗環境的輸出結果是:

 

root@ubuntu1:~# ovn-nbctl find Logical_Switch_Port name="dmz-c51"

_uuid               : ea604369-14a9-4e25-998f-ec99c2e7e47e

addresses           : ["02:ac:10:ff:01:31 172.16.255.133"]

dhcpv4_options      : c0c29381-c945-4507-922a-cb87f76c4581

dhcpv6_options      : []

dynamic_addresses   : []

enabled             : []

external_ids        : {}

name                : "dmz-c51"

options             : {}

parent_name         : "dmz-vm5"

port_security       : ["02:ac:10:ff:01:31 172.16.255.133"]

tag                 : 51

tag_request         : []

type                : ""

up                  : false

 

配置 vm5

關於這個實驗的第一件事情是,我們沒有使用真正的虛擬機器,而是直接在Ubuntu主機上把ovs內部埠模擬成虛擬機器。 對於vm1,vm2,vm3和vm4,我們直接在br-int上建立這些內部埠,但對於vm5,我們的實驗要求有點不同,因此我們將使用專用的ovs網橋。 這個br-vm5的網橋不會由OVN管理,並且將模擬真實的容器主機VM內部的ovs網橋。 此網橋將為VM及其容器提供本地網路連線,並將執行VLAN tagging。

配置完成之後就是下圖:

我的實驗配置很簡單,我把容器都放在同一個邏輯交換機上。然而沒有要求必須這樣做,其實我可以將容器邏輯埠放置在任一臺邏輯交換機上。

 

第一步是建立vm5。 
在ubuntu2主機上進行如下操作:

 

#為vm5建立網橋

ovs-vsctl add-br br-vm5

 

#在br-vm5上建立到br-int的patch埠

ovs-vsctl add-port br-vm5 brvm5-brint -- set Interface brvm5-brint type=patch options:peer=brint-brvm5

 

#在br-int上建立到br-vm5 patch埠。 因為與vm5的連線的,所以將外部id設定為dmz-vm5。

ovs-vsctl add-port br-int brint-brvm5 -- set Interface brint-brvm5 type=patch options:peer=brvm5-brint

ovs-vsctl set Interface brint-brvm5 external_ids:iface-id=dmz-vm5

 

#在名稱空間中建立vm5。 vm5流量將被進行untag操作

ovs-vsctl add-port br-vm5 vm5 -- set interface vm5 type=internal

ip link set vm5 address 02:ac:10:ff:01:32

ip netns add vm5

ip link set vm5 netns vm5

ip netns exec vm5 dhclient vm5

通過ping vm5的預設閘道器來驗證網路連通性:

 

root@ubuntu2:~# ip netns exec vm5 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.797 ms

64 bytes from 172.16.255.129: icmp_seq=2 ttl=254 time=0.509 ms

64 bytes from 172.16.255.129: icmp_seq=3 ttl=254 time=0.404 ms

 

配置“容器”

現在vm5已經啟動了,我們可以配置它的偽“容器”。 除了vlan相關配置之外,它們看起來幾乎完全和我們的偽“虛擬機器”們一模一樣。

 

#在名稱空間中建立c51。 c51流量將打上vlan 51的tag

ip netns add c51

ovs-vsctl add-port br-vm5 c51 tag=51 -- set interface c51 type=internal

ip link set c51 address 02:ac:10:ff:01:33

ip link set c51 netns c51

ip netns exec vm5 dhclient c51

 

#在名稱空間中建立c52。 c52流量將打上vlan 52的tag

ip netns add c52

ovs-vsctl add-port br-vm5 c52 tag=52 -- set interface c52 type=internal

ip link set c52 address 02:ac:10:ff:01:34

ip link set c52 netns c52

ip netns exec c52 dhclient c52

測試網路連通性:

 

root@ubuntu2:~# ip netns exec c51 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=1.33 ms

64 bytes from 172.16.255.129: icmp_seq=2 ttl=254 time=0.420 ms

64 bytes from 172.16.255.129: icmp_seq=3 ttl=254 time=0.371 ms

 

root@ubuntu2:~# ip netns exec c52 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=1.53 ms

64 bytes from 172.16.255.129: icmp_seq=2 ttl=254 time=0.533 ms

64 bytes from 172.16.255.129: icmp_seq=3 ttl=254 time=0.355 ms

 

結語

如果按照ovn官方架構文件,直接在虛擬機器管理程式上執行容器,或者直接用patch埠連線到整合網橋,那麼在網路規模特別大的情況下,OVN系統可能會崩潰。

“巢狀”網路解決方案是很好的,因為它大大減少了整合橋上的VIF的數量,從而最小化容器本身的效能損失。

最後再說明一下,本實驗的重點不是建立一個完全真實的容器環境,而是展示OVN的內建的容器網路功能集。

原文:https://blog.csdn.net/zhengmx100/article/details/75433878