iT邦幫忙

2023 iThome 鐵人賽

DAY 9
0
DevOps

在OpenStack Neutron的ovn-networking裡挖呀挖呀挖系列 第 9

Day-09: 在OpenStack 上建立Network

  • 分享至 

  • xImage
  •  

安裝OpenStack 測試環境

我們再來會使用packstack建立OpenStack環境進行學習,packstack有提供很多的參數,可以讓我們依不同的情境建立不同架構的OpenStack。今天,我們先建立一個單一節點的OpenStack,這個OpenStack只能建立 local這個種類的虛擬網路。正常的情況下,local類型的網路不會有人使用,但做為用來理解Neutron如何和OVN合作建立虛擬網路,是一個很好的開始。

可以用下面的指令,建立一個最簡單的環境出來,之後隨著我們要驗證的架構不同,只要稍為修改參數,就可以建立不同形式的環境來學習,很方便的。

$ packstack --allinone \
	  --nova-libvirt-virt-type=kvm                     \
      --keystone-admin-passwd=password                 \
      --os-debug-mode=y                                \
      --provision-demo=n                               \
      --os-neutron-ml2-type-drivers=local              \
      --os-neutron-ml2-tenant-network-types=local      \
      --os-neutron-ml2-mechanism-drivers=ovn           \
      --os-neutron-l2-agent=ovn                        \
      --os-cinder-install=n                            \
      --os-swift-install=n                             \
      --os-aodh-install=n                              \
      --os-ceilometer-install=n

或是直接用準備好的Vagrantfile 透過vagrant建立也是可以。不過這個VM會需要8G的RAM,大家要注意自己電腦夠不夠跑。

git clone https://github.com/ogre0403/iTHome-2023
cd iTHome-2023/day-09
vagrant up

建立OpenStack Network

今天我們先從OpenStack開始,來了解一下怎麼在OpenStack建立虛擬網路,並且建立VM讓這些VM互相通信。下面就是預計要完成的OpenStack網路長像。這裡建立了二個OpenStack的Network,都是屬於local這個類形;左邊的Network有二個VM,右邊的Network有一個VM。很直覺地左手邊的二個VM因為在同一個Network裡,所以可以互相通信;右手邊的第三個VM,和另外二個VM不在同一個網路,所以無法連通。另外,圖中也把OpenStack裡的 port 這個概念也描述出來,等等我們再一起說明吧,先來看怎麼在OpenStack上把這個架構建立出來。

gh

我們的範例是透過openstack command 來建立,先依下列指令登入OpneStack後,後面的操作就直接ctrl-c、ctrl-v照做就可以囉。

# 登入openstakc VM
vagrant ssh
  
# 切換root,使用家目錄下的openstakc的keyfile 
sudo su
cd 
source keystonerc_admin

第一個Network

  1. 建立type為local的Network 與 使用的Subnet
openstack network create --provider-network-type local n1
openstack subnet  create --subnet-range 172.16.100.0/24 --network n1 n1subnet
  1. 建立二個instance, 指定使用前一步建立的Network以及分配static IP
IMAGE_ID=$(openstack image show cirros --format json | jq -r .id)

openstack server create --nic net-id=n1,v4-fixed-ip=172.16.100.10 --flavor m1.nano --image $IMAGE_ID vm_1
openstack server create --nic net-id=n1,v4-fixed-ip=172.16.100.20 --flavor m1.nano --image $IMAGE_ID vm_2
  1. 登入instance互ping
    如果有使用OpenStack的Dashboard的話,可以直接透過web點開二個instance 直接ping;若沒有用Dashboard的話,我們也可以用virsh 在terminal上登入instance。
#顯示目前建立的二個instance
virsh list

 Id   Name                State
-----------------------------------
 1    instance-00000001   running
 2    instance-00000002   running
#透過id 打開 instance的console,用 'cirros' & 'gocubsgo' 登入
virsh console 1

  ____               ____  ____
 / __/ __ ____ ____ / __ \/ __/
/ /__ / // __// __// /_/ /\ \
\___//_//_/  /_/   \____/___/
   http://cirros-cloud.net


login as 'cirros' user. default password: 'gocubsgo'. use 'sudo' for root.
vm-1 login:

第二個Network

第二個Network完全相同的作法,大家自己試試吧

openstack network create --provider-network-type local n2
openstack subnet  create --subnet-range 192.168.200.0/24 --network n2 n2subnet
IMAGE_ID=$(openstack image show cirros --format json | jq -r .id)

openstack server create --nic net-id=n2,v4-fixed-ip=192.168.200.30 --flavor m1.nano --image $IMAGE_ID vm_3

OpenStack網路與 OVN的關連

觀查OpenStack上建立出來的資源

因為OpenStack資源的ID都是UUID的格式,長度太長不易閱讀,所以之後所有顯示的UUID,都只會取其前六個字元表示。

  1. 列出目前建立的OpenStack 網路,現在應該會有二個
