Openstack(Neutron)が中でやっていることを確認してみた

CentOS7で確認してみました。自分で試してみるとわかりやすいですね。Linux bridgeは割愛していますが、構成はNetwork NodeとCompute Nodeを1台にまとめた状態です。

  • Network Node

Kobito.AeAF4I.png

  • Compute Node

Kobito.ZUpxjC.png

それでは順を追って記載してきます。

Open vSwitchをインストール

せっかくなのでOpenStackのレポジトリから引っ張ってきます。

[root@localhost ~]# yum install https://repos.fedorapeople.org/repos/openstack/openstack-kilo/rdo-release-kilo-1.noarch.rpm

[root@localhost ~]# yum info openvswitch
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
 * base: www.ftp.ne.jp
 * extras: www.ftp.ne.jp
 * updates: www.ftp.ne.jp
利用可能なパッケージ
名前                : openvswitch
アーキテクチャー    : x86_64
バージョン          : 2.3.1
リリース            : 2.el7
容量                : 1.8 M
リポジトリー        : openstack-kilo
要約                : Open vSwitch daemon/database/utilities
URL                 : http://openvswitch.org
ライセンス          : ASL 2.0 and LGPLv2+ and SISSL
説明                : Open vSwitch provides standard network bridging functions and
                    : support for the OpenFlow protocol for remote per-flow control of
                    : traffic.

[root@localhost ~]# sudo yum install openvswitch

qrouterとqdhcpを作成する

Network NodeではルーティングやFloating IPの処理をqrouterで、dhcpの処理をqdhcpで行っています。まず初期状態を確認してみます。

[root@localhost ~]# ip netns
[root@localhost ~]# ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
    link/ether 08:00:27:3f:bf:85 brd ff:ff:ff:ff:ff:ff

早速、neutronのnetwork node用のnamespaceを作成してみます。neutron-dhcp-agentがnamespace内にdnsmasqを起動しています。ここではqdhcpは作成までにとどめておきます。

[root@localhost ~]# ip netns add qrouter1
[root@localhost ~]# ip netns add qdhcp1
[root@localhost ~]# ip netns
qdhcp1
qrouter1

qrouter1はルーティングを行うのでsysctlをいじります。

[root@localhost ~]# ip netns exec qrouter1 sysctl net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1

OpenvSwitchを作成する

次にopenvswitchとしてbr-int / br-exを作成します。先ほどインストールした際にovs-vsctlコマンドが使えるようになっていると思います。

[root@localhost ~]# ovs-vsctl add-br br-int
[root@localhost ~]# ovs-vsctl add-br br-ex
[root@localhost ~]# ovs-vsctl show
ed7907f7-314f-465d-8971-e6a8792c9dfd
    Bridge br-int
        Port br-int
            Interface br-int
                type: internal
    Bridge br-ex
        Port br-ex
            Interface br-ex
                type: internal
    ovs_version: "2.3.1"

接続用のvethを作成する

qrouterとbr-int接続用のvethを作成。vethはケーブルと両端のポートをイメージするとわかりやすいです。

[root@localhost ~]# ip link add qr-veth1 type veth peer name qr-peer1
[root@localhost ~]# ip link add ns-veth1 type veth peer name ns-peer1
[root@localhost ~]# ip link show qr-veth1
7: qr-veth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000
    link/ether 42:8a:36:9d:7d:21 brd ff:ff:ff:ff:ff:ff
[root@localhost ~]# ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
    link/ether 08:00:27:3f:bf:85 brd ff:ff:ff:ff:ff:ff
3: ovs-system: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT
    link/ether da:65:5a:6e:60:93 brd ff:ff:ff:ff:ff:ff
4: br-int: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT
    link/ether 8a:c2:c8:4f:ed:41 brd ff:ff:ff:ff:ff:ff
5: br-ex: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT
    link/ether 12:37:cc:5d:f0:4d brd ff:ff:ff:ff:ff:ff
6: qr-peer1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000
    link/ether ea:30:cb:58:07:2d brd ff:ff:ff:ff:ff:ff
7: qr-veth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000
    link/ether 42:8a:36:9d:7d:21 brd ff:ff:ff:ff:ff:ff
8: ns-peer1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000
    link/ether 56:04:a1:a5:44:9a brd ff:ff:ff:ff:ff:ff
9: ns-veth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000
    link/ether 0e:0b:df:2c:ec:52 brd ff:ff:ff:ff:ff:ff
[root@localhost ~]# ip link set br-int up
[root@localhost ~]# ip link set br-ex up

vethの片側をnamespaceへ移動する。

