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

Open Stack Neutron環境構築 その3:Neutron+OvS+DVR のインストール

Neutron, OvS, DVRのインストールを実施します。*1
ここから徐々に複雑になりますので、ネットワーク、サブネット、ポート、インスタンスなどの作成は次回以降に記載します。

  1. Neutronのインストール
  2. Open vSwitch(L2agent)のインストール
  3. DVR(L3agent)のインストール
  4. その他設定

構成概要やOpen Stackのインストールは、前々回前回の記事を参照してください。

また、前回以上に今回は、Controllerで設定したり、Computeで設定したり、といったことが頻繁に発生するため、今何をやっているのか?が分からなくなってくると思います。
このため、以下の図を参考にしてみてください。ControllerとComputeの役割や機能の違いが少しづつ明確になってくると思います。
f:id:metonymical:20190530073758p:plain

1.Neutronのインストール

1-1.DBの設定・ユーザ登録・サービス登録・Endpoint作成・インストール

対象:Controllerのみ

#DBの設定
mysql

CREATE DATABASE neutron;
GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'localhost' IDENTIFIED BY 'neutron';
GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'%' IDENTIFIED BY 'neutron';
quit;

#ユーザ登録
openstack user create --domain Default --password=neutron neutron
openstack role add --project service --user neutron admin

#サービス登録
openstack service create --name neutron \
--description "OpenStack Networking" network

#Endpoint作成
openstack endpoint create --region RegionOne \
network public http://controller01:9696
openstack endpoint create --region RegionOne \
network internal http://controller01:9696
openstack endpoint create --region RegionOne \
network admin http://controller01:9696

#インストール(NeutronServer, DHCP Agent, Metadata Agent, ML2 Plugin, NeutronClient)
apt -y install neutron-server neutron-dhcp-agent \
neutron-metadata-agent neutron-plugin-ml2 \
python-neutronclient
1-2.neutron.confの設定

対象:Controllerのみ

vi /etc/neutron/neutron.conf

[DEFAULT]
auth_strategy = keystone
transport_url = rabbit://openstack:rabbit@controller01

[database]
#connection = sqlite:////var/lib/neutron/neutron.sqlite
connection = mysql+pymysql://neutron:neutron@controller01/neutron

[keystone_authtoken]
auth_uri = http://controller01:5000
auth_url = http://controller01:35357
memcached_servers = controller01:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = neutron
password = neutron

[nova]
auth_url = http://controller01:35357
auth_type = password
project_domain_name = default
user_domain_name = default
region_name = RegionOne
project_name = service
username = nova
password = nova
1-3.ML2 Pluginのインストール・neutron.confの設定

対象:Computeのみ

apt -y install neutron-plugin-ml2

vi /etc/neutron/neutron.conf

[DEFAULT]
auth_strategy = keystone
transport_url = rabbit://openstack:rabbit@controller01

[database]
#connection = sqlite:////var/lib/neutron/neutron.sqlite
connection = mysql+pymysql://neutron:neutron@controller01/neutron

[keystone_authtoken]
auth_uri = http://controller01:5000
auth_url = http://controller01:35357
memcached_servers = controller01:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = neutron
password = neutron
1-4.nova.confの設定

対象:全Node

vi /etc/nova/nova.conf

[neutron]
url= http://controller01:9696
auth_url = http://controller01:35357
auth_type = password
project_domain_name = default
user_domain_name = default
region_name = RegionOne
project_name = service
username = neutron
password = neutron
1-5.DB登録・設定読込み

対象:Controllerのみ

su -s /bin/sh -c "neutron-db-manage \
--config-file /etc/neutron/neutron.conf \
--config-file /etc/neutron/plugins/ml2/ml2_conf.ini \
upgrade head" neutron

systemctl restart nova-api nova-scheduler nova-conductor

以下出力例です。

root@controller01:~# su -s /bin/sh -c "neutron-db-manage \
> --config-file /etc/neutron/neutron.conf \
> --config-file /etc/neutron/plugins/ml2/ml2_conf.ini \
> upgrade head" neutron
INFO  [alembic.runtime.migration] Context impl MySQLImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
  Running upgrade for neutron ...
INFO  [alembic.runtime.migration] Context impl MySQLImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
INFO  [alembic.runtime.migration] Running upgrade  -> kilo, kilo_initial
INFO  [alembic.runtime.migration] Running upgrade kilo -> 354db87e3225, nsxv_vdr_metadata.py
INFO  [alembic.runtime.migration] Running upgrade 354db87e3225 -> 599c6a226151, neutrodb_ipam
INFO  [alembic.runtime.migration] Running upgrade 599c6a226151 -> 52c5312f6baf, Initial operations in support of address scopes
INFO  [alembic.runtime.migration] Running upgrade 52c5312f6baf -> 313373c0ffee, Flavor framework

~一部省略~

INFO  [alembic.runtime.migration] Running upgrade kilo -> 67c8e8d61d5, Initial Liberty no-op script.
INFO  [alembic.runtime.migration] Running upgrade 67c8e8d61d5 -> 458aa42b14b, fw_table_alter script to make  column case sensitive
INFO  [alembic.runtime.migration] Running upgrade 458aa42b14b -> f83a0b2964d0, rename tenant to project
INFO  [alembic.runtime.migration] Running upgrade f83a0b2964d0 -> fd38cd995cc0, change shared attribute for firewall resource
  OK
root@controller01:~#
1-6.設定読込み

対象:Computeのみ

systemctl restart nova-compute
1-7.DCHP Agentの設定・nova.conf追記・設定読込み

対象:Controllerのみ

#DCHP Agentの設定
vi /etc/neutron/dhcp_agent.ini

[DEFAULT]
enable_isolated_metadata = True

#設定読込み
systemctl restart neutron-server neutron-dhcp-agent


#nova.conf追記
vi /etc/nova/nova.conf

[neutron]
service_metadata_proxy = true
metadata_proxy_shared_secret = MetadataAgentPasswd123
1-8.MetadataAgentの設定

対象:Controllerのみ

#MetadataAgentの設定
vi /etc/neutron/metadata_agent.ini

[DEFAULT]
nova_metadata_host = controller01
metadata_proxy_shared_secret = MetadataAgentPasswd123

#設定読込み
systemctl restart nova-api neutron-metadata-agent
1-9.簡易動作確認

対象:Controllerのみ
以下のようになっていればOKです。

openstack network agent list

root@controller01:~# openstack network agent list
+--------------------------------------+----------------+--------------+-------------------+-------+-------+------------------------+
| ID                                   | Agent Type     | Host         | Availability Zone | Alive | State | Binary                 |
+--------------------------------------+----------------+--------------+-------------------+-------+-------+------------------------+
| 11fca003-8bb0-49b3-9e39-bc60b1a4cf17 | DHCP agent     | controller01 | nova              | :-)   | UP    | neutron-dhcp-agent     |
| b4cd6ed6-2321-4525-9ffa-b52dcbfe7293 | Metadata agent | controller01 | None              | :-)   | UP    | neutron-metadata-agent |
+--------------------------------------+----------------+--------------+-------------------+-------+-------+------------------------+

2.Open vSwitch(L2agent)のインストール

2-1.ML2の設定

対象:Controllerのみ

vi /etc/neutron/plugins/ml2/ml2_conf.ini

[ml2]
mechanism_drivers = l2population,openvswitch
type_drivers = local,flat,vlan,vxlan
tenant_network_types= vlan,vxlan

[ml2_type_vlan]
network_vlan_ranges = physnet1:32:63

[ml2_type_vxlan]
vni_ranges = 128:255

<補足1>
VlanやVxlanのレンジは任意に変更可能です。

[ml2_type_vlan]
network_vlan_ranges = physnet1:1024:2047

[ml2_type_vxlan]
vni_ranges = 512:4095

<補足2>
ens35以外にも外部NW用NICを複数増やしたい場合は以下のような設定も可能です。

[ml2_type_vlan]
network_vlan_ranges = physnet1:32:63,physnet2:64:95

<補足3>
今回は取り上げませんが、flatネットワークを使用する際は以下の設定を行います。

[ml2_type_flat]
flat_networks = physnet1
2-2.ドライバとOvSエージェントの設定

対象:全Node

apt install neutron-plugin-openvswitch-agent -y

vi /etc/neutron/plugins/ml2/openvswitch_agent.ini

[agent]
tunnel_types = vxlan
l2_population = true
vxlan_udp_port = 8472

[ovs]
bridge_mappings = physnet1:br-ens35
local_ip = 10.20.0.10x
##xは、Nodeごとに変更##

[securitygroup]
firewall_driver = noop

ovs-vsctl add-br br-ens35
ovs-vsctl add-port br-ens35 ens35
ovs-vsctl show

以下出力例です。

ovs-vsctl show

root@compute02:~# ovs-vsctl show
9a905c31-1f4a-48cd-aa3e-9d2fcb50bdf9
    Manager "ptcp:6640:127.0.0.1"
        is_connected: true
    Bridge "br-ens35"
        Port "br-ens35"
            Interface "br-ens35"
                type: internal
        Port "ens35"
            Interface "ens35"
    Bridge br-int
        Controller "tcp:127.0.0.1:6633"
            is_connected: true
        fail_mode: secure
        Port br-int
            Interface br-int
                type: internal
    ovs_version: "2.8.4"
2-3.DHCPエージェントの設定

対象:Controller

#dhcp_agent.iniの設定
vi /etc/neutron/dhcp_agent.ini

[DEFAULT]
interface_driver = openvswitch
dnsmasq_config_file = /etc/neutron/dnsmasq-neutron.conf


#dnsmasq-neutron.confの設定
vi /etc/neutron/dnsmasq-neutron.conf

dhcp-option-force=26,1450


#設定読込み
systemctl restart neutron-dhcp-agent
2-4.簡易動作確認

対象:Controller
以下のように出力されていればOKです。

openstack network agent list

root@controller01:~# openstack network agent list
+--------------------------------------+--------------------+--------------+-------------------+-------+-------+---------------------------+
| ID                                   | Agent Type         | Host         | Availability Zone | Alive | State | Binary                    |
+--------------------------------------+--------------------+--------------+-------------------+-------+-------+---------------------------+
| 11fca003-8bb0-49b3-9e39-bc60b1a4cf17 | DHCP agent         | controller01 | nova              | :-)   | UP    | neutron-dhcp-agent        |
| 16807ec4-c816-47cd-92eb-45e9e1410705 | Open vSwitch agent | controller01 | None              | :-)   | UP    | neutron-openvswitch-agent |
| 980aa42b-562f-47ae-97e1-015d5b600088 | Open vSwitch agent | compute02    | None              | :-)   | UP    | neutron-openvswitch-agent |
| b4cd6ed6-2321-4525-9ffa-b52dcbfe7293 | Metadata agent     | controller01 | None              | :-)   | UP    | neutron-metadata-agent    |
| ddc78656-71f5-40fc-a9e1-66b03d6de317 | Open vSwitch agent | compute01    | None              | :-)   | UP    | neutron-openvswitch-agent |
+--------------------------------------+--------------------+--------------+-------------------+-------+-------+---------------------------+

3.DVR(L3agent)のインストール

3-1.DVRのインストール&設定・OvS&Neutronの追加設定・Horizon設定

対象:Controllerのみ

#DVRのインストール&設定
apt install neutron-l3-agent -y

vi /etc/neutron/l3_agent.ini

[DEFAULT]
interface_driver = openvswitch
agent_mode = dvr_snat
handle_internal_only_routers = false

#OvSの追加設定
vi /etc/neutron/plugins/ml2/openvswitch_agent.ini

[agent]
enable_distributed_routing = True

#Neutronの追加設定
vi /etc/neutron/neutron.conf

[DEFAULT]
service_plugins = router,trunk

#Horizon設定
vi /etc/openstack-dashboard/local_settings.py

OPENSTACK_NEUTRON_NETWORK = {
    'enable_router': True,
    'enable_quotas': False,
    'enable_ipv6': False,
    'enable_distributed_router': True,
    'enable_ha_router': False,
    'enable_lb': False,
    'enable_firewall': False,
    'enable_vpn': False,
    'enable_fip_topology_check': False,
}

#設定読込み
systemctl restart neutron-l3-agent neutron-openvswitch-agent neutron-server apache2
3-2.DVRのインストール&設定・OvSの追加設定

対象:Computeのみ

#DVRのインストール&設定
apt install neutron-l3-agent -y

vi /etc/neutron/l3_agent.ini

[DEFAULT]
interface_driver = openvswitch
agent_mode = dvr
handle_internal_only_routers = false


#OvSの追加設定
vi /etc/neutron/plugins/ml2/openvswitch_agent.ini

[agent]
enable_distributed_routing = True

#設定読込み
systemctl restart neutron-l3-agent neutron-openvswitch-agent
3-3.簡易動作確認

対象:Controllerのみ
この時点で以下のように登録されていればOKです。

openstack network agent list

