SDN控制器之OVN實驗一:介紹和安裝OVN
OVN概覽
OVN是由開發出OVS的那群出色的程式設計師們的另一個優秀的作品。這個網路虛擬化專案從2015初宣告啟動,到不久前才釋出第一個正式版本OVN 2.6 。在這篇文章中,我會配置一個簡單示例:在三個主機之間配置一個layer-2 overlay網路。
首先講一下OVN工作機制中的2種角色:
-
OVN Central ——目前只能有一臺主機承擔這個角色。該主機將成為和外部資源(比如雲管理平臺)整合的API中心節點。中心節點執行著OVN北向資料庫和OVN南向資料庫。OVN北向資料庫,用於描述上層的邏輯網路元件,比如邏輯交換機/邏輯埠。南向資料庫,其將北向資料庫的邏輯網路資料格式轉換為物理網路資料格式並進行儲存。
-
OVN Host ——所有提供虛擬機器或虛擬網路的節點。OVN Host執行著 "chassis controller",它上連OVN南向資料庫並作為其記錄的物理網路資訊授權來源,下接OVS併成為其openflow控制器。
實驗環境
本次實驗中使用了3臺Ubuntu 16.04主機
OVN實驗拓撲: 3臺Ubuntu 16.04主機都連線到同一個管理網路 10.127.0.0/25
主機的角色和IP地址分配如下:
-
ubuntu1 10.127.0.2 –作為OVN Central
-
ubuntu2 10.127.0.3 –作為 OVN Host
-
ubuntu3 10.127.0.4 –作為OVN Host
物理網路拓撲圖如下:
為了方便測試,將會建立OVS內部介面並在網路名稱空間(namespace)中使用沙盒技術來模擬虛擬機器。名稱空間能保證我們的OVN overlay網路與實驗網路完全隔離。
編譯Open vSwitch 2.6
2016年9月28日社群釋出了 Open vSwitch 2.6版本,可以從 這裡下載。下載包中的Ubuntu的指導手冊 INSTALL.Debian.md 非常不錯。下面是按照這個指導手冊進行實驗後的總結:
首先為三臺主機編譯出相應的版本的OVS(注意ubuntu核心版本)
更新和安裝依賴包:
apt-get update
apt-get -y install build-essential fakeroot
安裝編譯工具包:
apt-get -y install graphviz autoconf automake bzip2 debhelper dh-autoreconf libssl-dev libtool openssl
apt-get -y install procps python-all python-twisted-conch python-zopeinterface python-six
進行編譯:
cd openvswitch-2.6.0
dpkg-checkbuilddeps
`DEB_BUILD_OPTIONS='parallel=8 nocheck' fakeroot debian/rules binary`
生成的OVS的.deb檔案路徑為當前路徑的上一層目錄。
下面會編譯openvswitch-datapath核心模組
安裝datapath源:
cd ..
apt-get -y install module-assistant
dpkg -i openvswitch-datapath-source_2.6.0-1_all.deb
使用 module-assistant編譯核心模組
m-a prepare
m-a build openvswitch-datapath
複製生成的deb包。你們重複這個實驗時注意,版本號跟這裡的輸出的可能存在不同。
cp /usr/src/openvswitch-datapath-module-*.deb ./
把下面的這些包傳到三臺Ubuntu主機上:
-
openvswitch-datapath-module-*.deb
-
openvswitch-common_2.6.0-1_amd64.deb
-
openvswitch-switch_2.6.0-1_amd64.deb
-
ovn-common_2.6.0-1_amd64.deb
-
ovn-central_2.6.0-1_amd64.deb
-
ovn-host_2.6.0-1_amd64.deb
安裝 Open vSwitch
-
在ubuntu1上安裝 OVS/OVN和依賴包:
-
apt-get update
-
apt-get -y install python-six python2.7
-
dpkg -i openvswitch-datapath-module-*.deb
-
dpkg -i openvswitch-common_2.6.0-1_amd64.deb openvswitch-switch_2.6.0-1_amd64.deb
-
dpkg -i ovn-common_2.6.0-1_amd64.deb ovn-central_2.6.0-1_amd64.deb ovn-host_2.6.0-1_amd64.deb
-
在ubuntu2、ubuntu3上安裝 OVS/OVN 和依賴包:
-
apt-get update
-
apt-get -y install python-six python2.7
-
dpkg -i openvswitch-datapath-module-*.deb
-
dpkg -i openvswitch-common_2.6.0-1_amd64.deb openvswitch-switch_2.6.0-1_amd64.deb
-
dpkg -i ovn-common_2.6.0-1_amd64.deb ovn-host_2.6.0-1_amd64.deb
這些包安裝完成後,去ubuntu1上檢查下ovsdb-server程序是否監聽TCP 6641,6642埠。6641埠用於監聽OVN北向資料庫,6642埠用於監聽OVN南向資料庫。下面是我執行netstat的輸出結果:
-
[email protected]:~# netstat -lntp
-
Active Internet connections (only servers)
-
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
-
tcp 0 0 0.0.0.0:6641 0.0.0.0:* LISTEN 1798/ovsdb-server
-
tcp 0 0 0.0.0.0:6642 0.0.0.0:* LISTEN 1806/ovsdb-server
-
-
ovn-nbctl set-connection ptcp:6641:10.127.0.2
-
ovn-sbctl set-connection ptcp:6642:10.127.0.2
如果 ovsdb-server沒有使用 6641/6642那麼需要通過執行啟動指令碼來啟動這些程序。啟動指令碼路徑為/etc/init.d/openvswitch-switch和 /etc/init.d/ovn-central。
建立整合化網橋
OVS的網橋要連線到一個整合化網橋後才能夠被OVN管理。通常我們給這個整合化網橋命名為"br-int"(其實可以任意命名)。首先檢查環境中是否存在這個網橋,不存在的話進行就建立。
在ubuntu2、ubuntu3上:
ovs-vsctl list-br
如果看不到"br-int"網橋,那麼需要手工建立。注意:所有執行虛擬機器的節點都要存在"br-int"網橋。
ovs-vsctl add-br br-int -- set Bridge br-int fail-mode=secure
ovs-vsctl list-br
"fail-mode=secure"是一個安全特性,其讓網橋丟掉任何流量。這裡用這個引數是因為我們不想在OVN控制器啟用前使用網路。
將Chassis 控制器連線到中央控制器
接下來將ubuntu2/ubuntu3上的chassis控制器連線到ubuntu 1上的中央控制器
-
ubuntu2:
-
ovs-vsctl set open . external-ids:ovn-remote=tcp:10.127.0.2:6642
-
ovs-vsctl set open . external-ids:ovn-encap-type=geneve
-
ovs-vsctl set open . external-ids:ovn-encap-ip=10.127.0.3
-
ubuntu3:
-
ovs-vsctl set open . external-ids:ovn-remote=tcp:10.127.0.2:6642
-
ovs-vsctl set open . external-ids:ovn-encap-type=geneve
-
ovs-vsctl set open . external-ids:ovn-encap-ip=10.127.0.4
這些命令將觸發ubuntu2/ubuntu3上的OVN chassis控制器發起一個到ubuntu 1上的中央控制器的連線。我們同時指定了overlay網路封裝資料平面流量的協議為 geneve 協議。
在ubuntu2/ubuntu3使用netstat校驗連線是否建立:
-
[email protected]:~# netstat -antp | grep 10.127.0.2
-
tcp 0 0 10.127.0.4:39256 10.127.0.2:6642 ESTABLISHED 3072/ovn-controller
建立邏輯網路
下圖是本次實驗的OVN邏輯網路拓撲圖。
在ubuntu1定義一臺邏輯交換機和相關的邏輯埠:
-
# 建立logical switch
-
ovn-nbctl ls-add ls1
-
# 建立 logical port
-
ovn-nbctl lsp-add ls1 ls1-vm1
-
ovn-nbctl lsp-set-addresses ls1-vm1 02:ac:10:ff:00:11
-
ovn-nbctl lsp-set-port-security ls1-vm1 02:ac:10:ff:00:11
-
# 建立 logical port
-
ovn-nbctl lsp-add ls1 ls1-vm2
-
ovn-nbctl lsp-set-addresses ls1-vm2 02:ac:10:ff:00:22
-
ovn-nbctl lsp-set-port-security ls1-vm2 02:ac:10:ff:00:22
-
ovn-nbctl show
注意,虛擬埠的名稱是唯一的,不能重複。虛擬埠同時也會生成一個很長的UUID。本文使用更加人性化的埠名稱來代表這些埠。我們同時定義了這些虛擬埠的mac地址。在埠安全實驗(邏輯埠只允許特定的源mac地址資料包通過)將用到這些mac地址。
新增 "偽虛擬機器"
接下來建立連線到邏輯交換機的"偽虛擬機器"。上文已經提到,我們會使用OVS內部埠和網路名稱空間來模擬虛擬機器。我們會給這臺邏輯交換機分配172.16.255.0/24網路。
-
ubuntu2:
-
ip netns add vm1
-
ovs-vsctl add-port br-int vm1 -- set interface vm1 type=internal
-
ip link set vm1 netns vm1
-
ip netns exec vm1 ip link set vm1 address 02:ac:10:ff:00:11
-
ip netns exec vm1 ip addr add 172.16.255.11/24 dev vm1
-
ip netns exec vm1 ip link set vm1 up
-
ovs-vsctl set Interface vm1 external_ids:iface-id=ls1-vm1
-
ip netns exec vm1 ip addr show
-
ubuntu3:
-
ip netns add vm2
-
ovs-vsctl add-port br-int vm2 -- set interface vm2 type=internal
-
ip link set vm2 netns vm2
-
ip netns exec vm2 ip link set vm2 address 02:ac:10:ff:00:22
-
ip netns exec vm2 ip addr add 172.16.255.22/24 dev vm2
-
ip netns exec vm2 ip link set vm2 up
-
ovs-vsctl set Interface vm2 external_ids:iface-id=ls1-vm2
-
ip netns exec vm2 ip addr show
如果你從沒接觸過名稱空間或者OVS,也許會對這些命令很困惑。
其實我們進行了如下幾步操作:
給"偽虛擬機器"建立了網路名稱空間,
再給它新增一個OVS內部埠,
再把埠新增到名稱空間,
在名稱空間內部使用netns exec命令配置 IP地址
最後建立一個OVS介面,並給這個介面指定一個external_id。(這個ID是之前建立的邏輯介面的名稱或UUID)
最後一步執行完成後,OVS就會通知OVN有邏輯埠上線了。然後,OVN向下遊主機的本地chassis控制器傳送指令,同時 OVN也會將網路流量傳遞給上游的OVS。
注意,我已明確地給這些介面設定了與OVN邏輯交換機中相同的mac地址。這非常重要。如果mac地址沒有對映正確,邏輯網路就不會正常工作。請記住,我在這裡沒有使用常規流程。正常情況下,你不會更改VM的MAC地址,而是將現有的/已知的mac地址傳遞入OVN / OVS。我為了演示方便才手動設定IP/mac地址。
測試網路連通性
在 ubuntu1,我們使用ovn-sbctl驗證邏輯網路配置 :
-
[email protected]:~# ovn-sbctl show
-
Chassis "239f2c28-90ff-468f-a701-655585c630bf"
-
hostname: "ubuntu3"
-
Encap geneve
-
ip: "10.127.0.4"
-
options: {csum="true"}
-
Port_Binding "ls1-vm2"
-
Chassis "517d558e-158a-4cb2-8870-283e9d39685e"
-
hostname: "ubuntu2"
-
Encap geneve
-
ip: "10.127.0.3"
-
options: {csum="true"}
-
Port_Binding "ls1-vm1"
重點檢查每個OVN主機的埠繫結是否正常。
為了測試網路連通性,我們只需從vm1的名稱空間發起ping:
-
[email protected]:~# ip netns exec vm1 ping 172.16.255.22
-
PING 172.16.255.22 (172.16.255.22) 56(84) bytes of data.
-
64 bytes from 172.16.255.22: icmp_seq=1 ttl=64 time=1.60 ms
-
64 bytes from 172.16.255.22: icmp_seq=2 ttl=64 time=0.638 ms
-
64 bytes from 172.16.255.22: icmp_seq=3 ttl=64 time=0.344 ms
新增和遷移一個第三方 "虛擬機器"
讓我們新增一個第三方"虛擬機器",然後在主機之間遷移它。首先,在ubuntu1上使用ovn-nbctl定義其邏輯埠:
-
ovn-nbctl lsp-add ls1 ls1-vm3
-
ovn-nbctl lsp-set-addresses ls1-vm3 02:ac:10:ff:00:33
-
ovn-nbctl lsp-set-port-security ls1-vm3 02:ac:10:ff:00:33
-
ovn-nbctl show
-
然後在ubuntu2上給這臺虛擬機器建立介面:
-
ip netns add vm3
-
ovs-vsctl add-port br-int vm3 -- set interface vm3 type=internal
-
ip link set vm3 netns vm3
-
ip netns exec vm3 ip link set vm3 address 02:ac:10:ff:00:33
-
ip netns exec vm3 ip addr add 172.16.255.33/24 dev vm3
-
ip netns exec vm3 ip link set vm3 up
-
ovs-vsctl set Interface vm3 external_ids:iface-id=ls1-vm3
-
ip netns exec vm3 ip addr show
-
從vm3測試網路:
-
[email protected]:~# ip netns exec vm3 ping 172.16.255.22
-
PING 172.16.255.22 (172.16.255.22) 56(84) bytes of data.
-
64 bytes from 172.16.255.22: icmp_seq=1 ttl=64 time=2.04 ms
-
64 bytes from 172.16.255.22: icmp_seq=2 ttl=64 time=0.337 ms
-
64 bytes from 172.16.255.22: icmp_seq=3 ttl=64 time=0.536 ms
-
注意ubuntu1上的OVN南向資料庫配置。我們看到ubuntu2有2個註冊的埠繫結。
-
[email protected]:~# ovn-sbctl show
-
Chassis "239f2c28-90ff-468f-a701-655585c630bf"
-
hostname: "ubuntu3"
-
Encap geneve
-
ip: "10.127.0.4"
-
options: {csum="true"}
-
Port_Binding "ls1-vm2"
-
Chassis "517d558e-158a-4cb2-8870-283e9d39685e"
-
hostname: "ubuntu2"
-
Encap geneve
-
ip: "10.127.0.3"
-
options: {csum="true"}
-
Port_Binding "ls1-vm3"
-
Port_Binding "ls1-vm1"
-
為了模擬vm3的遷移,我們將刪除ubuntu2上的"vm3"名稱空間,刪除其在br-int上的埠,然後在ubuntu3上重新進行配置。
-
ubuntu2:
-
ip netns del vm3
-
ovs-vsctl --if-exists --with-iface del-port br-int vm3
-
ovs-vsctl list-ports br-int
-
ubuntu3:
-
ip netns add vm3
-
ovs-vsctl add-port br-int vm3 -- set interface vm3 type=internal
-
ip link set vm3 netns vm3
-
ip netns exec vm3 ip link set vm3 address 02:ac:10:ff:00:33
-
ip netns exec vm3 ip addr add 172.16.255.33/24 dev vm3
-
ip netns exec vm3 ip link set vm3 up
-
ovs-vsctl set Interface vm3 external_ids:iface-id=ls1-vm3
-
測試網路連通性:
-
[email protected]:~# ip netns exec vm3 ping 172.16.255.11
-
PING 172.16.255.11 (172.16.255.11) 56(84) bytes of data.
-
64 bytes from 172.16.255.11: icmp_seq=1 ttl=64 time=1.44 ms
-
64 bytes from 172.16.255.11: icmp_seq=2 ttl=64 time=0.407 ms
-
64 bytes from 172.16.255.11: icmp_seq=3 ttl=64 time=0.395 ms
-
同樣,請注意ubuntu1上的OVN南向資料庫配置。我們看到埠繫結已經改變。
-
[email protected]:~# ovn-sbctl show
-
Chassis "239f2c28-90ff-468f-a701-655585c630bf"
-
hostname: "ubuntu3"
-
Encap geneve
-
ip: "10.127.0.4"
-
options: {csum="true"}
-
Port_Binding "ls1-vm2"
-
Port_Binding "ls1-vm3"
-
Chassis "517d558e-158a-4cb2-8870-283e9d39685e"
-
hostname: "ubuntu2"
-
Encap geneve
-
ip: "10.127.0.3"
-
options: {csum="true"}
-
Port_Binding "ls1-vm1"
清理環境
為了讓環境用於後面的其他實驗,我們在退出前需要清理環境。
-
ubuntu1:
-
#刪除邏輯交換機及其埠
-
ovn-nbctl ls-del ls1
-
ubuntu2:
-
# 刪除 vm1
-
ip netns del vm1
-
ovs-vsctl --if-exists --with-iface del-port br-int vm1
-
ubuntu3:
-
# delete vm2 和 vm3
-
ip netns del vm2
-
ovs-vsctl --if-exists --with-iface del-port br-int vm2
-
ip netns del vm3
-
ovs-vsctl --if-exists --with-iface del-port br-int vm3
結語
如您所見,使用OVN建立二層overlay網路相對簡單。在下一篇文章中,我們將通過引入OVN邏輯路由器來構建一個OVN基本的三層網路。
原文:https://blog.csdn.net/zhengmx100/article/details/71698641?utm_source=blogxgwz0