Metonymical Deflection

ゆるく日々のコト・たまにITインフラ

Open Stack Neutron環境構築 その4:NW設定と確認方法

ルータ作成やネットワーク&サブネット作成、そしてインスタンスの起動などについて記載していきます。
また、構成の詳細や、その確認方法についても後述します。

  1. 構成概要
  2. ルータ作成
  3. 外部NW(GW_NET)設定
  4. 内部NW(SV_NET)設定
  5. インスタンス(srv1)作成
  6. Trunk用NW(TR_NET)設定
  7. インスタンス(srv2)作成
  8. 構成詳細

1.構成概要

以下のようなNWを構築していきます。
f:id:metonymical:20190529163243p:plain
しかし、この図だけでは内部的なことはわからないため、8.構成詳細にて詳しく記載します。

なお、ダッシュボードにログインし、プロジェクト>ネットワーク>ネットワークトポロジーと進み、上記の画面を開いておいてください。2.~7.の作業を行うたびに、ネットワークトポロジーが少しづつ変化していく過程を確認できると思います。

2.ルータ作成

対象:Controllerのみ

openstack router create \
--distributed \
DV_RT

3.外部NW(GW_NET)設定

対象:Controllerのみ

3-1.NW作成
openstack network create \
--external \
--provider-network-type vlan \
--provider-physical-network physnet1 \
--provider-segment 30 \
GW_NET
3-2.サブネット作成
openstack subnet create \
--subnet-range 10.30.0.0/24 \
--no-dhcp \
--network GW_NET \
--allocation-pool start=10.30.0.128,end=10.30.0.223 \
GW_SNET
3-3.NWをルータにアタッチ
openstack router set \
--external-gateway GW_NET \
DV_RT
3-4.ポートとMACアドレステーブルの確認
#各Bridgeのポート番号を確認
ovs-ofctl show br-ens35
ovs-ofctl show br-int

#各BridgeのMACアドレステーブルを確認
ovs-appctl fdb/show br-ens35
ovs-appctl fdb/show br-int

4.内部NW(SV_NET)設定

対象:Controllerのみ

4-1.NW作成
openstack network create \
SV_NET
4-2.サブネット作成
openstack subnet create \
--subnet-range 192.168.200.0/24 \
--network SV_NET \
--dns-nameserver 8.8.8.8 \
SV_SNET
4-3.NWをルータにアタッチ
openstack router add \
subnet DV_RT \
SV_SNET

5.インスタンス(srv1)作成

対象:Controllerのみ

5-1.Flavor作成

簡易的なFlavorを作成しておきます。

#Cirros用
openstack flavor create \
--ram 512 \
--disk 1 \
m1

#Ubuntu
openstack flavor create \
--ram 512 \
--disk 10 \
m2
5-2.インスタンス(srv1)作成

compute01上にsrv1を作成します。

openstack server create \
--flavor m1 \
--image cirros-0.4.0 \
--availability-zone nova:compute01 \
--nic net-id=SV_NET \
srv1

6.Trunk用NW(TR_NET)設定

対象:Controllerのみ

6-1.NW作成
openstack network create \
--provider-network-type vlan \
--provider-physical-network physnet1 \
--provider-segment 300 \
TR_NET
6-2.サブネット作成
openstack subnet create \
--subnet-range 192.168.30.0/24 \
--network TR_NET \
--gateway 192.168.30.254 \
--allocation-pool start=192.168.30.128,end=192.168.30.223 \
--dns-nameserver 8.8.8.8 \
TR_SNET
6-3.親ポートの作成
openstack port create \
--network SV_NET P01
6-4.サブポートの作成

任意ですがDHCPで取得するアドレスを固定にしています。

openstack port create \
--network TR_NET P01_C01 \
--fixed-ip ip-address=192.168.30.100
6-5.Trunkの作成

親ポートとサブポートを関連付けて、Trunkを作成します。