root@controller01:~# openstack network agent list
+--------------------------------------+--------------------+--------------+-------------------+-------+-------+---------------------------+
| ID                                   | Agent Type         | Host         | Availability Zone | Alive | State | Binary                    |
+--------------------------------------+--------------------+--------------+-------------------+-------+-------+---------------------------+
| 0fdbdf3d-978a-4698-87f5-1d9ec71ccdd7 | Metadata agent     | compute01    | None              | :-)   | UP    | neutron-metadata-agent    |
| 11fca003-8bb0-49b3-9e39-bc60b1a4cf17 | DHCP agent         | controller01 | nova              | :-)   | UP    | neutron-dhcp-agent        |
| 16807ec4-c816-47cd-92eb-45e9e1410705 | Open vSwitch agent | controller01 | None              | :-)   | UP    | neutron-openvswitch-agent |
| 514136b2-cfa0-42ca-8ee5-fe768c895c7c | L3 agent           | controller01 | nova              | :-)   | UP    | neutron-l3-agent          |
| 980aa42b-562f-47ae-97e1-015d5b600088 | Open vSwitch agent | compute02    | None              | :-)   | UP    | neutron-openvswitch-agent |
| b4cd6ed6-2321-4525-9ffa-b52dcbfe7293 | Metadata agent     | controller01 | None              | :-)   | UP    | neutron-metadata-agent    |
| bb83830a-dd80-4ab8-b030-ce1dc1999643 | Metadata agent     | compute02    | None              | :-)   | UP    | neutron-metadata-agent    |
| ddc78656-71f5-40fc-a9e1-66b03d6de317 | Open vSwitch agent | compute01    | None              | :-)   | UP    | neutron-openvswitch-agent |
| e31f5012-53c0-4e84-9c00-37b361a16a82 | L3 agent           | compute02    | nova              | :-)   | UP    | neutron-l3-agent          |
| fbae2b3d-5641-444f-a8eb-00ffc4f45a91 | L3 agent           | compute01    | nova              | :-)   | UP    | neutron-l3-agent          |
+--------------------------------------+--------------------+--------------+-------------------+-------+-------+---------------------------+

<補足>
L3 agentが表示されるまでに多少時間が掛かる場合があります。
そのときは、各Nodeで以下のように確認してみてください。

cat /var/log/neutron/neutron-l3-agent.log

root@controller01:~# cat /var/log/neutron/neutron-l3-agent.log
2019-05-28 08:40:40.631 9773 INFO neutron.common.config [-] Logging enabled!
2019-05-28 08:40:40.631 9773 INFO neutron.common.config [-] /usr/bin/neutron-l3-agent version 11.0.6
2019-05-28 08:40:40.754 9773 ERROR neutron.agent.l3.agent [-] An interface driver must be specified
2019-05-28 08:41:53.553 9847 INFO neutron.common.config [-] Logging enabled!
2019-05-28 08:41:53.553 9847 INFO neutron.common.config [-] /usr/bin/neutron-l3-agent version 11.0.6
2019-05-28 08:42:53.709 9847 ERROR neutron.common.rpc [req-58acf3df-e1c2-47a0-b83f-2aafa1e53e56 - - - - -] Timeout in RPC method get_service_plugin_list. Waiting for 10 seconds before next attempt. If the server is not down, consider increasing the rpc_response_timeout option as Neutron server(s) may be overloaded and unable to respond quickly enough.: MessagingTimeout: Timed out waiting for a reply to message ID 69bdb30bcf314476942d06106fa0b5f2
2019-05-28 08:42:53.711 9847 WARNING neutron.common.rpc [req-58acf3df-e1c2-47a0-b83f-2aafa1e53e56 - - - - -] Increasing timeout for get_service_plugin_list calls to 120 seconds. Restart the agent to restore it to the default value.: MessagingTimeout: Timed out waiting for a reply to message ID 69bdb30bcf314476942d06106fa0b5f2
2019-05-28 08:43:03.252 9847 WARNING neutron.agent.l3.agent [req-58acf3df-e1c2-47a0-b83f-2aafa1e53e56 - - - - -] l3-agent cannot contact neutron server to retrieve service plugins enabled. Check connectivity to neutron server. Retrying... Detailed message: Timed out waiting for a reply to message ID 69bdb30bcf314476942d06106fa0b5f2.: MessagingTimeout: Timed out waiting for a reply to message ID 69bdb30bcf314476942d06106fa0b5f2
2019-05-28 08:43:03.269 9847 INFO neutron.agent.agent_extensions_manager [req-f6aa92b3-2ba4-4cb4-9273-8cb9f54c5f43 - - - - -] Loaded agent extensions: []
2019-05-28 08:43:03.282 9847 INFO eventlet.wsgi.server [-] (9847) wsgi starting up on http:/var/lib/neutron/keepalived-state-change
2019-05-28 08:43:03.347 9847 INFO neutron.agent.l3.agent [-] L3 agent started
3-4.L2構成確認

対象:全Node
どのNodeでも構いませんので、以下のコマンドを打ってみてください。

ovs-vsctl show

root@compute02:~# ovs-vsctl show
c560fe9b-ea3c-4be6-8e94-109299e797aa
    Manager "ptcp:6640:127.0.0.1"
        is_connected: true
    Bridge "br-ens35"
        Controller "tcp:127.0.0.1:6633"
            is_connected: true
        fail_mode: secure
        Port "br-ens35"
            Interface "br-ens35"
                type: internal
        Port "phy-br-ens35"
            Interface "phy-br-ens35"
                type: patch
                options: {peer="int-br-ens35"}
        Port "ens35"
            Interface "ens35"
    Bridge br-tun
        Controller "tcp:127.0.0.1:6633"
            is_connected: true
        fail_mode: secure
        Port br-tun
            Interface br-tun
                type: internal
        Port patch-int
            Interface patch-int
                type: patch
                options: {peer=patch-tun}
    Bridge br-int
        Controller "tcp:127.0.0.1:6633"
            is_connected: true
        fail_mode: secure
        Port br-int
            Interface br-int
                type: internal
        Port patch-tun
            Interface patch-tun
                type: patch
                options: {peer=patch-int}
        Port "int-br-ens35"
            Interface "int-br-ens35"
                type: patch
                options: {peer="phy-br-ens35"}
    ovs_version: "2.8.4"

上記出力より、br-ens35, br-tun, br-intの3つのBridgeが全Nodeで作成されています。
図にすると、こんな↓イメージです。
f:id:metonymical:20190528110237p:plain
これが素の状態で、全Nodeで同一のBridge 構成となっています。
ここから、Network, Subnet, Port, VMインスタンスを作ったり、VMインスタンスからTrunkしてみたりすると、少しづつ複雑になり始めます。

3-5.各種確認

対象:全Node
以下のコマンドでPortやMacアドレステーブル、フローテーブルが確認可能です。

#Port確認
ovs-ofctl show br-ens35
ovs-ofctl show br-int
ovs-ofctl show br-tun

root@controller01:~# ovs-ofctl show br-ens35
OFPT_FEATURES_REPLY (xid=0x2): dpid:0000000c294300d2
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(ens35): addr:00:0c:29:43:00:d2
     config:     0
     state:      0
     current:    1GB-FD COPPER AUTO_NEG
     advertised: 10MB-HD 10MB-FD 100MB-HD 100MB-FD 1GB-FD COPPER AUTO_NEG
     supported:  10MB-HD 10MB-FD 100MB-HD 100MB-FD 1GB-FD COPPER AUTO_NEG
     speed: 1000 Mbps now, 1000 Mbps max
 2(phy-br-ens35): addr:62:2f:61:76:05:b2
     config:     0
     state:      0
     speed: 0 Mbps now, 0 Mbps max
 LOCAL(br-ens35): addr:00:0c:29:43:00:d2
     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


#Macアドレステーブル確認
ovs-appctl fdb/show br-ens35
ovs-appctl fdb/show br-int
ovs-appctl fdb/show br-tun

root@controller01:~# ovs-appctl fdb/show br-ens35
 port  VLAN  MAC                Age
    1    30  6c:50:4d:d5:07:da  141
    1     0  2c:53:4a:01:27:67   94
    1   300  6c:50:4d:d5:07:da   92
    1    30  2c:53:4a:01:27:66   65
    1   300  2c:53:4a:01:27:66   65


#フローテーブル確認
ovs-ofctl dump-flows br-ens35
ovs-ofctl dump-flows br-int
ovs-ofctl dump-flows br-tun

root@controller01:~# ovs-ofctl dump-flows br-ens35
 cookie=0xa3dbef6a19c99333, duration=5955.130s, table=0, n_packets=0, n_bytes=0, priority=2,in_port="phy-br-ens35" actions=resubmit(,1)
 cookie=0xa3dbef6a19c99333, duration=5955.218s, table=0, n_packets=0, n_bytes=0, priority=0 actions=NORMAL
 cookie=0xa3dbef6a19c99333, duration=5955.130s, table=0, n_packets=4058, n_bytes=366211, priority=1 actions=resubmit(,3)
 cookie=0xa3dbef6a19c99333, duration=5955.130s, table=1, n_packets=0, n_bytes=0, priority=0 actions=resubmit(,2)
 cookie=0xa3dbef6a19c99333, duration=5955.129s, table=2, n_packets=0, n_bytes=0, priority=2,in_port="phy-br-ens35" actions=drop
 cookie=0xa3dbef6a19c99333, duration=5576.007s, table=3, n_packets=0, n_bytes=0, priority=2,dl_src=fa:16:3f:05:7d:26 actions=output:"phy-br-ens35"
 cookie=0xa3dbef6a19c99333, duration=5529.828s, table=3, n_packets=0, n_bytes=0, priority=2,dl_src=fa:16:3f:53:4c:80 actions=output:"phy-br-ens35"
 cookie=0xa3dbef6a19c99333, duration=5955.129s, table=3, n_packets=4058, n_bytes=366211, priority=1 actions=NORMAL

4.その他設定

直接Neutronには関係ありませんが、インスタンス周りで困るときがあるため、以下の設定を行っておきます。

4-1.NovaDB登録

対象:Controllerのみ
インスタンスが作成できたけど起動しない場合の対処。

openstack compute service list
su -s /bin/sh -c "nova-manage cell_v2 discover_hosts --verbose" nova
systemctl restart nova-api nova-consoleauth nova-scheduler nova-conductor nova-novncproxy

以下出力例です。

root@controller01:~# openstack compute service list
+----+------------------+--------------+----------+---------+-------+----------------------------+
| ID | Binary           | Host         | Zone     | Status  | State | Updated At                 |
+----+------------------+--------------+----------+---------+-------+----------------------------+
|  1 | nova-scheduler   | controller01 | internal | enabled | up    | 2019-05-28T01:26:14.000000 |
|  2 | nova-consoleauth | controller01 | internal | enabled | up    | 2019-05-28T01:26:17.000000 |
|  3 | nova-conductor   | controller01 | internal | enabled | up    | 2019-05-28T01:26:17.000000 |
|  7 | nova-compute     | compute01    | nova     | enabled | up    | 2019-05-28T01:26:14.000000 |
|  8 | nova-compute     | compute02    | nova     | enabled | up    | 2019-05-28T01:26:17.000000 |
+----+------------------+--------------+----------+---------+-------+----------------------------+

#上記のようにcompute01&02が表示されている状態であることを確認の上、以下のようにNovaDBへ登録します。

root@controller01:~# su -s /bin/sh -c "nova-manage cell_v2 discover_hosts --verbose" nova
Found 2 cell mappings.
Skipping cell0 since it does not contain hosts.
Getting computes from cell 'cell1': e0e3f86a-8b85-4184-9287-7e4dcd53db81
Checking host mapping for compute host 'compute01': 521aeaf7-1d0e-4aa9-81b4-d7f39397c33c
Creating host mapping for compute host 'compute01': 521aeaf7-1d0e-4aa9-81b4-d7f39397c33c
Checking host mapping for compute host 'compute02': d32c9aee-af7b-4b90-a767-56dc9897de5f
Creating host mapping for compute host 'compute02': d32c9aee-af7b-4b90-a767-56dc9897de5f
Found 2 unmapped computes in cell: e0e3f86a-8b85-4184-9287-7e4dcd53db81
4-2.MetadataAgent設定

対象:Computeのみ
インスタンスが起動したけど、メタデータ(KeypairとかPasswd設定ファイルなど)が取得できないときの対処。

#MetadataAgent設定
vi /etc/neutron/metadata_agent.ini

[DEFAULT]
nova_metadata_host = controller01
metadata_proxy_shared_secret = MetadataAgentPasswd123

#設定読込み
systemctl restart neutron-metadata-agent

<補足>
インスタンスUbuntuなど(Cirros以外)を使用する場合、Defaultで鍵認証となっているため、Keypairを取得させるか、Passwd設定&許可ファイルを取得されるなどの方法で、インスタンスssh接続します。*2

以上です。

5.最後に

少しづつ出来てきた感が出ていれば良いなと思います。
3-4.や3-5.に記載した素の状態をよく確認し構成を理解しておくと良いと思います。

*1:進める前に現段階での仮想マシンのクローンやスナップショットは取得しておくことをお勧めします。

*2:vncやvirsh consoleでも、Passwd設定ファイルを取得させないとログインできない場合もあるため。