[root@localhost ~]# ip link set qr-veth1 netns qrouter1
[root@localhost ~]# ip link set ns-veth1 netns qdhcp1

移動が成功していることを各namespaceで確認

[root@localhost ~]# ip link show qr-veth1
Device "qr-veth1" does not exist.

[root@localhost ~]# ip netns exec qrouter1 ip link show qr-veth1
7: qr-veth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000
    link/ether 42:8a:36:9d:7d:21 brd ff:ff:ff:ff:ff:ff

ポートにアドレスを付与します

[root@localhost ~]# ip netns exec qrouter1 ip addr add 10.0.0.1/255.0.0.0 dev qr-veth1
[root@localhost ~]# ip netns exec qdhcp1 ip addr add 10.0.0.2/255.0.0.0 dev ns-veth1

リンクをUPさせます

[root@localhost ~]# ip link set qr-peer1 up
[root@localhost ~]# ip link set ns-peer1 up
[root@localhost ~]# ip netns exec qrouter1 ip link set qr-veth1 up
[root@localhost ~]# ip netns exec qdhcp1 ip link set ns-veth1 up

public側とインスタンス用のnamespaceを作成する

VM用と疑似Public用のnamespaceを作成

[root@localhost ~]# ip netns add qvm1
[root@localhost ~]# ip netns add qpublic
[root@localhost ~]# ip netns
qpublic
qvm1
qdhcp1
qrouter1

コンポーネントを接続

VMとbr-int、publicとbr-ex、qrouterとbe-ex接続用のveth作成とnamespaceへ配置

[root@localhost ~]# ip link add vm-veth1 type veth peer name vm-peer1
[root@localhost ~]# ip link add qg-veth1 type veth peer name qg-peer1
[root@localhost ~]# ip link add pub-veth1 type veth peer name pub-peer1
[root@localhost ~]# ip link set vm-veth1 netns qvm1
[root@localhost ~]# ip link set qg-veth1 netns qrouter1
[root@localhost ~]# ip link set pub-veth1 netns qpublic

各namespace内のポートにアドレスを付与

[root@localhost ~]# ip netns exec qvm1 ip addr add 10.0.0.3/255.0.0.0 dev vm-veth1
[root@localhost ~]# ip netns exec qrouter1 ip addr add 192.168.101.10/255.255.255.0 dev qg-veth1
[root@localhost ~]# ip netns exec qpublic ip addr add 192.168.101.200/255.255.255.0 dev pub-veth1
[root@localhost ~]#

openvswitchにポートを追加。

[root@localhost ~]# ovs-vsctl add-port br-int vm-peer1
[root@localhost ~]# ovs-vsctl add-port br-ex qg-peer1
[root@localhost ~]# ovs-vsctl add-port br-ex pub-peer1
[root@localhost ~]# ip link set vm-peer1 up
[root@localhost ~]# ip link set qg-peer1 up
[root@localhost ~]# ip link set pub-peer1 up
[root@localhost ~]# ip netns exec qvm1 ip link set vm-veth1 up
[root@localhost ~]# ip netns exec qpublic ip link set pub-veth1 up
[root@localhost ~]# ip netns exec qrouter1 ip link set qg-veth1 up

qrouter1のインタフェースとRouting確認

[root@localhost ~]# ip netns exec qrouter1 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    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
7: qr-veth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 42:8a:36:9d:7d:21 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.1/8 scope global qr-veth1
       valid_lft forever preferred_lft forever
    inet6 fe80::408a:36ff:fe9d:7d21/64 scope link
       valid_lft forever preferred_lft forever
13: qg-veth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 5e:6e:bb:98:eb:d5 brd ff:ff:ff:ff:ff:ff
    inet 192.168.101.10/24 scope global qg-veth1
       valid_lft forever preferred_lft forever
    inet6 fe80::5c6e:bbff:fe98:ebd5/64 scope link
       valid_lft forever preferred_lft forever

[root@localhost ~]# ip netns exec qrouter1 ip r
10.0.0.0/8 dev qr-veth1  proto kernel  scope link  src 10.0.0.1
192.168.101.0/24 dev qg-veth1  proto kernel  scope link  src 192.168.101.10

Floating IPに関する設定

Floating IP用のアドレスをaliasとして付与

[root@localhost ~]# ip netns exec qrouter1 ip addr add 192.168.101.11 dev qg-veth1
[root@localhost ~]# ip netns exec qrouter1 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    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
7: qr-veth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 42:8a:36:9d:7d:21 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.1/8 scope global qr-veth1
       valid_lft forever preferred_lft forever
    inet6 fe80::408a:36ff:fe9d:7d21/64 scope link
       valid_lft forever preferred_lft forever