openstack network trunk create \
--parent-port P01 \
--subport port=P01_C01,segmentation-type=vlan,segmentation-id=300 \
TRK1
6-6.MACアドレスの確認

サブポートP01_C01のMACアドレスをメモっておきます。
以下の例の場合、

P01_C01 fa:16:3e:37:12:36

になります。

openstack port list

root@controller01:~# openstack port list
+--------------------------------------+---------+-------------------+-------------------------------------------------------------------------------+--------+
| ID                                   | Name    | MAC Address       | Fixed IP Addresses                                                            | Status |
+--------------------------------------+---------+-------------------+-------------------------------------------------------------------------------+--------+
| 01ae96f9-c8bd-4149-8f7f-c936d0d038b9 |         | fa:16:3e:33:c7:36 | ip_address='10.30.0.132', subnet_id='e8168d18-ed3c-43d0-a950-9c9a6b635377'    | ACTIVE |
| 2eeb7f80-786c-4ba2-bd53-734da88114fe |         | fa:16:3e:7e:02:41 | ip_address='10.30.0.141', subnet_id='e8168d18-ed3c-43d0-a950-9c9a6b635377'    | ACTIVE |
| 33af164d-654e-4923-8a09-1f41c26fee37 |         | fa:16:3e:55:11:84 | ip_address='192.168.200.1', subnet_id='72151365-841f-4e6c-8b2b-1d9ed2898e7b'  | ACTIVE |
| 40442390-2fe7-4844-95ee-4a43c0296a59 | P01_C01 | fa:16:3e:37:12:36 | ip_address='192.168.30.100', subnet_id='0b313de3-b203-471a-9c26-edfeb8e14880' | ACTIVE |
| 64457abd-f622-4a9a-a61e-ecd9a118731d |         | fa:16:3e:1a:39:83 | ip_address='10.30.0.129', subnet_id='e8168d18-ed3c-43d0-a950-9c9a6b635377'    | ACTIVE |
| 859c401f-0e2e-4d65-8fd2-5e9137d4a3a2 | P01     | fa:16:3e:db:91:fd | ip_address='192.168.200.7', subnet_id='72151365-841f-4e6c-8b2b-1d9ed2898e7b'  | ACTIVE |
| 9872b8b5-c44f-49d9-a547-982949ffd9be |         | fa:16:3e:b7:ac:a1 | ip_address='192.168.30.128', subnet_id='0b313de3-b203-471a-9c26-edfeb8e14880' | ACTIVE |
| bb5d66dc-241d-43ff-95bd-8bf5e9034b9e |         | fa:16:3e:cd:9a:f3 | ip_address='10.30.0.135', subnet_id='e8168d18-ed3c-43d0-a950-9c9a6b635377'    | ACTIVE |
| c5d7fa51-0de0-49bf-92b3-00d3e7b3c7d1 |         | fa:16:3e:08:b2:10 | ip_address='192.168.200.2', subnet_id='72151365-841f-4e6c-8b2b-1d9ed2898e7b'  | ACTIVE |
| d11c5401-13e9-46f2-9cd0-3e5c242fa995 |         | fa:16:3e:58:39:d7 | ip_address='192.168.200.3', subnet_id='72151365-841f-4e6c-8b2b-1d9ed2898e7b'  | ACTIVE |
| d55e11c2-abcf-4425-afb2-3199a90bf2dc |         | fa:16:3e:66:30:85 | ip_address='192.168.200.18', subnet_id='72151365-841f-4e6c-8b2b-1d9ed2898e7b' | ACTIVE |
+--------------------------------------+---------+-------------------+-------------------------------------------------------------------------------+--------+

7.インスタンス(srv2)作成

対象:Controllerのみ

7-1.パスワードファイル作成
vi /root/udata.txt

#cloud-config
password: ubuntu
chpasswd: { expire: False }
ssh_pwauth: True
7-2.インスタンス(srv2)作成

