ルータ作成やネットワーク&サブネット作成、そしてインスタンスの起動などについて記載していきます。
また、構成の詳細や、その確認方法についても後述します。
1.構成概要
以下のようなNWを構築していきます。
しかし、この図だけでは内部的なことはわからないため、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
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
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回目で記載しました。
各Nodeのens35より内側(左側)の詳細構成が以下となります。
<補足>
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 |
論理構成だけを記載したものが以下となります。
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使用時
FlotingIPを使用している場合は、ComputeNodeから外部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