昨天我們看到建立OpenStack的Netwok時,OVN其實也建立一個logical switch,所以OpenStack的網路模型與OVN,實際上是有著某種對應的關係;再加上我們之前學到的OVN相關的知識,在底層的主機上,在OVN的logical switch建立後,也會有相對應的bridge與port等資源被建立出來。我們把OpenStack-OVN-Host三種之間的關連一起呈現出來,我們今天就深入的看一下,OpenStack建立網路時,到底發生了什麼事情吧。
76af9b
的Network,也可以看到有一個port, id為06ff4f
。特別注意,因為Subnet還沒建立,所以目前還不知道Network會使用到的IP範.# create network
openstack network create --provider-network-type local n1
openstack network list -f yaml | abbrev
- ID: 76af9b
Name: n1
Subnets: []
openstack port list -f yaml | abbrev
- Fixed IP Addresses: []
ID: 06ff4f
MAC Address: fa:16:3e:44:1c:b4
Name: ''
Status: DOWN
在OVN上會建立一個logical switch。, 對應的OVN switch 名稱為neutron-76af9b
,同時也有一個type為localport的port, 名稱為06ff4f
. 此時可以看到,logical switch和logical port的名稱,和OpenStack上的Network與Port的名稱互相對應。以及Port的MAC address也是相同的。
ovn-nbctl show | abbrev
switch 1e1fc7 (neutron-76af9b) (aka n1)
port 06ff4f
type: localport
addresses: ["fa:16:3e:44:1c:b4"]
# create subnet
openstack subnet create --subnet-range 172.16.100.0/24 --network n1 n1subnet
剛建立的Subnet, 已經綁定在Network n1上,同時剛剛還未取得IP的Port, 也從這個Subnet取得一個IP.
$ openstack network list -f yaml | abbrev
- ID: 76af9b
Name: n1
Subnets:
- 363f1c
openstack port list -f yaml | abbrev
- Fixed IP Addresses:
- ip_address: 172.16.100.2
subnet_id: 363f1c
ID: 06ff4f
MAC Address: fa:16:3e:44:1c:b4
Name: ''
Status: DOWN
再看一次logical switch,也確實看到localport Port也取得相同的IP。
ovn-nbctl show | abbrev
switch 1e1fc7 (neutron-76af9b) (aka n1)
port 06ff4f
type: localport
addresses: ["fa:16:3e:44:1c:b4 172.16.100.2"]
171d5d
。同時也可以發現OVN的logical switch port也新增了一個171d5d
port。# 建立instance
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 port list -f yaml | abbrev
- Fixed IP Addresses:
- ip_address: 172.16.100.10
subnet_id: 363f1c
ID: 171d5d
MAC Address: fa:16:3e:d8:74:e8
Name: ''
Status: ACTIVE
- Fixed IP Addresses:
- ip_address: 172.16.100.2
subnet_id: 363f1c
ID: 06ff4f
MAC Address: fa:16:3e:44:1c:b4
Name: ''
Status: DOWN
$ ovn-nbctl show | abbrev
switch 1e1fc7 (neutron-76af9b) (aka n1)
port 06ff4f
type: localport
addresses: ["fa:16:3e:44:1c:b4 172.16.100.2"]
port 171d5d
addresses: ["fa:16:3e:d8:74:e8 172.16.100.10"]
tap171d5d09-bd
和openstack的port相呼應。這個名為tap171d5d09-bd
的tun設備被掛到br-int上。$ ip -c link show type tun
16: tap171d5d09-bd: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master ovs-system state UNKNOWN mode DEFAULT group default qlen 1000
link/ether fe:16:3e:a9:09:cd brd ff:ff:ff:ff:ff:ff
$ ovs-vsctl show
a43aeaaa-02cf-4c95-a4de-ff327c486f6d
Manager "ptcp:6640:127.0.0.1"
is_connected: true
Bridge br-int
fail_mode: secure
datapath_type: system
Port tap53f016af-90
Interface tap53f016af-90
Port br-int
Interface br-int
type: internal
Port tap171d5d09-bd
Interface tap171d5d09-bd
ovs_version: "2.17.4"
在介紹OVN時,我們都是用veth pair來模擬VM裡的NIC,實際上,OpenStack的instance,是使用主機上的
tapxxxxxxxx-yy
這個虛擬設備,做為VM的網路卡。
tap171d5d09-bd
是和logical switch上的port 171d5d
做綁定,於是vm 就加到logical switch上。這個綁定的動作,和[[Day-03_OVN-DHCP#logical switch 與 veth 之間的綁定]]的操作是一樣的,只是OpenStack已經幫我們做好綁定,這裡我們只是查詢tap171d5d09-bd
和logical port 171d5d
的關係。$ ovs-vsctl list interface tap171d5d09-bd | abbrev |grep external_ids
external_ids : {attached-mac="fa:16:3e:d8:74:e8", iface-id="171d5d", iface-status=active, ovn-installed="true", ovn-installed-ts="1668046019714", vm-uuid="9f7713"}
這今天的圖裡,在主機的br-int上,除了tapxxxxxxxx-yy
這個虛擬的tun網路設備外(綠色表示),還有另一種veth的虛擬設備(用黃色表示)存在。而veth會與一個名稱為ovnmeta-xxxxx
的namespace連接。這個namespace的主要作用,是為了提供OpenStack裡的metadata service。至於metadata serivce,我們之後會再進一步分析。今天先來看一下ovnmeta-xxxxx
的namespace是如何和logical switch建立起關連的吧。
ip -c link show type veth
tap76af9baf-90@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master ovs-system state UP mode DEFAULT group default qlen 1000
link/ether ea:ae:de:7e:7f:4d brd ff:ff:ff:ff:ff:ff link-netns ovnmeta-738a1219-95ea-44bd-a080-148b11df1ee8
ovnmeta-76af9b
Linux namespace。 ip netns
ovnmeta-76af9baf-9fa4-4631-8f1d-5610ef87a036 (id: 0)
tap76af9b-XX
的veth pair. 一端掛在ovnmeta-76af9b
,另一端掛在br-int。# 檢查 ovnmeta-76af9b內的link
$ ip netns exec ovnmeta-76af9baf-9fa4-4631-8f1d-5610ef87a036 ip link
...
2: tap76af9baf-91@if17: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
link/ether fa:16:3e:9d:cc:52 brd ff:ff:ff:ff:ff:ff link-netnsid 0
$ ip link
...
17: tap76af9baf-90@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master ovs-system state UP mode DEFAULT group default qlen 1000
link/ether 86:9f:7f:6e:50:b9 brd ff:ff:ff:ff:ff:ff link-netns ovnmeta-53f016af-9fa4-4631-8f1d-5610ef87a036
# tap76af9baf-91@if17 & tap76af9baf-90@if2 互為peer
# 檢查br-int上的port
$ ovs-vsctl show
a43aeaaa-02cf-4c95-a4de-ff327c486f6d
Manager "ptcp:6640:127.0.0.1"
is_connected: true
Bridge br-int
fail_mode: secure
datapath_type: system
Port tap76af9baf-90
Interface tap76af9baf-90
Port br-int
Interface br-int
type: internal
tap76af9baf-90
是和logical switch上的port 06ff4f
做綁定,於是ovnmeta-76af9b
namespace 就加到logical switch上$ ovs-vsctl list interface tap76af9baf-90 | abbrev |grep external_ids
external_ids : {iface-id="06ff4f"}
我們今天從OpenStack建立一個Network開始,將OpenStack Network與 OVN logical switch,及OVN logical switch 與 OpenVSwirch 的關係串連起來。現在,你應該已經知道,建立VM時,OpenStack實際上幫我們對OVN做了多少事情了吧。