Compute02上にsrv2を作成します。
user-dataとして、udata.txtを読込みます。
親ポートP01に接続させます。

openstack server create \
--flavor m2 \
--image ubuntu-xenial-16.04 \
--availability-zone nova:compute02 \
--user-data udata.txt \
--nic port-id=P01 \
srv2
7-3.インスタンスの設定

対象:Compute02からsrv2コンソールログインして実施
インスタンスにログイン後、以下の設定を実施。
サブポートP01_C01にアサインされたMACアドレスfa:16:3e:37:12:36を設定してください。
最後にdhcpでアドレス取得要求を行うと、サブポートに設定した192.168.30.100が取得できます。

sudo su
ip link add link ens3 name ens3.300 type vlan id 300
ip link set dev ens3.300 address fa:16:3e:37:12:36
ip link set ens3.300 up
dhclient ens3.300

以下出力例です。

root@compute02:~# virsh list
 Id    Name                           State
----------------------------------------------------
 1     instance-00000002              running

root@compute02:~# virsh console instance-00000002
Connected to domain instance-00000002
Escape character is ^]

Ubuntu 16.04.6 LTS srv2 ttyS0

srv2 login: ubuntu
Password: ubuntu
Last login: Wed May 29 06:03:11 UTC 2019 on ttyS0
Welcome to Ubuntu 16.04.6 LTS (GNU/Linux 4.4.0-148-generic x86_64)

ubuntu@srv2:~$ sudo su
sudo: unable to resolve host srv2
root@srv2:/home/ubuntu# cd
root@srv2:~# ip link add link ens3 name ens3.300 type vlan id 300
root@srv2:~# ip link set dev ens3.300 address fa:16:3e:37:12:36
root@srv2:~# ip link set ens3.300 up
root@srv2:~# dhclient ens3.300
root@srv2:~# ip add show
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens3:  mtu 1450 qdisc pfifo_fast state UP group default qlen 1000
    link/ether fa:16:3e:db:91:fd brd ff:ff:ff:ff:ff:ff
    inet 192.168.200.7/24 brd 192.168.200.255 scope global ens3
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fedb:91fd/64 scope link
       valid_lft forever preferred_lft forever
3: ens3.300@ens3:  mtu 1450 qdisc noqueue state UP group default qlen 1000
    link/ether fa:16:3e:37:12:36 brd ff:ff:ff:ff:ff:ff
    inet 192.168.30.100/24 brd 192.168.30.255 scope global ens3.300
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fe37:1236/64 scope link
       valid_lft forever preferred_lft forever

8.構成詳細

8-1.構成

以下の図は第1回目で記載しました。
f:id:metonymical:20190527141522p:plain
各Nodeのens35より内側(左側)の詳細構成が以下となります。
f:id:metonymical:20190529175507p:plain
<補足>
Brdigeには1重下線、Routerには2重下線を入れています。
br-intよりも左側がNamespaceで作成されたRouterです。
v1~3はNeutron内部で使用されるVLAN IDです。Flowテーブルにより以下に書き換えられています。

VLAN1 VLAN56 SV_NET *1
VLAN2 VLAN30 GW_NET
VLAN3 VLAN300 TR_NET


論理構成だけを記載したものが以下となります。
f:id:metonymical:20190529175834p:plain

8-2.確認方法:L2レベルの確認

ここでは例としてController01のbr-intで行ってみます。

ovs-vsctl show
ovs-ofctl show br-int
ovs-appctl fdb/show br-int
ovs-ofctl dump-flows br-int
ovs-appctl ofproto/trace br-int in_port=n

以下出力例です。
もっと多くの補足を入れたいのですが、膨大な量になるため割愛します。

br-intのポート名や内部VLAN番号の確認*2

ovs-vsctl show