openstack network list

+--------+------+--------+
| ID     | Name | Subnets|
+--------+------+--------+
| b95d97 | n2   | 504a3e |
| c51354 | n1   | 8f6107 |
+--------+------+--------+
  1. 列出目前建立的OpenStack port, 目前應該會有5個

Port在OpenStack官方文件的定義,

port is a connection point for attaching a single device, such as the NIC of a server, to a network. The port also describes the associated network configuration, such as the MAC and IP addresses to be used on that port.

Port 是一個抽象的概念,我們可以理解成是OpenStack用於表示一個虛擬機器(VM)或OpenStack上其他類型的資源與底層網絡之間的連接點。那Port又是如何與底層網絡建立連接的關係呢?我們等下就來看看,先來看一下這裡列出的Port,透過使用的IP分為二大類,一類是屬於第一個Network(172.16.100.0/24);另一類是屬於第二個Network(192.168.200.0/24)。應該可以注意到,每一個VM所使用的IP,都會有一個相對應的Port存在;另外,每個Network都還預先使用了.2這個IP。這個是OpenStack的metadata在用的IP,過幾天也會說明。

openstack port list 

+--------+------+-------------------+--------------------------------------------------+--------+
| ID     | Name | MAC Address       | Fixed IP Addresses                               | Status |
+--------+------+-------------------+--------------------------------------------------+--------+
| 23cb33 |      | fa:16:3e:03:33:b4 | ip_address='172.16.100.20',  subnet_id='8f6107'  | ACTIVE |
| 4b34ef |      | fa:16:3e:31:ab:ca | ip_address='172.16.100.10',  subnet_id='8f6107'  | ACTIVE |
| 6508f1 |      | fa:16:3e:ce:e2:8a | ip_address='192.168.200.2',  subnet_id='504a3e'  | DOWN   |
| 8ddc40 |      | fa:16:3e:77:1e:6e | ip_address='172.16.100.2',   subnet_id='8f6107'  | DOWN   |
| e5bfc6 |      | fa:16:3e:f6:9d:72 | ip_address='192.168.200.30', subnet_id='504a3e'  | ACTIVE |
+--------+------+-------------------+--------------------------------------------------+--------+

OVN 上的logical Switch

我們在回來用ovn-nbctl看一下目前有那些logical switch。可以看到現在有二個logical switch, 共有5個port, 在第一個switch上有三個port,在第二個switch上有二個port。到目前,細心的小夥伴是不是開始覺得與剛剛看到的OpenStack的Netwrok 和 Port的數量是相對應的。不只如此,我們再細看logical switch的名字與logical switch port的名字,是不是注意到在OpenStack上所使用的UUID,剛好和OVN的logical switch與logical port的名字完全是一對一的對應呢?

ovn-nbctl show

switch a198c4 (neutron-b95d97) (aka n2)
    port 6508f1
        type: localport
        addresses: ["fa:16:3e:ce:e2:8a 192.168.200.2"]
    port e5bfc6
        addresses: ["fa:16:3e:f6:9d:72 192.168.200.30"]
switch 09eaf3 (neutron-c51354) (aka n1)
    port 8ddc40
        type: localport
        addresses: ["fa:16:3e:77:1e:6e 172.16.100.2"]
    port 4b34ef
        addresses: ["fa:16:3e:31:ab:ca 172.16.100.10"]
    port 23cb33
        addresses: ["fa:16:3e:03:33:b4 172.16.100.20"]

如果看指令的結果不清楚的話,依照前幾天介紹OVN的方式,把logical switch和之上的port把他畫出來,再與今天要完成的OpenStack網路對比一下,是不是完全相同。

gh

所以,以OpenStack的角度來看,在同一個Network下的二個VM網路可以互通,其實就是對應到之前介紹的OVN的一個logical switch上的二個namespace可以互相通信的原理。如此一來,是不是就把OpenStack與OVN二者之間的關係結合起來呢。


今天的最後,我們來回憶一下第一天曾提到我所使用的OVN架構圖與 OVN 官方文件上稍有不同。官網上是由 CMS(Cloud Manager System) 寫入 Northbound Database,但我使用的是 ovn-nbctl。今天我們把第一天的架構圖稍加修改,把ovn-nbctl換成CMS(可以想像就是OpenStack),CMS 先將建立的 Network 模型轉換成 OVN 邏輯網路的描述,然後再將其寫入 Northbound Database。再注意到今天一開始packstack的有使用--os-neutron-l2-agent=ovn參數,就是對應到圖中,OpenStack的Neutron會使用OVN driver和North bound DB溝通。現在,是不是更能理解OVN與OpenStack的關連了呢?

gh


上一篇
Day-08: 只能和本地溝通的localport
下一篇
Day-10: OpenStack-OVN-主機 三者間的關係
系列文
在OpenStack Neutron的ovn-networking裡挖呀挖呀挖30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言