Open Stack Neutron環境構築 その2:OpenStack のインストール

Open Stack(pike)のインストールを実施します。*1
構成などは前回記事を確認してください。

  1. 各種サービスなどのインストール
  2. Keystone
  3. Glance
  4. Nova1:Controller
  5. Nova2:Compute
  6. Horizon

1.各種サービスなどのインストール

対象:Controllerのみ

1-1.OpenStackクライアント
apt -y install python-openstackclient
1-2.MySQL
apt -y install mariadb-server python-pymysql

vi /etc/mysql/mariadb.conf.d/99-openstack.cnf

[mysqld]
bind-address = 10.10.0.100
default-storage-engine = innodb
innodb_file_per_table = on
max_connections = 4096
collation-server = utf8_general_ci
character-set-server = utf8

systemctl restart mysql

mysql_secure_installation
#パスワードは全てopenstackとします。

以下出力例です。*2

root@controller01:~# mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none): Enter
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n] Enter
New password: openstackと入力
Re-enter new password: openstackと入力
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] Enter
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] Enter
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] Enter
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] Enter
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!
1-3.RabbitMQ
apt -y install rabbitmq-server

rabbitmqctl add_user openstack rabbit
rabbitmqctl set_permissions openstack ".*" ".*" ".*"
1-4.Memcached
apt -y install memcached python-memcache

vi /etc/memcached.conf

#-l 127.0.0.1
-l 10.10.0.100

systemctl restart memcached

2.Keystone

対象:Controllerのみ

2-1.DBの設定
mysql

CREATE DATABASE keystone;
GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY 'keystone';
GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY 'keystone';
quit;

以下出力例です。

root@controller01:~# mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 40
Server version: 10.0.38-MariaDB-0ubuntu0.16.04.1 Ubuntu 16.04

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> CREATE DATABASE keystone;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY 'keystone';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY 'keystone';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> quit;
Bye
root@controller01:~#
2-2.インストールと設定
apt -y install keystone apache2 libapache2-mod-wsgi

vi /etc/keystone/keystone.conf

[database]
#connection = sqlite:////var/lib/keystone/keystone.db
connection = mysql+pymysql://keystone:keystone@controller01/keystone

[token]
provider = fernet
2-3.DB登録と初期化
su -s /bin/sh -c "keystone-manage db_sync" keystone

keystone-manage fernet_setup \
--keystone-user keystone --keystone-group keystone

keystone-manage credential_setup \
--keystone-user keystone --keystone-group keystone
2-4.Endpoint設定
keystone-manage bootstrap --bootstrap-password openstack \
--bootstrap-admin-url http://controller01:35357/v3/ \
--bootstrap-internal-url http://controller01:5000/v3/ \
--bootstrap-public-url http://controller01:5000/v3/ \
--bootstrap-region-id RegionOne
2-5.Webサービス設定&再起動
sed -i '1s/^/ServerName controller01\n&/' /etc/apache2/apache2.conf
systemctl restart apache2
2-6.環境変数ファイル生成
cat >> ~/adminrc <<EOF
export OS_PROJECT_DOMAIN_NAME=default
export OS_USER_DOMAIN_NAME=default
export OS_PROJECT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=openstack
export OS_AUTH_URL=http://controller01:35357/v3
export OS_IDENTITY_API_VERSION=3
EOF

cat >> ~/demorc <<EOF
export OS_PROJECT_DOMAIN_NAME=default
export OS_USER_DOMAIN_NAME=default
export OS_PROJECT_NAME=demo
export OS_USERNAME=demo
export OS_PASSWORD=demo
export OS_AUTH_URL=http://controller01:35357/v3
export OS_IDENTITY_API_VERSION=3
EOF

source adminrc

#これ以降、openstackコマンドを打つときは、
#sshログイン直後に上記adminrcを読み込んでください。
#読み込まずにopenstackコマンドを打つと以下のエラーが表示されます。
#demorcはほぼ使用しないと思いますが念のため。

root@controller01:~# openstack endpoint list
Missing value auth-url required for auth plugin password
2-7.動作確認
openstack endpoint list
openstack service list
2-8.ProjectやRoleの登録
openstack project create --description "Service Project" service
openstack project create --description "Demo Project" demo
openstack user create demo --password=demo
openstack role create user
openstack role add --project demo --user demo user

3.Glance

対象:Controllerのみ

3-1.DBの設定
mysql

CREATE DATABASE glance;
GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'localhost' IDENTIFIED BY 'glance';
GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'%' IDENTIFIED BY 'glance';
quit;

3-2.ユーザ登録・サービス登録・Endpoint作成・インストール
openstack user create glance --domain default --password=glance
openstack role add --project service --user glance admin

openstack service create --name glance \
--description "OpenStack Image" image

openstack endpoint create --region RegionOne \
image public http://controller01:9292

openstack endpoint create --region RegionOne \
image internal http://controller01:9292

openstack endpoint create --region RegionOne \
image admin http://controller01:9292

apt -y install glance
3-3.glance-api.comf設定
vi /etc/glance/glance-api.conf

[database]
connection = mysql+pymysql://glance:glance@controller01/glance

[keystone_authtoken]
auth_uri = http://controller01:5000
auth_url = http://controller01:35357
memcached_servers = controller01:11211
auth_type = password
user_domain_name = default
project_domain_name = default
project_name = service
username = glance
password = glance

[paste_deploy]
flavor = keystone

[glance_store]
stores = file,http
default_store = file
filesystem_store_datadir = /var/lib/glance/images
3-4.glance-registry.comf設定
vi /etc/glance/glance-registry.conf

[database]
connection = mysql+pymysql://glance:glance@controller01/glance

[keystone_authtoken]
auth_uri = http://controller01:5000
auth_url = http://controller01:35357
memcached_servers = controller01:11211
auth_type = password
user_domain_name = default
project_domain_name = default
project_name = service
username = glance
password = glance

[paste_deploy]
flavor = keystone
3-5.DB登録&設定ファイル読込み
su -s /bin/sh -c "glance-manage db_sync" glance

systemctl restart glance-registry glance-api
3-6.イメージ登録
mkdir /tmp/images

#cirrosの登録
wget -P /tmp/images http://download.cirros-cloud.net/0.4.0/cirros-0.4.0-x86_64-disk.img

openstack image create "cirros-0.4.0" \
--file /tmp/images/cirros-0.4.0-x86_64-disk.img \
--disk-format qcow2 \
--container-format bare \
--public

#ubuntuの登録
wget -P /tmp/images http://cloud-images.ubuntu.com/xenial/current/xenial-server-cloudimg-amd64-disk1.img

openstack image create "ubuntu-xenial-16.04" \
--file /tmp/images/xenial-server-cloudimg-amd64-disk1.img \
--disk-format qcow2 \
--container-format bare \
--public

#登録イメージの確認
openstack image list

root@controller01:~# openstack image list
+--------------------------------------+---------------------+--------+
| ID                                   | Name                | Status |
+--------------------------------------+---------------------+--------+
| 749433d2-2f69-47bf-9de7-a0a9e3a72bb6 | cirros-0.4.0        | active |
| 6819234c-4757-41d8-867a-c3b44a9f5a47 | ubuntu-xenial-16.04 | active |
+--------------------------------------+---------------------+--------+
3-7.簡易動作確認

この時点で以下のように登録されていればOKです。

openstack endpoint list
openstack service list

root@controller01:~# openstack endpoint list
+----------------------------------+-----------+--------------+--------------+---------+-----------+-------------------------------+
| ID                               | Region    | Service Name | Service Type | Enabled | Interface | URL                           |
+----------------------------------+-----------+--------------+--------------+---------+-----------+-------------------------------+
| 266e4c678cda43ab9bec4a70ddccfb97 | RegionOne | glance       | image        | True    | internal  | http://controller01:9292      |
| 6256b9ec413d4a9ca8bc1feb90448260 | RegionOne | glance       | image        | True    | public    | http://controller01:9292      |
| 7ab5e26b0f524c60a9ba33870283940a | RegionOne | keystone     | identity     | True    | admin     | http://controller01:35357/v3/ |
| e414354758e04ac7802ba300a864258f | RegionOne | keystone     | identity     | True    | internal  | http://controller01:5000/v3/  |
| e8a1585c91754424a2c7432e2bb31116 | RegionOne | keystone     | identity     | True    | public    | http://controller01:5000/v3/  |
| f1fb03de6fb24d6e818b239ad0276083 | RegionOne | glance       | image        | True    | admin     | http://controller01:9292      |
+----------------------------------+-----------+--------------+--------------+---------+-----------+-------------------------------+
root@controller01:~# openstack service list
+----------------------------------+----------+----------+
| ID                               | Name     | Type     |
+----------------------------------+----------+----------+
| 42e7a20b30944518ae5c345aab323d3d | glance   | image    |
| f3d100b18b794f649ee80c651787eb22 | keystone | identity |
+----------------------------------+----------+----------+

4.Nova1:Controller

対象:Controllerのみ

4-1.DBの設定・ユーザ登録・サービス登録・Endpoint作成
#DB設定
mysql

CREATE DATABASE nova;
CREATE DATABASE nova_api;
CREATE DATABASE nova_cell0;
GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' IDENTIFIED BY 'nova';
GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' IDENTIFIED BY 'nova';
GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'localhost' IDENTIFIED BY 'nova';
GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'%' IDENTIFIED BY 'nova';
GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'localhost' IDENTIFIED BY 'nova';
GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'%' IDENTIFIED BY 'nova';
quit;

#ユーザ登録
openstack user create nova --domain default --password=nova
openstack user create placement \
--domain default --password=placement

openstack role add --project service --user nova admin
openstack role add --project service --user placement admin

#サービス登録
openstack service create --name nova \
--description "OpenStack Compute" compute
openstack service create --name placement \
--description "Placement API" placement

#Endpoint作成
openstack endpoint create --region RegionOne \
compute public http://controller01:8774/v2.1
openstack endpoint create --region RegionOne \
compute internal http://controller01:8774/v2.1
openstack endpoint create --region RegionOne \
compute admin http://controller01:8774/v2.1

openstack endpoint create --region RegionOne \
placement public http://controller01:8778
openstack endpoint create --region RegionOne \
placement internal http://controller01:8778
openstack endpoint create --region RegionOne \
placement admin http://controller01:8778
4-2.インストール・nova.conf設定
#インストール
apt -y install nova-api nova-conductor nova-consoleauth \
nova-novncproxy nova-scheduler nova-placement-api

#nova.conf設定
vi /etc/nova/nova.conf

[DEFAULT]
transport_url = rabbit://openstack:rabbit@controller01
my_ip = 10.10.0.100

[api_database]
#connection = sqlite:////var/lib/nova/nova_api.sqlite
connection = mysql+pymysql://nova:nova@controller01/nova_api

[database]
#connection = sqlite:////var/lib/nova/nova.sqlite
connection = mysql+pymysql://nova:nova@controller01/nova

[vnc]
enabled = true
vncserver_listen = 10.10.0.100
vncserver_proxyclient_address = 10.10.0.100

[api]
auth_strategy= keystone

[keystone_authtoken]
auth_uri = http://controller01:5000
auth_url = http://controller01:35357
memcached_servers = controller01:11211
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = nova
password = nova

[glance]
api_servers = http://controller01:9292

[oslo_concurrency]
lock_path = /var/lib/nova/tmp

[placement]
#os_region_name = openstack
os_region_name = RegionOne
auth_url = http://controller01:35357/v3
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = placement
password = placement
4-3.DB登録&設定ファイル読込み
su -s /bin/sh -c "nova-manage api_db sync" nova
su -s /bin/sh -c "nova-manage cell_v2 map_cell0" nova

su -s /bin/sh -c "nova-manage cell_v2 create_cell --name=cell1 --verbose" nova
su -s /bin/sh -c "nova-manage db sync" nova

systemctl restart nova-api nova-consoleauth nova-scheduler nova-conductor nova-novncproxy

以下出力例です。

root@controller01:~# su -s /bin/sh -c "nova-manage api_db sync" nova
root@controller01:~# su -s /bin/sh -c "nova-manage cell_v2 map_cell0" nova
root@controller01:~# su -s /bin/sh -c "nova-manage cell_v2 create_cell --name=cell1 --verbose" nova
e0e3f86a-8b85-4184-9287-7e4dcd53db81
root@controller01:~# su -s /bin/sh -c "nova-manage db sync" nova
/usr/lib/python2.7/dist-packages/pymysql/cursors.py:166: Warning: (1831, u'Duplicate index `block_device_mapping_instance_uuid_virtual_name_device_name_idx`. This is deprecated and will be disallowed in a future release.')
  result = self._query(query)
/usr/lib/python2.7/dist-packages/pymysql/cursors.py:166: Warning: (1831, u'Duplicate index `uniq_instances0uuid`. This is deprecated and will be disallowed in a future release.')
  result = self._query(query)
root@controller01:~# systemctl restart nova-api nova-consoleauth nova-scheduler nova-conductor nova-novncproxy
root@controller01:~#

This is deprecated and will be disallowed in a future release.と表示されますが、このまま先に進めてください。