root@controller01:~# ovs-vsctl show
01a7c9a9-3ae0-45dd-8eda-f46aa41c164c
    Manager "ptcp:6640:127.0.0.1"
        is_connected: true
    Bridge br-int
        Controller "tcp:127.0.0.1:6633"
            is_connected: true
        fail_mode: secure
        Port "sg-d11c5401-13"
            tag: 1
            Interface "sg-d11c5401-13"
                type: internal
        Port br-int
            Interface br-int
                type: internal
        Port "qr-33af164d-65"
            tag: 1
            Interface "qr-33af164d-65"
                type: internal
        Port "int-br-ens35"
            Interface "int-br-ens35"
                type: patch
                options: {peer="phy-br-ens35"}
        Port "tapc5d7fa51-0d"
            tag: 1
            Interface "tapc5d7fa51-0d"
                type: internal
        Port "tap9872b8b5-c4"
            tag: 3
            Interface "tap9872b8b5-c4"
                type: internal
        Port "qg-2eeb7f80-78"
            tag: 2
            Interface "qg-2eeb7f80-78"
                type: internal
        Port patch-tun
            Interface patch-tun
                type: patch
                options: {peer=patch-int}
        Port "fg-bb5d66dc-24"
            tag: 2
            Interface "fg-bb5d66dc-24"
                type: internal
    ovs_version: "2.8.4"

br-intのポート番号の確認

ovs-ofctl show br-int

root@controller01:~# ovs-ofctl show br-int
OFPT_FEATURES_REPLY (xid=0x2): dpid:0000e678379a3b46
n_tables:254, n_buffers:0
capabilities: FLOW_STATS TABLE_STATS PORT_STATS QUEUE_STATS ARP_MATCH_IP
actions: output enqueue set_vlan_vid set_vlan_pcp strip_vlan mod_dl_src mod_dl_dst mod_nw_src mod_nw_dst mod_nw_tos mod_tp_src mod_tp_dst
 1(int-br-ens35): addr:c2:7b:ab:ac:4b:1f
     config:     0
     state:      0
     speed: 0 Mbps now, 0 Mbps max
 2(patch-tun): addr:7a:5e:f6:c2:45:26
     config:     0
     state:      0
     speed: 0 Mbps now, 0 Mbps max
 3(qr-33af164d-65): addr:00:00:00:00:00:00
     config:     PORT_DOWN
     state:      LINK_DOWN
     speed: 0 Mbps now, 0 Mbps max
 4(sg-d11c5401-13): addr:00:00:00:00:00:00
     config:     PORT_DOWN
     state:      LINK_DOWN
     speed: 0 Mbps now, 0 Mbps max
 5(fg-bb5d66dc-24): addr:00:00:00:00:00:00
     config:     PORT_DOWN
     state:      LINK_DOWN
     speed: 0 Mbps now, 0 Mbps max
 6(tapc5d7fa51-0d): addr:00:00:00:00:00:00
     config:     PORT_DOWN
     state:      LINK_DOWN
     speed: 0 Mbps now, 0 Mbps max
 7(qg-2eeb7f80-78): addr:00:00:00:00:00:00
     config:     PORT_DOWN
     state:      LINK_DOWN
     speed: 0 Mbps now, 0 Mbps max
 13(tap9872b8b5-c4): addr:00:00:00:00:00:00
     config:     PORT_DOWN
     state:      LINK_DOWN
     speed: 0 Mbps now, 0 Mbps max
 LOCAL(br-int): addr:e6:78:37:9a:3b:46
     config:     PORT_DOWN
     state:      LINK_DOWN
     speed: 0 Mbps now, 0 Mbps max
OFPT_GET_CONFIG_REPLY (xid=0x4): frags=normal miss_send_len=0

br-intのMacアドレステーブルの確認

ovs-appctl fdb/show br-int

root@controller01:~# ovs-appctl fdb/show br-int
 port  VLAN  MAC                Age
    1     2  2c:53:4a:01:27:66   38
    1     3  2c:53:4a:01:27:66   38