13: qg-veth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 5e:6e:bb:98:eb:d5 brd ff:ff:ff:ff:ff:ff
    inet 192.168.101.10/24 scope global qg-veth1
       valid_lft forever preferred_lft forever
    inet 192.168.101.11/32 scope global qg-veth1
       valid_lft forever preferred_lft forever
    inet6 fe80::5c6e:bbff:fe98:ebd5/64 scope link
       valid_lft forever preferred_lft foreve

次にqrouter1でpublicから来たパケットをDNATするルールをiptablesに記載します。

[root@localhost ~]# ip netns exec qrouter1 iptables -t nat -A PREROUTING -d 192.168.101.11 -j DNAT --to 10.0.0.3
[root@localhost ~]# ip netns exec qrouter1 iptables -t nat -nL
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DNAT       all  --  0.0.0.0/0            192.168.101.11       to:10.0.0.3

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination

さらにSNATのルールを記載します。1対1NATです。

[root@localhost ~]# ip netns exec qrouter1 iptables -t nat -A POSTROUTING -s 10.0.0.3 -j SNAT --to 192.168.101.11
[root@localhost ~]# ip netns exec qrouter1 iptables -t nat -nL
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DNAT       all  --  0.0.0.0/0            192.168.101.11       to:10.0.0.3

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
SNAT       all  --  10.0.0.3             0.0.0.0/0            to:192.168.101.11

インスタンス周りの設定をして疎通確認

[root@localhost ~]# ip netns exec qvm1 ip route add default via 10.0.0.1 dev vm-veth1
[root@localhost ~]# ip netns exec qvm1 ip route
default via 10.0.0.1 dev vm-veth1
10.0.0.0/8 dev vm-veth1  proto kernel  scope link  src 10.0.0.3

Floating 経由で通信できることを確認します

[root@localhost ~]# ip netns exec qpublic ping 192.168.101.11
PING 192.168.101.11 (192.168.101.11) 56(84) bytes of data.
64 bytes from 192.168.101.11: icmp_seq=1 ttl=64 time=0.246 ms
64 bytes from 192.168.101.11: icmp_seq=2 ttl=64 time=0.070 ms
64 bytes from 192.168.101.11: icmp_seq=3 ttl=64 time=0.079 ms

テナントを追加で作ってみる

namespaceが分かれているのでL3レベルで独立性を保つ事が可能です。そのためneutronがテナントを作るようにqrouter/qdhcpを新たに作成します。openvswitchではtagを使って分離します。

qrouter2/qdhcp2を新たに作成するなどは同じです。アドレスも全く同じで問題ありません。以下の通りtagをつけること点がポイントです。

[root@localhost ~]# ip netns exec qrouter2 ip addr add 10.0.0.1/255.0.0.0 dev qr-veth2
[root@localhost ~]# ip netns exec qdhcp2 ip addr add 10.0.0.2/255.0.0.0 dev ns-veth2
[root@localhost ~]# ovs-vsctl add-port br-int qr-peer2 tag=2
[root@localhost ~]# ovs-vsctl add-port br-int ns-peer2 tag=2
[root@localhost ~]# ovs-vsctl add-port br-int vm-peer2 tag=2

疎通確認

内部的には同じアドレス(10.0.0.3)のインスタンス2台にpublicから疎通が取れています。

[root@localhost ~]# ip netns exec qpublic ping 192.168.101.12
PING 192.168.101.12 (192.168.101.12) 56(84) bytes of data.
64 bytes from 192.168.101.12: icmp_seq=1 ttl=63 time=0.411 ms
64 bytes from 192.168.101.12: icmp_seq=2 ttl=63 time=0.082 ms
^C
--- 192.168.101.12 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.082/0.246/0.411/0.165 ms

[root@localhost ~]# ip netns exec qpublic ping 192.168.101.11
PING 192.168.101.11 (192.168.101.11) 56(84) bytes of data.
64 bytes from 192.168.101.11: icmp_seq=1 ttl=64 time=0.163 ms
64 bytes from 192.168.101.11: icmp_seq=2 ttl=64 time=0.162 ms
64 bytes from 192.168.101.11: icmp_seq=3 ttl=64 time=0.059 ms
^C
--- 192.168.101.11 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 0.059/0.128/0.163/0.048 ms

次は実際にneutronをインストールして確認してみる予定です。

参考;
君にもできる! にゅーとろん君になってみよー!! 「Neutronになって理解するOpenStack Net - OpenStack最…


シェアして頂けると嬉しいです。
参考になったという方がいれば是非お願いしますm(_ _ )m
モチベーション維持の観点で非常に励みになります。

このエントリーをはてなブックマークに追加