<補足>
上記と似たようなコマンドで、以下の設定を実施する必要があります。
後ほど設定しますので現段階では不要です。

su -s /bin/sh -c "nova-manage cell_v2 discover_hosts --verbose" nova
4-4.簡易動作確認

この時点で以下のように登録されていればOKです。

openstack endpoint list
openstack service list

root@controller01:~# openstack endpoint list
+----------------------------------+-----------+--------------+--------------+---------+-----------+-------------------------------+
| ID                               | Region    | Service Name | Service Type | Enabled | Interface | URL                           |
+----------------------------------+-----------+--------------+--------------+---------+-----------+-------------------------------+
| 266e4c678cda43ab9bec4a70ddccfb97 | RegionOne | glance       | image        | True    | internal  | http://controller01:9292      |
| 4a8adf71ef9848b096819cf12e54c747 | RegionOne | placement    | placement    | True    | public    | http://controller01:8778      |
| 6256b9ec413d4a9ca8bc1feb90448260 | RegionOne | glance       | image        | True    | public    | http://controller01:9292      |
| 7ab5e26b0f524c60a9ba33870283940a | RegionOne | keystone     | identity     | True    | admin     | http://controller01:35357/v3/ |
| 8578d6dedb1742e2a190b261cddd831b | RegionOne | placement    | placement    | True    | admin     | http://controller01:8778      |
| 92a1b113381d4bd692879d335776928b | RegionOne | nova         | compute      | True    | admin     | http://controller01:8774/v2.1 |
| a8a9533b8b6345a1ba9fbedf840434d8 | RegionOne | nova         | compute      | True    | public    | http://controller01:8774/v2.1 |
| de3c9c2ca4484068b7e24a1dca3064a9 | RegionOne | placement    | placement    | True    | internal  | http://controller01:8778      |
| e414354758e04ac7802ba300a864258f | RegionOne | keystone     | identity     | True    | internal  | http://controller01:5000/v3/  |
| e8a1585c91754424a2c7432e2bb31116 | RegionOne | keystone     | identity     | True    | public    | http://controller01:5000/v3/  |
| f1fb03de6fb24d6e818b239ad0276083 | RegionOne | glance       | image        | True    | admin     | http://controller01:9292      |
| fe3a19d428c24042acb57218376f5fa6 | RegionOne | nova         | compute      | True    | internal  | http://controller01:8774/v2.1 |
+----------------------------------+-----------+--------------+--------------+---------+-----------+-------------------------------+

root@controller01:~# openstack service list
+----------------------------------+-----------+-----------+
| ID                               | Name      | Type      |
+----------------------------------+-----------+-----------+
| 35ae7499a8474de6b2650335cee9c38e | placement | placement |
| 42e7a20b30944518ae5c345aab323d3d | glance    | image     |
| bf8c25de6879401ea107f0462e8da1a4 | nova      | compute   |
| f3d100b18b794f649ee80c651787eb22 | keystone  | identity  |
+----------------------------------+-----------+-----------+

5.Nova2:Compute

対象:Computeのみ
x」となっている箇所は、Compute01と02でそれぞれ固有の値*3を入れる必要があります。

5-1.インストール・nova.conf設定・設定読込み
#インストール
apt -y install nova-compute

#nova.conf設定
vi /etc/nova/nova.conf

[DEFAULT]
transport_url = rabbit://openstack:rabbit@controller01
my_ip = 10.10.0.10x
##xについて##
#compute01=1, compute02=2となります。

[api]
auth_strategy= keystone

[keystone_authtoken]
auth_uri = http://controller01:5000
auth_url = http://controller01:35357
memcached_servers = controller01:11211
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = nova
password = nova

[vnc]
vncserver_proxyclient_address = 10.10.0.10x
enabled = True
vncserver_listen = 0.0.0.0
novncproxy_base_url = http://controller01:6080/vnc_auto.html
##xについて、上記と同様です##

[glance]
api_servers = http://controller01:9292

[oslo_concurrency]
lock_path = /var/lib/nova/tmp

[placement]
#os_region_name = openstack
os_region_name = RegionOne
auth_url = http://controller01:35357/v3
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = placement
password = placement

##VMWare上のu16.04の場合##
[libvirt]
hw_machine_type = x86_64=pc-i440fx-xenial

#設定読込み
systemctl restart nova-compute
5-2.簡易動作確認

この時点で以下のようにCompute01と02が登録されていればOKです。
Controller01で以下のコマンドにて確認してください。

openstack compute service list

root@controller01:~# openstack compute service list
+----+------------------+--------------+----------+---------+-------+----------------------------+
| ID | Binary           | Host         | Zone     | Status  | State | Updated At                 |
+----+------------------+--------------+----------+---------+-------+----------------------------+
|  1 | nova-scheduler   | controller01 | internal | enabled | up    | 2019-05-27T14:07:43.000000 |
|  2 | nova-consoleauth | controller01 | internal | enabled | up    | 2019-05-27T14:07:43.000000 |
|  3 | nova-conductor   | controller01 | internal | enabled | up    | 2019-05-27T14:07:44.000000 |
|  7 | nova-compute     | compute01    | nova     | enabled | up    | 2019-05-27T14:07:45.000000 |
|  8 | nova-compute     | compute02    | nova     | enabled | up    | 2019-05-27T14:07:41.000000 |
+----+------------------+--------------+----------+---------+-------+----------------------------+

6.Horizon

対象:Controllerのみ

6-1.インストール・nova.conf設定・設定読込み
#インストール
apt -y install openstack-dashboard

#nova.conf設定
vi /etc/openstack-dashboard/local_settings.py

#Defaultで以下の設定が入っていますが、全てコメントアウトしてください。
#OPENSTACK_HOST = "127.0.0.1"
#OPENSTACK_KEYSTONE_URL = "http://%s:5000/v2.0" % OPENSTACK_HOST
#OPENSTACK_KEYSTONE_DEFAULT_ROLE = "_member_"

#以下の設定を投入。
OPENSTACK_HOST = "controller01"
OPENSTACK_KEYSTONE_URL = "http://%s:5000/v3" % OPENSTACK_HOST
OPENSTACK_KEYSTONE_DEFAULT_ROLE = "user"
OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT = True
OPENSTACK_KEYSTONE_DEFAULT_DOMAIN = "Default"

#OPENSTACK_API_VERSIONSの設定は、Defaultでコメントアウトされているため、
#以下の設定をそのまま投入してください。
OPENSTACK_API_VERSIONS = {
    "identity": 3,
    "image": 2,
    "volume": 2,
}

#Defaultで以下の設定が入っていますが、全てコメントアウトしてください。
#かなり画面をスクロールしないと最後まで表示されないと思います。
#OPENSTACK_NEUTRON_NETWORK = {
#    'enable_router': True,
#    'enable_quotas': True,
#    'enable_ipv6': True,
#    'enable_distributed_router': False,
#    'enable_ha_router': False,
#    'enable_fip_topology_check': True,

    # Default dns servers you would like to use when a subnet is
    # created.  This is only a default, users can still choose a different
    # list of dns servers when creating a new subnet.
    # The entries below are examples only, and are not appropriate for
    # real deployments
    # 'default_dns_nameservers': ["8.8.8.8", "8.8.4.4", "208.67.222.222"],

    # Set which provider network types are supported. Only the network types
    # in this list will be available to choose from when creating a network.
    # Network types include local, flat, vlan, gre, vxlan and geneve.
    # 'supported_provider_types': ['*'],

    # You can configure available segmentation ID range per network type
    # in your deployment.
    # 'segmentation_id_range': {
    #     'vlan': [1024, 2048],
    #     'vxlan': [4094, 65536],
    # },

    # You can define additional provider network types here.
    # 'extra_provider_types': {
    #     'awesome_type': {
    #         'display_name': 'Awesome New Type',
    #         'require_physical_network': False,
    #         'require_segmentation_id': True,
    #     }
    # },

    # Set which VNIC types are supported for port binding. Only the VNIC
    # types in this list will be available to choose from when creating a
    # port.
    # VNIC types include 'normal', 'direct', 'direct-physical', 'macvtap',
    # 'baremetal' and 'virtio-forwarder'
    # Set to empty list or None to disable VNIC type selection.
#    'supported_vnic_types': ['*'],

    # Set list of available physical networks to be selected in the physical
    # network field on the admin create network modal. If it's set to an empty
    # list, the field will be a regular input field.
    # e.g. ['default', 'test']
#    'physical_networks': [],

#}

#以下の設定を投入。
#現段階では全てFalseでOKです。後でrouterとdistributed_routerをTrueにします。
OPENSTACK_NEUTRON_NETWORK = {
    'enable_router': False,
    'enable_quotas': False,
    'enable_ipv6': False,
    'enable_distributed_router': False,
    'enable_ha_router': False,
    'enable_lb': False,
    'enable_firewall': False,
    'enable_vpn': False,
    'enable_fip_topology_check': False,
}

#DEFAULT_THEME = 'ubuntu'
DEFAULT_THEME = 'default'

#設定読込み
systemctl reload apache2
6-2.簡易動作確認

以下のURLにアクセスし、ログインしてください。

http://controller01/horizon/
domain default
username admin
password openstack

ログイン画面は以下の通りです。
f:id:metonymical:20190527234147p:plain

ログイン後、いくつかのページが開ければOKです。
f:id:metonymical:20190527234201p:plain

以上です。

7.最後に

Neutron+OvS+DVR&Trunkをメインの内容にしたいと考えていたため、OpenStack のインストールまで書くのはどうかな?と正直悩みました。
RDO(PackStack)やDevStackを使えば、サクッとできると思うので。。。

しかし、物理筐体のNW周りからスタートしたこと*4により、

  • 物理NW周り
  • OpenStackの主要コンポーネント準備
  • Neutron:NWシステム(dhcp&metadata含む)
  • OvS:L2agent
  • DVR:L3agent
  • Trunk:L2トランク

という風に、段階的に構築していくことで、
より理解が深まりやすいのではないか?と考えました。

最初からDevStackなどで構築してしまうと、とりあえずDNSでLookupしてPing通るようになったけど、そこから自分がやりたい構成に変更する場合は、どこをいじったらいいのか?すぐにはピンと来ないかなと考えたからです。

というのも、
今回の構成を実際に構築して理解した上で
 L2agentであれば、LinuxBridge
 L3agentであれば、スタンドアローンRouterやHA Router(VRRP)
に変更することは容易いです。

また、Tungsten FabricやMidoNetに構成変更することも、今回の構成を理解していれば、それほど敷居は高くないかなと考えています。
なので、復習の意味も込めて、OpenStackのインストールも書くことにしました。

*1:進める前に現段階での仮想マシンのクローンやスナップショットは取得しておくことをお勧めします。

*2:以降、大事な箇所のみ出力例を記載します。

*3:compute01=1, compute02=2となります。今後もちょくちょく登場するので気を付けてください。

*4:今回はOpenStackのHostOSはVMWare上の仮想マシンですが…

Open Stack Neutron環境構築 その1:足回りの事前準備

これから数回に別けて、Open Stack(pike)のインストールから、Neutron, OvS, DVR, Trunk(VLAN aware VMs)周りの構築方法について記載したいと思います。*1

環境は、Windows10のVMWare上にController×1台、Compute×2台を構築し、その中でNeutronを稼働させる構成となります。
このため、Compute Node上で稼働させるVMインスタンスはネストされてる点に注意してください。
構成情報は可能な限りオブラートに包まないようにしたいと思います。*2

1.構成

1-1.環境
HostOS                           : Windows10pro Ver:1809 Build:17763.503
NIC                              : Intel I350
Driver                           : Intel PROSet 23.5.2
VMWare              : VMware(R) Workstation 15 Pro 15.1.0 build-13591040  

GuestOS              : Ubuntu16.04 
Kernel              : 4.13.0-041300

上記GuestOS上にController&Compute Nodeを稼働させます。

1-2.構成概要1

f:id:metonymical:20190527140044p:plain
物理的な構成概要です。*3

ens33 管理用
ens34 Compute Node間通信用
ens35 インスタンス通信用
1-3.構成概要2

f:id:metonymical:20190527140525p:plain
論理的な要素を追記します。

ens33 10.10.0.0/24 ssh&Internet接続出来るようにしておいてください。
ens34 10.20.0.0/24 Node間通信用のため、L3SW側にVlan Intは無くても構いません。
ens35 IP不要 br用なので現段階ではLinkUpだけさせればOKです。
1-4.構成概要3

f:id:metonymical:20190527141522p:plain
Compute02のens35にフォーカスしたNeutron導入後のイメージです。
ens35は図のようなイメージでNeutron*4のbr用に使用するためIP不要となります。
ここがメインの内容となるため詳細は次々回以降くらいに別途記載します。*5

2.事前準備その1

Open Stack周りの各コンポーネント をインストールしていく前にやっておくべきことを記載していきます。

2-1.Intel Driver

f:id:metonymical:20190527143633p:plain

I350#1 Physical1 過去記事などを参考にVLAN Interfaceの設定を行ってください。*6
I350#2 Physical2 過去記事などを参考にTrunkできるようにしておいてください。