br-intのフローテーブルの確認
赤文字はフローテーブルによりVLANIDが書き換えられている箇所です。

ovs-ofctl dump-flows br-int

root@controller01:~# ovs-ofctl dump-flows br-int
 cookie=0xab814f17f876c4e7, duration=18281.635s, table=0, n_packets=0, n_bytes=0, priority=4,in_port="int-br-ens35",dl_src=fa:16:3f:05:7d:26 actions=resubmit(,2)
 cookie=0xab814f17f876c4e7, duration=18281.634s, table=0, n_packets=0, n_bytes=0, priority=2,in_port="patch-tun",dl_src=fa:16:3f:05:7d:26 actions=resubmit(,1)
 cookie=0xab814f17f876c4e7, duration=18281.632s, table=0, n_packets=210, n_bytes=18620, priority=4,in_port="int-br-ens35",dl_src=fa:16:3f:53:4c:80 actions=resubmit(,2)
 cookie=0xab814f17f876c4e7, duration=18281.631s, table=0, n_packets=0, n_bytes=0, priority=2,in_port="patch-tun",dl_src=fa:16:3f:53:4c:80 actions=resubmit(,1)
 cookie=0xab814f17f876c4e7, duration=18207.228s, table=0, n_packets=35, n_bytes=3684, priority=3,in_port="int-br-ens35",dl_vlan=56 actions=mod_vlan_vid:1,resubmit(,60)
 cookie=0xab814f17f876c4e7, duration=18203.240s, table=0, n_packets=1773, n_bytes=754143, priority=3,in_port="int-br-ens35",dl_vlan=30 actions=mod_vlan_vid:2,resubmit(,60)
 cookie=0xab814f17f876c4e7, duration=16350.937s, table=0, n_packets=1235, n_bytes=226168, priority=3,in_port="int-br-ens35",dl_vlan=300 actions=mod_vlan_vid:3,resubmit(,60)
 cookie=0xab814f17f876c4e7, duration=18281.646s, table=0, n_packets=310, n_bytes=41445, priority=2,in_port="int-br-ens35" actions=drop
 cookie=0xab814f17f876c4e7, duration=18281.778s, table=0, n_packets=564, n_bytes=514595, priority=0 actions=resubmit(,60)
 cookie=0xab814f17f876c4e7, duration=18281.646s, table=1, n_packets=0, n_bytes=0, priority=1 actions=drop
 cookie=0xab814f17f876c4e7, duration=18205.312s, table=2, n_packets=203, n_bytes=17846, priority=4,dl_vlan=56,dl_dst=fa:16:3e:58:39:d7 actions=mod_dl_src:fa:16:3e:55:11:84,resubmit(,60)
 cookie=0xab814f17f876c4e7, duration=16262.886s, table=2, n_packets=0, n_bytes=0, priority=4,dl_vlan=56,dl_dst=fa:16:3e:08:b2:10 actions=mod_dl_src:fa:16:3e:55:11:84,resubmit(,60)
 cookie=0xab814f17f876c4e7, duration=18281.646s, table=2, n_packets=7, n_bytes=774, priority=1 actions=drop
 cookie=0xab814f17f876c4e7, duration=18281.647s, table=23, n_packets=0, n_bytes=0, priority=0 actions=drop
 cookie=0xab814f17f876c4e7, duration=18281.777s, table=24, n_packets=0, n_bytes=0, priority=0 actions=drop
 cookie=0xab814f17f876c4e7, duration=18205.312s, table=60, n_packets=203, n_bytes=17846, priority=4,dl_vlan=56,dl_dst=fa:16:3e:58:39:d7 actions=strip_vlan,output:"sg-d11c5401-13"
 cookie=0xab814f17f876c4e7, duration=16262.885s, table=60, n_packets=0, n_bytes=0, priority=4,dl_vlan=56,dl_dst=fa:16:3e:08:b2:10 actions=strip_vlan,output:"tapc5d7fa51-0d"
 cookie=0xab814f17f876c4e7, duration=18281.777s, table=60, n_packets=3607, n_bytes=1498590, priority=3 actions=NORMAL

br-intのフローのトレース

ovs-appctl ofproto/trace br-int in_port=n
#nは、ovs-ofctl show br-intの出力で得られたポート番号

root@controller01:~# ovs-appctl ofproto/trace br-int in_port=7
Flow: in_port=7,vlan_tci=0x0000,dl_src=00:00:00:00:00:00,dl_dst=00:00:00:00:00:00,dl_type=0x0000

bridge("br-int")
----------------
 0. priority 0, cookie 0xab814f17f876c4e7
    goto_table:60
60. priority 3, cookie 0xab814f17f876c4e7
    NORMAL
     -> no learned MAC for destination, flooding

    bridge("br-ens35")
    ------------------
         0. in_port=2, priority 2, cookie 0xc29c894d4abba2e2
            goto_table:1
         1. priority 0, cookie 0xc29c894d4abba2e2
            goto_table:2
         2. in_port=2,dl_vlan=2, priority 4, cookie 0xc29c894d4abba2e2
            set_field:4126->vlan_vid
            NORMAL
             -> no learned MAC for destination, flooding

bridge("br-tun")
----------------
 0. in_port=1, priority 1, cookie 0x151d0b9924ed6dbf
    goto_table:1
 1. priority 0, cookie 0x151d0b9924ed6dbf
    goto_table:2
 2. dl_dst=00:00:00:00:00:00/01:00:00:00:00:00, priority 0, cookie 0x151d0b9924ed6dbf
    goto_table:20
20. priority 0, cookie 0x151d0b9924ed6dbf
    goto_table:22
22. priority 0, cookie 0x151d0b9924ed6dbf
    drop

Final flow: unchanged
Megaflow: recirc_id=0,eth,in_port=7,vlan_tci=0x0000,dl_src=00:00:00:00:00:00,dl_dst=00:00:00:00:00:00,dl_type=0x0000
Datapath actions: push_vlan(vid=2,pcp=0),7,pop_vlan,push_vlan(vid=30,pcp=0),2,1,pop_vlan,6
8-3.確認方法:L3レベルの確認

ここでは例としてController01で確認していきます。

ip netns
ip netns exec `ip netns | awk 'NR==5'` ip add show
ip netns exec `ip netns | awk 'NR==5'` ip route show
ip netns exec `ip netns | awk 'NR==5'` ip rule show
ip netns exec `ip netns | awk 'NR==5'` ip route show table NUMEBER

以下がController01のNamespaceに作成されたRouterとなります。

ip netns

root@controller01:~# ip netns
qdhcp-8fd11879-9c07-4130-9cd5-e2f1034394dc
qdhcp-10364a89-8a6e-499d-bee3-03f4085b745e
fip-a53cf798-1c15-4597-aeca-8b8917aa81fd
snat-e83bd724-c0da-42d0-b43e-0d6a923e1c5b
qrouter-e83bd724-c0da-42d0-b43e-0d6a923e1c5b

各Routerのポートやアドレスを確認する場合、

ip netns exec qrouter-e83bd724-c0da-42d0-b43e-0d6a923e1c5b ip add show

とコマンド入力するのは大変です。

このため、awkを使って以下のようにします。
NR==5は、ip netnsの出力結果の5行目(qrouter~)に該当します。

ip netns exec `ip netns | awk 'NR==5'` ip add show

root@controller01:~# ip netns exec `ip netns | awk 'NR==5'` ip add show
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: rfp-e83bd724-c:  mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 16:b3:ee:52:8f:c0 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 169.254.106.114/31 scope global rfp-e83bd724-c
       valid_lft forever preferred_lft forever
    inet6 fe80::14b3:eeff:fe52:8fc0/64 scope link
       valid_lft forever preferred_lft forever