HostOSをLinuxにしたい場合は、過去記事などを参考にして頂ければと思います。

2-2.仮想ネットワークエディタ

f:id:metonymical:20190527144640p:plain

VMnet15 I350#1_VLAN10 Intel DriverにてVLAN10をタグ付けしてL3SWと送受信。
VMnet16 I350#1_VLAN20 Intel DriverにてVLAN20をタグ付けしてL3SWと送受信。
VMnet9 I350#2 Intel Driverでは何もせずにL3SWと送受信。*7
2-3.仮想マシンの設定1

f:id:metonymical:20190527145807p:plain
Controller×1台、Compute×2台の3台とも同様の設定にします。*8

2-4.仮想マシンの設定2

f:id:metonymical:20190527150139p:plain
ネストしますので、赤枠にチェックを入れておいてください。

2-5.仮想マシンの設定3

f:id:metonymical:20190527150253p:plain

ens33 ネットワークアダプタ カスタム(VMnet15)
ens34 ネットワークアダプタ2 カスタム(VMnet16)
ens35 ネットワークアダプタ3 カスタム(VMnet9)

ネットワークアダプタは上記のように設定してください。*9

2-6.L3SWの設定
vlan 10,20,30,300
!
interface GigabitEthernet0/1
 switchport trunk encapsulation dot1q
 switchport trunk allowed vlan 10,20
 switchport mode trunk
!
interface GigabitEthernet0/2
 switchport trunk encapsulation dot1q
 switchport trunk allowed vlan 30,300
 switchport mode trunk
!
interface vlan 10
 ip address 10.10.0.254/24
!
interface vlan 20
 ip address 10.20.0.254/24
!
interface vlan 30
 ip address 10.30.0.1/24
!
interface vlan 300
 ip address 192.168.30.254/24

上記に加えて、Internetに出られるようDefaultRouteなどを設定しておいてください。


ここまで完了すると、1-2.構成概要1になると思います。

3.事前準備その2

仮想マシンの諸々の設定を実施します。
*10
重複設定もあるためクローンを作成するなど工夫してください。

対象:全Node*11

3-1.rootログイン
sudo su -
sudo passwd root

sudo sed -e 's/^PermitRootLogin prohibit-password/PermitRootLogin yes/g' \
-i /etc/ssh/sshd_config

sudo systemctl restart sshd
3-2.ホスト名とHostsファイル
#ホスト名設定
#各Nodeごとに変更
hostnamectl set-hostname controller01


#Hostsファイル設定
#127.0.1.1のみ、各Nodeごとに変更

vi /etc/hosts

127.0.0.1       localhost
127.0.1.1       controller01.local.jp controller01   

10.10.0.100     controller01.local.jp controller01
10.10.0.101     compute01.local.jp compute01
10.10.0.102     compute02.local.jp compute02
3-3.インターフェース設定
#以下はController01の設定例
#Compute01&02では第4octetを修正

vi /etc/network/interfaces

auto ens33
iface ens33 inet static
    address 10.10.0.100
    netmask 255.255.255.0
    gateway 10.10.0.254
    dns-nameserver 8.8.8.8

auto ens34
iface ens34 inet static
    address 10.20.0.100
    netmask 255.255.255.0

auto ens35
iface ens35 inet manual

systemctl restart networking
3-4.NTP
apt -y install chrony

vi /etc/chrony/chrony.conf

#pool 2.debian.pool.ntp.org offline iburst
server ntp1.jst.mfeed.ad.jp offline iburst
server ntp2.jst.mfeed.ad.jp offline iburst
server ntp3.jst.mfeed.ad.jp offline iburst

systemctl restart chrony
systemctl enable chrony
chronyc sources
3-5.apt updateなど
apt update
apt -y install software-properties-common
add-apt-repository cloud-archive:pike
apt update
apt dist-upgrade
3-5.Kernel更新
mkdir /root/tmp
cd tmp

wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v4.13/linux-headers-4.13.0-041300_4.13.0-041300.201709031731_all.deb && \
wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v4.13/linux-headers-4.13.0-041300-generic_4.13.0-041300.201709031731_amd64.deb && \
wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v4.13/linux-image-4.13.0-041300-generic_4.13.0-041300.201709031731_amd64.deb

dpkg -i *.deb

reboot

ここまで完了すると、1-3.構成概要2になると思います。
各NodeからGWアドレスへの疎通確認やNode同士による相互疎通確認など実施してください。*12


以上です。

4.最後に

下回りがうまく作れずに外部NWへトラフィックが流せないと色々残念なので少し掘り下げてみました。
これをベースに、あとはNeutron側の設定だけで、L2のまま外部へ流したり、L3でRoutingすることが可能になります。

*1:Open StackやNeutronのインストール方法をご存じの方は構成だけザックリ眺めてもらう程度で構いません

*2:この先は物理NWです、的な説明にはならないように心がけます。

*3:ControllerやCompute Nodeが物理サーバであれば、9個の物理ポートでL3SWに直結されます。

*4:厳密にはOpen vSwitchです

*5:Routingに加えて、TrunkによるBridgeにもフォーカスしたいと思います。

*6:VLAN30は不要です

*7:Linuxであれば簡単にできるのですが、Windowsの場合は過去記事のような方法が必要でした。

*8:メモリが厳しい場合、Controller=4GB, Compute=2GBでもいけるかもしれません。

*9:私の環境では、ネットワークアダプタ1~3がそれぞれens33~35に紐づいていましたが、Ubuntu16.04以外で稼働させる場合は、適宜その環境に合わせて読み替えてください。

*10:ネットワーク周りやHostsファイル、NTP、apt-update、Kernel更新などですが、そこまで重要ではないため、サラッと流します。

*11:対象ホストは必要に応じて記載します。

*12:名前解決可否も忘れずに。

Windows10 VLAN aware VMs

Windows10上の仮想マシンにVLAN Tagを付けて外部NWと疎通させる方法を記載します。
補足として、仮想マシンで付加したVLAN TagがIntelNICで剥がされないようにするための方法となります。

1.構成

1-1.環境
OS                               : Windows10pro Ver:1809 Build:17763.503
NIC                              : Intel I350, I219-V(OnboardNIC)
Driver                           : Intel PROSet 23.5.2
VMWare              : VMware(R) Workstation 15 Pro 15.1.0 build-13591040  
1-2.構成概要

f:id:metonymical:20190520092200p:plain
(1)でレジストリをいじることによって、Guest9で付加したVLAN Tagが物理スイッチまで剥がされないようになります。
これにより、Guest9上でCumulusVXやNexus9000v、OpenStack Netronなどを稼働させ、外部NWとの間でTag付きEtherフレームのやり取りができるようになります。
今回は例として、VMWare上で仮想マシンを稼働させていますが、当然、GNS3上の仮想NW機器にも応用できると考えています。

ちなみに、(2)については、過去記事
Windows10 VLAN Interface設定 - Metonymical Deflection
を参照してください。

2.NICの詳細設定

NICのプロパティで802.1qを無効化します。
以下の画面で構成をクリックします。
VMWare Bridge Protocolにチェックが入っていることを確認してください。*1
f:id:metonymical:20190520093220p:plain

詳細設定タブをクリックします。
パケット優先度とVLANのプロパティから、パケット優先度とVLAN無効を選択し、OKをクリックします。
f:id:metonymical:20190520094142p:plain

次に左の画面でドライバ>ドライバーの詳細をクリックします。
右の画面が表示されます。
ドライバ名が「e1r」から始まっていることを確認しておいてください。*2
f:id:metonymical:20190520093706p:plain

3.レジストリの設定

この設定により、IntelNIC上でVLAN Tagが剥がされずに仮想マシンと物理スイッチ間でTag付きEtherフレームのやり取りができるようになります。
レジストリエディタを起動してください。*3
以下のパスに移動してください。

HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}\00nn

以下の画面となります。
00nnの「nn」は、下図のようにNICごとに割り当てられています。
このため、nnを識別するためには、中身を一つづつ参照してください。そして、DriverDescにNIC名が表示されていますので、その名前で該当するNICを判断します。下図の例では「0002」となります。
f:id:metonymical:20190520094818p:plain

「0002」上で右クリック>新規>文字列(dword)をクリックします。
名前(レジストリキー)は以下に従ってください。
今回の例では、ドライバ名が「e1r」から始まっているため、「MonitorMode」となります。
dwordのデータ(値)は「1」としてください。

Adapter Driver					Registry Key
e1g, e1e, e1y					MonitorModeEnabled
e1c, e1d, e1k, e1q, e1r, ixe, ixn, ixt		MonitorMode

設定が完了したら、Win10を再起動してください。

4.仮想ネットワークエディタの設定

VMWareの仮想ネットワークエディタを起動します。
設定の変更をクリックして編集モードに移行します。
ネットワークの追加をクリックし、任意のVMnet(ここでは、VMnet9)を選択します。
下図のようにブリッジ先を前項で設定した物理NICを選択します。
f:id:metonymical:20190520100209p:plain

5.補足

構成概要図より、

  • (1)ゲストOS(仮想マシン)側でVLAN Tagを付与したい場合に使用
  • (2)ホストOS側でVLAN Tagを付与したい場合に使用

といった使い分けができるようになります。

以上です。

6.最後に

以下のサイトを参考にさせて頂きました。
Wireshark + Intel NIC で tagVLAN の VLAN-ID を含めてキャプチャする方法 - ..たれろぐ..
My Sniffer Isn't Seeing VLAN, 802.1q, or QoS Tagged Frames

元々、VMWare上でOpenStack Neutronのお勉強をしていたのですが、外部NWとの疎通時にVLAN Tagが使えず困り果てていたため、今回の記事をアップしました。
DL360にLinux入れてやれば造作もない話なのですが、最近メインPCのリプレースに伴いMem64GBにしたので、Win10+VMWare上でもそこそこな構成は組めるようになったため、ちょっと詳しく調べました。

私個人的にですが、この辺のノウハウのことを「足回りの技術」などと呼んでおり、私の中で、この足回りの技術は極めて重要な技術だと考えています。
なぜなら、足回りをしっかり理解しておかないと、自分のやりたい構成が組めなかったり、本来やらなければならない検証などができないからです。
加えて、ネットワークエンジニアとしては外部NWとの接続や疎通が必須となってくるため、ブリッジ(L2レベルの)技術は、かなり重要だなと思っています。

しかしながら、この辺の詳細について解説されているサイトが少ないと個人的には感じているため、このサイトではLinuxに加えてWindowsについても深掘りし過ぎたいなと考えています。

ちなみに、VMWareではなく、Hyper-Vの仮想スイッチマネージャを使うと、レジストリをいじらなくてもできるっぽいので、時間があれば検証してみようかなと思っています。

*1:ちなみに、画面に表示されているNpcapは、WiresharkでPcapするためのものなので気にしないでください。また、IPv4IPv6はチェックが入っていてもいなくても、レイヤが異なるため今回の設定には関係ありません。

*2:後述するレジストリをいじる際、レジストリの名前で使用します。

*3:お決まりですが、レジストリの編集は自己責任でお願いします。

Windows10 VLAN Interface設定

PowerShellによるWindows10でのVLAN Interface設定方法について記載します。

以前の記事ではWindowsIntelNICを使用したVLAN Interfaceの設定方法を書きました。しかし、Windows10 1809+Intel PROSet 23.5.2の構成で試したところ、VLANやチームなどのタブが表示されず、困り果てたので、PowerShellによる設定方法を記載します。

2021/06/26Update
GUIによるWindows10でのVLAN Interface設定方法について記載しました。
metonymical.hatenablog.com

1.構成

1-1.環境
OS                               : Windows10pro Ver:1809 Build:17763.437 
NIC                              : Intel I350, I219-V(OnboardNIC)
Driver                           : Intel PROSet 23.5.2

2020/02/15追記
OS                               : Windows10pro Ver:1909 Build:18363.657 
NIC                              : Intel I350
Driver                           : Intel PROSet 25.0.0.0

上記の構成でNICのVLAN設定を行おうとしたら、VLANやチーム化のタブが表示されなかった場合の対処方法となります。

2.Intel PROSetのDL

以下のIntelサイトよりPROSetドライバをDLします。
イーサネット製品」を選択の上、絞り込み条件にて「Windows10」 を選択してください。
downloadcenter.intel.com

以下のような画面でDLします。
f:id:metonymical:20190504060825p:plain

3.Intel PROSetのインストール

exe形式のファイル*1なので、そのまま実行してください。
インストール時の注意点として、セットアップ・オプション時に
「Advanced Network Services」にチェックを入れてください。
f:id:metonymical:20190504061214p:plain

3-1.NICのプロパティを開いて構成画面を確認

構成をクリックします。
f:id:metonymical:20190504061620p:plain
現在は、VLANやチーム化のタブが表示されません。
f:id:metonymical:20190504061717p:plain
ちなみに、以前は以下の画面のように表示されており、ここから設定が可能でした。
f:id:metonymical:20190504055949j:plain

ここから、PowerShellを使って、VLAN設定を行っていきます。

4.PowerShellによるVLAN設定

管理者権限にてPowerShellを起動してください。

4-1.コマンド

以下にコマンドのみ記載しておきます。

IntelNIC用のモジュールをインポート
Import-Module -Name "C:\Program Files\Intel\Wired Networking\IntelNetCmdlets"

GetコマンドにてNICの名前(ParentName)を取得
Get-IntelNetAdapter

NICの名前を-ParentName に指定し、追加したいVLANIDを指定
Add-IntelNetVLAN -ParentName "Intel(R) I350 Gigabit Network Connection" -VLANID 30

追加したいVLANIDを複数指定の場合
Add-IntelNetVLAN -ParentName "Intel(R) I350 Gigabit Network Connection" -VLANID 30,35,39

追加したいVLANIDを複数かつ連続指定の場合
Add-IntelNetVLAN -ParentName "Intel(R) I350 Gigabit Network Connection" -VLANID (300..304)

VLANIDや名前の変更
Set-IntelNetVLAN -ParentName "Intel(R) I350 Gigabit Network Connection" -VLANID 3 -NewVLANID 300 -NewVLANName "VLAN300"

VLAN Interfaceの削除
Remove-IntelNetVLAN -ParentName "Intel(R) I350 Gigabit Network Connection" -VLANID 30
4-2.IntelNetCmdletsモジュールのインポート

PowerShellにIntelNetCmdletsモジュールをインポートします。
出力結果は特に表示されません。

PS C:\Windows\system32> Import-Module -Name "C:\Program Files\Intel\Wired Networking\IntelNetCmdlets"
4-3.IntelNICの情報取得

以下のコマンドで現在のIntelNICの状態を取得します。
次項にてNameに表示されたNICの名前をParentNameとして指定するため、テキストエディタなどにコピーしておいてください。

PS C:\Windows\system32> Get-IntelNetAdapter

Location        Name                                                           ConnectionName            LinkStatus
--------        ----                                                           --------------            ----------
0:31:6:0        Intel(R) Ethernet Connection (7) I219-V                       local                     1.00 Gbps ...
5:0:0:0         Intel(R) I350 Gigabit Network Connection                      physical1                 1.00 Gbps ...
5:0:1:0         Intel(R) I350 Gigabit Network Connection #2                   physical2                 1.00 Gbps ...
4-4.VLAN Interfaceの追加 その1

以下のコマンドにてVLAN Interfaceを追加します。
ここでは例として、物理NICIntel(R) I350 Gigabit Network Connectionに、VLANID300のVLAN Interfaceを追加しています。

PS C:\Windows\system32> Add-IntelNetVLAN -ParentName "Intel(R) I350 Gigabit Network Connection" -VLANID 300

VLANID VLANName                                       ParentName
------ --------                                       ----------
300    VLAN300                                        Intel(R) I350 Gigabit Network Connection
4-5.VLAN Interfaceの追加 その2

以下のコマンドにてVLAN Interfaceを複数追加します。
ここでは例として、物理NICIntel(R) I350 Gigabit Network Connectionに、VLANID300と304のVLAN Interfaceを追加しています。VLANIDはカンマで区切ってください。

PS C:\Windows\system32> Add-IntelNetVLAN -ParentName "Intel(R) I350 Gigabit Network Connection" -VLANID 300,304

VLANID VLANName                                       ParentName
------ --------                                       ----------
300    VLAN300                                        Intel(R) I350 Gigabit Network Connection
304    VLAN304                                        Intel(R) I350 Gigabit Network Connection
4-6.VLAN Interfaceの追加 その3

以下のコマンドにてVLAN Interfaceを複数かつ連続追加します。
ここでは例として、物理NICIntel(R) I350 Gigabit Network Connectionに、VLANID300から304のVLAN Interfaceを追加しています。VLANIDは(300..304)として指定してください。

PS C:\Windows\system32> Add-IntelNetVLAN -ParentName "Intel(R) I350 Gigabit Network Connection" -VLANID (300..304)

VLANID VLANName                                       ParentName
------ --------                                       ----------
300    VLAN300                                        Intel(R) I350 Gigabit Network Connection
301    VLAN301                                        Intel(R) I350 Gigabit Network Connection
302    VLAN302                                        Intel(R) I350 Gigabit Network Connection
303    VLAN303                                        Intel(R) I350 Gigabit Network Connection
304    VLAN304                                        Intel(R) I350 Gigabit Network Connection

VLAN Interfaceが一つも作成されていない状態で、上記コマンドを打つと、私の環境ではVLAN Interface作成まで(プロンプトが出力結果を返すまで)に5分程度掛かりました。

4-7.VLAN Interfaceの追加 その4

以下のコマンドにて、UnTag(タグなし)のVLAN Interfaceを追加します。
ここでは例として、物理NICIntel(R) I350 Gigabit Network Connectionに、VLANID0のVLAN Interfaceを追加しています。
また、UnTagのVLAN Interfaceを追加する場合、物理NICに1つ以上のVLAN Interfaceを作成した後に追加してください。

PS C:\Windows\system32> Add-IntelNetVLAN -ParentName "Intel(R) I350 Gigabit Network Connection" -VLANID 0

VLANID VLANName                                       ParentName
------ --------                                       ----------
0      タグなし                                       Intel(R) I350 Gigabit Network Connection
4-8.VLAN Interfaceの名前編集

以下のコマンドにて、タグなしのVLAN Nameを変更します。
ここでは例として、物理NICIntel(R) I350 Gigabit Network ConnectionのVLANID0のVLAN Nameを変更しています。
2Byte文字は極力使用したくないので。。

PS C:\Windows\system32> Set-IntelNetVLAN -ParentName "Intel(R) I350 Gigabit Network Connection"  -VLANID 0 -NewVLANName "untag"

VLANID VLANName                                       ParentName
------ --------                                       ----------
0      untag                                          Intel(R) I350 Gigabit Network Connection

また、Set-IntelNetVLANコマンドでは、VLANIDを変更することも可能です。
ここでは例として、物理NICIntel(R) I350 Gigabit Network ConnectionのVLANID300のVLANIDを3に変更しています。
但し、以下のコマンドのみですと、VLAN Nameは変更されないため、先のコマンドにてVLAN Nameも変更しておいてください。また、併用も可能です。

PS C:\Windows\system32> Set-IntelNetVLAN -ParentName "Intel(R) I350 Gigabit Network Connection"  -VLANID 300 -NewVLANID 3

VLANID VLANName                                       ParentName
------ --------                                       ----------
3      VLAN300                                        Intel(R) I350 Gigabit Network Connection

ちなみに、上記のVLAN Nameは以下の画面で表示されます。
実際はレジストリ上に記載されるため、極力2Byte文字は使用したくないと考えています。
f:id:metonymical:20190504071841p:plain

5.設定の確認

5-1.VLAN Interfaceの確認

以下のコマンドにて、設定したVLAN Interfaceを確認することが可能です。

PS C:\Windows\system32> Get-IntelNetVLAN

VLANID VLANName                                       ParentName
------ --------                                       ----------
301    VLAN301                                        Intel(R) I350 Gigabit Network Connection
303    VLAN303                                        Intel(R) I350 Gigabit Network Connection
300    VLAN300                                        Intel(R) I350 Gigabit Network Connection
0      untag                                          Intel(R) I350 Gigabit Network Connection
302    VLAN302                                        Intel(R) I350 Gigabit Network Connection
304    VLAN304                                        Intel(R) I350 Gigabit Network Connection

6.補足

6-1.ヘルプの使用

以下のように、helpと入力した後、コマンドに引数なしで実行するとヘルプが表示されます。

PS C:\Windows\system32> help Add-IntelNetVLAN

名前
    Add-IntelNetVLAN

概要
    アダプターまたはインテル(R) ANS チームのいずれかで VLAN を作成します。


構文
    Add-IntelNetVLAN []

    Add-IntelNetVLAN []


説明
    Add-IntelNetVLAN は、アダプターまたはインテル(R) ANS チームのいずれかに新しい VLAN を追加できます。新しい VLAN は、1 つまたは複数の VLAN ID を指定することによって追加されます。デバイ
    スの名前またはデバイスのオブジェクトのいずれかを使用して、親デバイスを指定できます。テーブル表示で新しい VLAN を表示します。

    アダプターまたはチームに最大 64 個の VLAN を追加できます。

    注:Windows* 10 搭載のシステムでインテル(R) アドバンスト・ネットワーク・サービス (インテル(R) ANS) チームまたは VLAN を作成するには、最新の Microsoft* Windows* 10 更新プログ
    ラムをインストールする必要があります。


関連するリンク
    Get-IntelNetAdapter
    Get-IntelNetTeam

注釈
    例を参照するには、次のように入力してください: "get-help Add-IntelNetVLAN -examples".
    詳細を参照するには、次のように入力してください: "get-help Add-IntelNetVLAN -detailed".
    技術情報を参照するには、次のように入力してください: "get-help Add-IntelNetVLAN -full".
    オンライン ヘルプを参照するには、次のように入力してください: "get-help Add-IntelNetVLAN -online"

さらに、詳細やコマンド例を確認したい場合は、注釈に従って、以下のようにコマンドを入力してください。

get-help Add-IntelNetVLAN -examples
get-help Add-IntelNetVLAN -detailed
get-help Add-IntelNetVLAN -full

初回は以下のようにアップデートを要求されるため、yを入力してアップデートしてください。

PS C:\Windows\system32> get-help Add-IntelNetVLAN -examples

Update-Help を実行しますか?
Update-Help コマンドレットは、Windows PowerShell モジュールの最新のヘルプ
ファイルをダウンロードして、コンピューターにインストールします。Update-Help
コマンドレットの詳細については、https://go.microsoft.com/fwlink/?LinkId=210614 を参照してください。
[Y] はい(Y)  [N] いいえ(N)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"): y

2020/02/15 追記
Windows10 1809→1909にVersion Upしたところ、VLAN Interfaceの設定が全て消えました。
このため、Version Up後は再度作り直しが必要となります。
また、作り直した後、コンパネ上の名前*2が「イーサネットxx」と表示されます。
これを元々使っていた名前(例えば、vlan300)に変更しようとすると、以下のエラーが表示され、同じ名前に設定することができません。
f:id:metonymical:20200216002705p:plain
このため、「vlan0300」や「v300」など名前を工夫してください。*3


加えて、IntelNICドライバのVersionは24.3以降の方が良さそうです。
情報ソースは以下のURLとなります。
https://forums.intel.com/s/question/0D50P00004Vdz0P/windows-1909?language=ja

私もVer23.5.2のままだったことに起因したのか、VLAN Interfaceの有効化ができなくなりました。
このため、IntelNICドライバをVer25.0.0.0へアップデートしたところ正常に動作することを確認しました。


以上です。

7.最後に

以下のサイトを参考にさせて頂きました。
https://www.intel.co.jp/content/www/jp/ja/support/articles/000023545/network-and-i-o.html

以前は、Windows Server2016かつPowerShellのみでVLAN Interface作成が可能だった時期があったと思います。その後、Intel PROSetのVer22系にてWindows10でもVLAN InterfaceがGUI(NICの構成のプロパティ)で作成可能になりました。

しかし、Windows10でできるようになったものの、VerUpするたびにVLAN Interfaceが消えたりしていたため、一抹の不安を感じていたのですが、Intelのサイトやフォーラムを読んでいくと、いろいろと試行錯誤していた変遷がわかりました。NICの構成のプロパティでは、色々と制約があったようで、今回ご紹介したPowerShellによる設定となったようです。

今後はIntel ACU(Adapter Configuration Utility)上で設定できるみたいなので、それを待ちたいと思います。

また、今回はチーミングについて触れていませんが、上記のIntelサイトにはチーミングコマンドについても記載があるため、興味がある方はヘルプを参照しながら設定してみてください。

*1:32bit版であればPROWin32.exeなど

*2:Power Shellで設定するVLAN Nameではなく、コンパネ上の表示名の方です。

*3:VerUp前の名前はレジストリ上にゴミとして残っていますが、これを消すのリスクの方が大きいと思いますので。

CentOS7 ovs(Open vSwitch)+DPDKのビルドとネットワーク設定方法

CentOS7によるovs(Open vSwitch)+DPDKのビルドとネットワーク設定方法について記載しました。
前回記事にDPDKを実装しました。
当初はOvSもDPDKもrpmビルドしたものをインストールするところまではOKだったのですが、いざ仮想マシンからトラフィックを流すと上手く流れず・・・だったので、ソースからビルドしました。

1.構成

1-1.環境
筐体                             : ProLiant DL360e Gen8
System ROM                       : P73 01/22/2018
NIC                              : Intel X540-AT2
OS                               : CentOS7.6(1810)
Kernel                           : 3.10.0-957.el7.x86_64
Installed Environment Groups     : Server with GUI
Add-Ons for Selected Environment : Virtualization Client, Virtualization Hypervisor, Virtualization Tools 
ovs                              : 2.10.90
DPDK                             : 18.11

2020/08/09追記
以下のOvS Versionにて動作確認を行ったところ、一部手順が変わっていたため、「2020/08/09追記」として追記します。