14: qr-33af164d-65:  mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
    link/ether fa:16:3e:55:11:84 brd ff:ff:ff:ff:ff:ff
    inet 192.168.200.1/24 brd 192.168.200.255 scope global qr-33af164d-65
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fe55:1184/64 scope link
       valid_lft forever preferred_lft forever

次にqrouterのRoutingTableを確認します。
Default Routeが無いため、これではInternetに出られませんので、Default Routeを確認します。

ip netns exec `ip netns | awk 'NR==5'` ip route show

root@controller01:~# ip netns exec `ip netns | awk 'NR==5'` ip route show
169.254.106.114/31 dev rfp-e83bd724-c  proto kernel  scope link  src 169.254.106.114
192.168.200.0/24 dev qr-33af164d-65  proto kernel  scope link  src 192.168.200.1

以下のコマンドでruleを表示させます。
最終行の番号をメモしておいてください。

ip netns exec `ip netns | awk 'NR==5'` ip rule show

root@controller01:~# ip netns exec `ip netns | awk 'NR==5'` ip rule show
0:      from all lookup local
32766:  from all lookup main
32767:  from all lookup default
3232286721:     from 192.168.200.1/24 lookup 3232286721

以下のコマンドで3232286721のRoutingTableを確認します。

ip netns exec `ip netns | awk 'NR==5'` ip route show table NUMBER

root@controller01:~# ip netns exec `ip netns | awk 'NR==5'` ip route show table 3232286721
default via 192.168.200.3 dev qr-33af164d-65

これらのコマンドを全Nodeの全Bridgeや全Namespaceに対して行っていくと、詳細構成が明らかになってきます。

8-4.トラフィックフロー:FlotingIP使用時

f:id:metonymical:20190529190803p:plain
FlotingIPを使用している場合は、ComputeNodeから外部NWへそのまま送信されます。

8-5.トラフィックフロー:SourceNAT使用時

f:id:metonymical:20190529190824p:plain
一方、NAT(PAT)を使用している場合は、一度ControllerNodeのsnatへ行った後、NATされて外部NWへ送信されます。

なお、特に触れませんが、Trunkした箇所*3については、論理構成に記載した通り、VLAN ID300が付与されRoutingされることなく、Compute02から、そのまま外部NWへ送信されます。

以上です。

9.最後に

以下のサイトを参考にさせて頂きました。
運用する際に理解しておきたい OpenStack Neutron DVR の Packet Flow - Qiita
OpenStack Docs: Keystone Installation Tutorial(Keystone)
OpenStack Docs: Installation(Glance)
OpenStack Docs: Compute service(Nova)
OpenStack Docs: Networking service(Neutron)
OpenStack Docs: Installation Guide(Horizon)

Open Stack Neutron環境構築は今回で最後ですが、まだモヤっとしている部分があると思っていますので、時間があればAppendixとして、もう一回くらい書きたいなと考えています。
MACアドレステーブル、ARPテーブル、Routingテーブルに加えて、Flowテーブルを読み解いていくことにより、詳細なトラフィックフローを完全に理解するというDeepDive的なことができればいいなと。

また、今回は基本的なところしか記載しませんでしたが、今後の発展として、これをベースにGREやVXLANを導入すると、さらに面白くなってきます。
また、OVNを導入してGeneveを使用してみるのも面白いかもしれません。
さらに、SR-IOVやDPDKを導入するのも面白いと思いますので、以下の過去記事などを参考にしてみてください。
Linux nmcliコマンドによるKVM&LXC/LXD with SR-IOVのInterface設定 - Metonymical Deflection
CentOS7 ovs(Open vSwitch)+DPDKのビルドとネットワーク設定方法 - Metonymical Deflection

*1:VLAN56は、前回記事で設定した32~63より自動でアサインされています。

*2:br-tunとbr-ens35も表示されますが削っています。

*3:srv2のens3.300