ovs                              : 2.13.0
DPDK                             : 19.11.2
1-2.全体の流れ

事前準備
DPDKソースビルド
OvSソースビルド
OvS+DPDKのネットワーク設定
仮想マシンのvirsh edit

2.事前準備

2-1.qemu-kvm-evのインストール

CentOS7のqemu-kvmですと、vHostUserClientに対応していないため、qemu-kvm-evを事前にインストールしておきます。

yum -y install centos-release-qemu-ev
sed -i -e "s/enabled=1/enabled=0/g" /etc/yum.repos.d/CentOS-QEMU-EV.repo
yum --enablerepo=centos-qemu-ev -y install qemu-kvm-ev
systemctl restart libvirtd
/usr/libexec/qemu-kvm -version

qemu-evリポジトリファイルのインストール
qemu-evリポジトリの常時無効化*1
qemu-kvm-evのインストール
libvirtd再起動
qemu-kvmのVersion確認

2-2.qemu-kvmの実行ユーザをrootへ変更

qemu-kvmの実行ユーザをqemu→rootに変更します。

vi /etc/libvirt/qemu.conf

user = "root"  #コメントを外す
group = "root"  #コメントを外す

viで/etc/libvirt/qemu.confを開き、上記ユーザとグループの行をコメントアウト

2-3.必要なパッケージのインストール
yum -y install libpcap-devel numactl-devel

2020/08/09追記

yum -y install libcap-ng-devel python3
2-4.HugePageとIOMMUの有効化
sed -i -e "/GRUB_CMDLINE_LINUX=/s/\"$/ default_hugepagesz=1G hugepagesz=1G hugepages=16\"/g" /etc/default/grub
sed -i -e "/GRUB_CMDLINE_LINUX=/s/\"$/ intel_iommu=on iommu=pt pci=realloc\"/g" /etc/default/grub
grub2-mkconfig -o /etc/grub2.cfg
reboot

hugepageの有効化
iommuの有効化*2
grubに設定反映
再起動

2-5.HugePageの確認とマウント
grep Huge /proc/meminfo

出力例
# grep Huge /proc/meminfo
AnonHugePages:    135168 kB
HugePages_Total:      16
HugePages_Free:       16
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:    1048576 kB

vi /etc/fstab

最終行に以下を追記
nodev  /mnt/huge_1GB hugetlbfs pagesize=1GB    0 0

HugePageの割り当て状況確認
HugePageの永続化マウント

2-6.vfio-pciの設定
echo "vfio-pci" > /etc/modules-load.d/vfio-pci.conf
echo "options vfio_iommu_type1 allow_unsafe_interrupts=1" > /etc/modules-load.d/iommu.conf

vfio-pciの永続化設定
vfio-pciのiommu利用の永続化

2-6’.uio_pci_generic設定

vfio-pciが利用できない場合は、uio_pci_genericを使用します。

echo "uio_pci_generic" > /etc/modules-load.d/uio_pci_generic.conf

uio_pci_genericの永続化設定

ここまでの準備が整ったら一旦再起動してください。

reboot

3.DPDKソースビルド

3-1.ビルド環境準備

ビルド環境の準備をします。

cd /usr/src/
wget http://fast.dpdk.org/rel/dpdk-18.11.tar.xz
tar xf dpdk-18.11.tar.xz
export DPDK_DIR=/usr/src/dpdk-18.11
cd $DPDK_DIR

ディレクトリ移動
ソースのダウンロード
ソースのtarファイルを解凍
パスのエクスポート
ディレクトリ移動

2020/08/09追記

cd /usr/src/ && \
wget http://fast.dpdk.org/rel/dpdk-19.11.2.tar.xz && \
tar xf dpdk-19.11.2.tar.xz && \
export DPDK_DIR=/usr/src/dpdk-stable-19.11.2 && \
cd $DPDK_DIR
3-2.ビルド

ソースからビルドします。

export DPDK_TARGET=x86_64-native-linuxapp-gcc
export DPDK_BUILD=$DPDK_DIR/$DPDK_TARGET
make install T=$DPDK_TARGET DESTDIR=install

パスのエクスポート
パスのエクスポート
ビルド&インストール

多少時間は掛かりますが、最後の方は以下のような出力がでれば正常にビルドが完了しています。

  INSTALL-APP dpdk-test-eventdev
  INSTALL-MAP dpdk-test-eventdev.map
Build complete [x86_64-native-linuxapp-gcc]
================== Installing install/
Installation in install/ complete

4.OvSソースビルド

4-1.ビルド環境準備

ビルド環境の準備をします。

cd /usr/src
git clone https://github.com/openvswitch/ovs.git

ディレクトリ移動
git cloneにてソースのダウンロード

4-2.ビルド

ソースからビルドします。

cd /usr/src/ovs
./boot.sh
./configure --with-dpdk=$DPDK_BUILD
make && make install

ディレクトリ移動
boot.sh実行
configure実行
ビルド&インストール

2019/12/28 追記
上記のmakeでエラーとなる場合は以下で実施してみてください。

cd /usr/src/ovs
./boot.sh
./configure --with-dpdk=$DPDK_BUILD CFLAGS="-g -O2 -msse4.1" && \
make && make install

上記のうち、$DPDK_BUILDは以下のパスとなります。

/usr/src/dpdk-18.11/x86_64-native-linuxapp-gcc

DPDKビルドの流れで記載しているため、$DPDK_BUILDをそのまま記載していますが、configure実行時にNo such file or directoryが表示されるようであれば、上記の絶対パスを以下のように記載して実行ください。

./configure --with-dpdk=/usr/src/dpdk-18.11/x86_64-native-linuxapp-gcc


多少時間は掛かりますが、最後の方は以下のような出力がでれば正常にビルドが完了しています。

make[3]: Leaving directory `/usr/src/ovs'
make[2]: Leaving directory `/usr/src/ovs'
make[1]: Leaving directory `/usr/src/ovs'

2020/08/09追記
4-1と4-2を合わせて以下の手順でインストールしてください。

cd /usr/src && \
wget https://www.openvswitch.org/releases/openvswitch-2.13.0.tar.gz && \
tar zxvf openvswitch-2.13.0.tar.gz

cd /usr/src/openvswitch-2.13.0 && \
./boot.sh && \
./configure --with-dpdk=$DPDK_BUILD CFLAGS="-Ofast -msse4.2 -mpopcnt" && \
make && make install

5.OvS+DPDKのネットワーク設定

5-1.全体構成

f:id:metonymical:20190106225241j:plain
前回記事の構成図と比較してください。
グレーアウト&斜体文字になっているのが前回設定した箇所です。
今回は(1)~(6)の黒文字になっている箇所を設定していきます。

5-2.全体の流れ ~概要~
  1. DPDKにバインド:(1)(2)
  2. Bridge作成:(3)
  3. Bond作成:(4)
  4. vHostUserClientポート作成:(5)
  5. 仮想マシンの設定:(6)
5-3.コマンド投入前準備1

コマンド投入前には以下のようにパスを通しておいてください。*3

vi /root/.bash_profile

PATH=$PATH:$HOME/bin:/usr/local/share/openvswitch/scripts:/usr/src/dpdk-18.11/usertools
export PATH

2020/08/09追記

vi /root/.bash_profile

PATH=$PATH:$HOME/bin:/usr/local/share/openvswitch/scripts:/usr/src/dpdk-stable-19.11.2/usertools
export PATH
5-4.コマンド投入前準備2

OvSを起動後、DPDK周りの詳細設定を追加しておきます。

ovs-ctl --system-id=random start
ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init=true
ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-socket-mem=1024,1024
ovs-vsctl --no-wait set Open_vSwitch . other_config:vhost-iommu-support=true
ovs-vsctl --no-wait set Open_vSwitch . other_config:pmd-cpu-mask=0x33
ovs-vsctl --no-wait get Open_vSwitch . other_config

OvSサービスの開始
DPDKの初期化
NUMA毎のメモリ設定(単位MB)
PMD-CPUマスクの設定
設定内容の確認

上記のうち、dpdk-init=true以外はチューニングパラメータなので、設定しなくてもとりあえずは動きます。

5-5.全体の流れ ~コマンドのみ~

以下のコマンドを投入していきます。
やりたいことが既に決まっている方は、構成図とコマンドの内容を見るだけでもよいと思います。

1.DPDKにバインド
(1)
dpdk-devbind.py --status
dpdk-devbind.py --bind=vfio-pci ens1f0
(2)
dpdk-devbind.py --bind=vfio-pci ens1f1
dpdk-devbind.py --status

2.Bridge作成
(3)
ovs-ctl --system-id=random stop
ovs-ctl --system-id=random start
ovs-vsctl add-br ovsbr0 -- set bridge ovsbr0 datapath_type=netdev

3.Bond作成
(4)
ovs-vsctl add-bond ovsbr0 bond0 dpdk0 dpdk1 \
 vlan_mode=trunk trunks=11,300-304 \
 bond_mode=balance-tcp lacp=active other_config:lacp-time=fast \
 -- set Interface dpdk0 type=dpdk options:dpdk-devargs=0000:08:00.0 \
 -- set Interface dpdk1 type=dpdk options:dpdk-devargs=0000:08:00.1

4.vHostUserClientポート作成
(5)
mkdir -p /usr/local/openvswitch/
touch /usr/local/openvswitch/vhuc0

ovs-vsctl add-port ovsbr0 vhuc0 \
 vlan_mode=access tag=300 \
 -- set Interface vhuc0 type=dpdkvhostuserclient \
 options:vhost-server-path=/usr/local/openvswitch/vhuc0

5.仮想マシンの設定
(6)
virsh edit Guest3

  <currentMemory unit='KiB'>1048576</currentMemory>
  <memoryBacking>
    <hugepages>
      <page size='1048576' unit='KiB' nodeset='0'/>
    </hugepages>
  </memoryBacking>
  
  <cpu mode='host-passthrough' check='none'>
    <numa>
      <cell id='0' cpus='0' memory='1048576' unit='KiB' memAccess='shared'/>
    </numa>
  </cpu>

  <interface type='vhostuser'>
    <source type='unix' path='/usr/local/openvswitch/vhuc0' mode='server'/>
    <model type='virtio'/>
  </interface>青=追記,緑=置換

2020/08/09追記
仮想マシンのメモリは8GB、Hugepageは1GBとすることで、どこがどこに対応しているのかわかるように記載しました。
また、最新の公式DocではCPU Pinningを実施していましたので、それに合わせています。
加えて「cpuset」を意図的に0-3から10-13に変えることにより、vCPUとPinningされる実際のCPUコアがどこに対応するかをわかるように記載しました。
さらに付け加えると、OvS-DPDKで使用しているCPUコアと被らないようにする意図もあります。*4

5.仮想マシンの設定
(6)
virsh edit Guest3

  <currentMemory unit='KiB'>8388608 </currentMemory>
  <memoryBacking>
    <hugepages>
      <page size='1048576' unit='KiB' nodeset='0'/>
    </hugepages>
  </memoryBacking>
  <vcpu placement='static'>4</vcpu>
  <cputune>
    <shares>8192</shares>
    <vcpupin vcpu='0' cpuset='10'/>
    <vcpupin vcpu='1' cpuset='11'/>
    <vcpupin vcpu='2' cpuset='12'/>
    <vcpupin vcpu='3' cpuset='13'/>
    <emulatorpin cpuset='10-13'/>
  </cputune>

  <cpu mode='host-model' check='partial'>
    <model fallback='allow'/>
    <numa>
      <cell id='0' cpus='0-3' memory='8388608' unit='KiB' memAccess='shared'/>
    </numa>
  </cpu>

  <interface type='vhostuser'>
    <source type='unix' path='/usr/local/openvswitch/vhuc0' mode='server'/>
    <model type='virtio'/>
  </interface>青=追記,緑=置換

6.DPDKにバインド

Kernel上で動作しているX540をDPDK上で動作されるようにバインドします。
(1)
dpdk-devbind.py --status
dpdk-devbind.py --bind=vfio-pci ens1f0
(2)
dpdk-devbind.py --bind=vfio-pci ens1f1
dpdk-devbind.py --status

[root@c765 ~]# dpdk-devbind.py --status

Network devices using kernel driver
===================================
0000:02:00.0 'I350 Gigabit Network Connection 1521' if=eno1 drv=igb unused=vfio-pci,uio_pci_generic *Active*
0000:02:00.1 'I350 Gigabit Network Connection 1521' if=eno2 drv=igb unused=vfio-pci,uio_pci_generic
0000:02:00.2 'I350 Gigabit Network Connection 1521' if=eno3 drv=igb unused=vfio-pci,uio_pci_generic
0000:02:00.3 'I350 Gigabit Network Connection 1521' if=eno4 drv=igb unused=vfio-pci,uio_pci_generic
0000:08:00.0 'Ethernet Controller 10-Gigabit X540-AT2 1528' if=ens1f0 drv=ixgbe unused=vfio-pci,uio_pci_generic
0000:08:00.1 'Ethernet Controller 10-Gigabit X540-AT2 1528' if=ens1f1 drv=ixgbe unused=vfio-pci,uio_pci_generic

[root@c765 ~]# dpdk-devbind.py --bind=vfio-pci ens1f0
[root@c765 ~]# dpdk-devbind.py --bind=vfio-pci ens1f1
[root@c765 ~]# dpdk-devbind.py --status

Network devices using DPDK-compatible driver
============================================
0000:08:00.0 'Ethernet Controller 10-Gigabit X540-AT2 1528' drv=vfio-pci unused=ixgbe,uio_pci_generic
0000:08:00.1 'Ethernet Controller 10-Gigabit X540-AT2 1528' drv=vfio-pci unused=ixgbe,uio_pci_generic

Network devices using kernel driver
===================================
0000:02:00.0 'I350 Gigabit Network Connection 1521' if=eno1 drv=igb unused=vfio-pci,uio_pci_generic *Active*
0000:02:00.1 'I350 Gigabit Network Connection 1521' if=eno2 drv=igb unused=vfio-pci,uio_pci_generic
0000:02:00.2 'I350 Gigabit Network Connection 1521' if=eno3 drv=igb unused=vfio-pci,uio_pci_generic
0000:02:00.3 'I350 Gigabit Network Connection 1521' if=eno4 drv=igb unused=vfio-pci,uio_pci_generic

バインドされると、X540がNetwork devices using DPDK-compatible driverに表示されます。

今回利用するドライバはvfio-pciですが、uio_pci_genericでも利用可能です。
利用したい場合は、以下のように変更すればOKです。

dpdk-devbind.py --bind=uio_pci_generic ens1f0

また、vfio-pciを利用するにあたり、ProLiant DL360G8を使用している方はRMRR設定が必要になる場合があります。
以下のサイトを参考にしてみてください。
DPDK and RMRR Compatibility Issues on the HP Proliant DL360e G8 | www.jimmdenton.com
https://support.hpe.com/hpsc/doc/public/display?sp4ts.oid=7271259&docId=emr_na-c04781229&docLocale=ja_JP


7.Bridge作成

念のため、ovsの再起動をした後、Bridge作成を行ってください。
(3)
ovs-ctl --system-id=random stop
ovs-ctl --system-id=random start
ovs-vsctl add-br ovsbr0 -- set bridge ovsbr0 datapath_type=netdev

[root@c765 ~]# ovs-ctl --system-id=random stop
Exiting ovs-vswitchd (20081)                               [  OK  ]
Exiting ovsdb-server (20063)                               [  OK  ]
[root@c765 ~]# ovs-ctl --system-id=random start
Starting ovsdb-server                                      [  OK  ]
Configuring Open vSwitch system IDs                        [  OK  ]
Starting ovs-vswitchd Zone 0: name:, len:0x35840, virt:0x17ffb35c0, socket_id:0, flags:0
physical segments used:
  addr: 0x140000000 iova: 0x140000000 len: 0x40000000 pagesz: 0x40000000
Zone 1: name:, len:0x80180, virt:0x17ff25800, socket_id:0, flags:0
physical segments used:
  addr: 0x140000000 iova: 0x140000000 len: 0x40000000 pagesz: 0x40000000
Zone 2: name:, len:0x980, virt:0x17fca4ac0, socket_id:0, flags:0
physical segments used:
  addr: 0x140000000 iova: 0x140000000 len: 0x40000000 pagesz: 0x40000000
Zone 3: name:, len:0x80180, virt:0x17fc14880, socket_id:0, flags:0
physical segments used:
  addr: 0x140000000 iova: 0x140000000 len: 0x40000000 pagesz: 0x40000000
Zone 4: name:, len:0x980, virt:0x17f993b40, socket_id:0, flags:0
physical segments used:
  addr: 0x140000000 iova: 0x140000000 len: 0x40000000 pagesz: 0x40000000
                                                           [  OK  ]
Enabling remote OVSDB managers                             [  OK  ]
[root@c765 ~]# ovs-vsctl add-br ovsbr0 -- set bridge ovsbr0 datapath_type=netdev

正常にBridgeが作成されると上記のような出力となります。
ちなみに、name:, len:0x80180, virt:0x17ff25800, socket_id:0, flags:0といった出力より、X540の各ポート*5に対してメモリの割り当て行っているようです。

8.Bond作成

ovsbr0上にアップリンクポート*6を追加し、Bondを組みます。また、TrunkとLACPの設定も同時に追加します。
(4)
ovs-vsctl add-bond ovsbr0 bond0 dpdk0 dpdk1 \
vlan_mode=trunk trunks=11,300-304 \
bond_mode=balance-tcp lacp=active other_config:lacp-time=fast \
-- set Interface dpdk0 type=dpdk options:dpdk-devargs=0000:08:00.0 \
-- set Interface dpdk1 type=dpdk options:dpdk-devargs=0000:08:00.1
ovs-vsctl show

[root@c765 ~]# ovs-vsctl add-bond ovsbr0 bond0 dpdk0 dpdk1 \
>  vlan_mode=trunk trunks=11,300-304 \
>  bond_mode=balance-tcp lacp=active other_config:lacp-time=fast \
>  -- set Interface dpdk0 type=dpdk options:dpdk-devargs=0000:08:00.0 \
>  -- set Interface dpdk1 type=dpdk options:dpdk-devargs=0000:08:00.1
[root@c765 ~]# ovs-vsctl show
8daaa733-f6ef-4b67-a1a9-581875f33420
    Bridge "ovsbr0"
        Port "ovsbr0"
            Interface "ovsbr0"
                type: internal
        Port "bond0"
            trunks: [11, 300, 301, 302, 303, 304]
            Interface "dpdk0"
                type: dpdk
                options: {dpdk-devargs="0000:08:00.0"}
            Interface "dpdk1"
                type: dpdk
                options: {dpdk-devargs="0000:08:00.1"}
    ovs_version: "2.10.90"
[root@c765 ~]#

上記のように追加されていればOKです。

FullTrunkにしたい場合は、以下の行を削除してください。

vlan_mode=trunk trunks=11,300-304 \

スイッチ側の仕様でLACPが組めない場合、以下のように修正してください。

 bond_mode=balance-tcp lacp=active other_config:lacp-time=fast \
 ↓
 bond_mode=balance-slb \

9.vHostUserClientポート作成

ovsbr0上にダウンリンクポート*7を追加します。
先にSocketファイルとなるvhuc0を作成し、その後ovsbr0にポートを追加します。
(5)
mkdir -p /usr/local/openvswitch/
touch /usr/local/openvswitch/vhuc0

ovs-vsctl add-port ovsbr0 vhuc0 \
vlan_mode=access tag=300 \
-- set Interface vhuc0 type=dpdkvhostuserclient \
options:vhost-server-path=/usr/local/openvswitch/vhuc0

ovs-vsctl show

[root@c765 ~]# mkdir -p /usr/local/openvswitch/
[root@c765 ~]# touch /usr/local/openvswitch/vhuc0
[root@c765 ~]# ovs-vsctl add-port ovsbr0 vhuc0 \
>  vlan_mode=access tag=300 \
>  -- set Interface vhuc0 type=dpdkvhostuserclient \
>  options:vhost-server-path=/usr/local/openvswitch/vhuc0
[root@c765 ~]# ovs-vsctl show
8daaa733-f6ef-4b67-a1a9-581875f33420
    Bridge "ovsbr0"
        Port "ovsbr0"
            Interface "ovsbr0"
                type: internal
        Port "bond0"
            trunks: [11, 300, 301, 302, 303, 304]
            Interface "dpdk1"
                type: dpdk
                options: {dpdk-devargs="0000:08:00.1"}
            Interface "dpdk0"
                type: dpdk
                options: {dpdk-devargs="0000:08:00.0"}
        Port "vhuc0"
            tag: 300
            Interface "vhuc0"
                type: dpdkvhostuserclient
                options: {vhost-server-path="/usr/local/openvswitch/vhuc0"}
    ovs_version: "2.10.90"

上記のように追加されていればOKです。
ちなみに、vlan_mode=access tag=300としましたが、tag=300のみでも自動的にaccessポートにしてくれます。
また、trunkポートにしたい場合は、Bond設定で投入した「vlan_mode=trunk trunks=11,300-304」を参考に置換してください。

10.仮想マシンの設定

virshで仮想マシンの設定を編集します。
これにより、以下3点を実施します。
仮想マシン上でHugePageを利用可能にする
仮想マシンに対してCPUのパススルー機能を有効化する
・vHostUserにてNICを追加する
(6)
virsh edit Guest3

<currentMemory unit='KiB'>1048576</currentMemory>
<memoryBacking>
<hugepages>
<page size='1048576' unit='KiB' nodeset='0'/>
</hugepages>
</memoryBacking>


<cpu mode='host-passthrough' check='none'>
<numa>
<cell id='0' cpus='0' memory='1048576' unit='KiB' memAccess='shared'/>
</numa>
</cpu>

<interface type='vhostuser'>
<source type='unix' path='/usr/local/openvswitch/vhuc0' mode='server'/>
<model type='virtio'/>
</interface>


青=追記,緑=置換

[root@c765 ~]# virsh edit Guest3

  <currentMemory unit='KiB'>1048576</currentMemory>
  <memoryBacking>
    <hugepages>
      <page size='1048576' unit='KiB' nodeset='0'/>
    </hugepages>
  </memoryBacking>
  
  <cpu mode='host-passthrough' check='none'>
    <numa>
      <cell id='0' cpus='0' memory='1048576' unit='KiB' memAccess='shared'/>
    </numa>
  </cpu>

  <interface type='vhostuser'>
    <source type='unix' path='/usr/local/openvswitch/vhuc0' mode='server'/>
    <model type='virtio'/>
  </interface>青=追記,緑=置換

xmlファイルのため、virsh editで開くと、最初はどこを編集していいか探したり、迷ったりすると思いますが、通常のviエディタと同様に編集可能なため、「cpu mode」などで検索すればすぐに見つかると思います。
あと、vhostuserですが、mode=serverとなっています。以前はmode=clientだったのですが、現在はmode=serverが推奨されています。*8

2020/08/09追記

[root@c765 ~]# virsh edit Guest3

  <currentMemory unit='KiB'>8388608 </currentMemory>
  <memoryBacking>
    <hugepages>
      <page size='1048576' unit='KiB' nodeset='0'/>
    </hugepages>
  </memoryBacking>
  <vcpu placement='static'>4</vcpu>
  <cputune>
    <shares>8192</shares>
    <vcpupin vcpu='0' cpuset='10'/>
    <vcpupin vcpu='1' cpuset='11'/>
    <vcpupin vcpu='2' cpuset='12'/>
    <vcpupin vcpu='3' cpuset='13'/>
    <emulatorpin cpuset='10-13'/>
  </cputune>

  <cpu mode='host-model' check='partial'>
    <model fallback='allow'/>
    <numa>
      <cell id='0' cpus='0-3' memory='8388608' unit='KiB' memAccess='shared'/>
    </numa>
  </cpu>

  <interface type='vhostuser'>
    <source type='unix' path='/usr/local/openvswitch/vhuc0' mode='server'/>
    <model type='virtio'/>
  </interface>青=追記,緑=置換

11.仮想マシンの起動

仮想マシンを起動して疎通確認を行ってみてください。

virsh start Guest3

起動時にPermission Denyなどのエラーが出力される場合があります。
その場合、「2-2.qemu-kvmの実行ユーザをrootへ変更」を参照し、Qemuの実行ユーザが確実にrootとなっていることを確認してください。
その上で、

systemctl restart libvirtd.service

を実行し、それでもダメなら、ホストOSを再起動してみてください。

以上です。

12.最後に

以下のサイトを参考にさせて頂きました。
Bitbucket
Ubuntu Xenial (16.04) でOpen vSwitch+DPDKな環境を作る(vHost User Clientモード編) - 仮想化通信

今回は、下図の右側(OVS with DPDK)を構築しました。
f:id:metonymical:20181224102833j:plain
また、ovsの設定方法についても踏み込んで解説を入れたので、ある程度好きな構成を組めるところまでは網羅できているのではないかと思います。なお、仮想マシン側のネットワーク設定については、過去記事を参考にして頂ければと思います。

次はLXC/LXDコンテナでvHostUserClientモードで接続できないか、もう少し調べてみたいと考えています。

*1:常時qemu-evリポジトリを参照しに行かれるのがイヤだったので設定を入れましたが、別に構わないという方は不要です。

*2:IOMMUについては、DL360G8特有の設定(RMRRの設定)があるため、途中で補足を入れます。

*3:.bash_profileに追記した場合は、ログアウト&ログインを忘れずに

*4:明示的に被らないようにするためには、pmd-cpu-maskの設定をきちんと実施する必要があります。詳細は過去記事の「7.補足その1:ReactorMaskについて」を参照ください。

*5:0000:08:00.0とか0000:08:00.1はPCIのBus Slot Function番号に該当します

*6:DPDK上で稼働しているX540のens1f0とens1f1

*7:仮想マシンが接続されるポート

*8:詳細は、 Data Plane Development Kit vHost User Client Mode with Open vSwitch*に記載されています。