Openstack(Neutron)が中でやっていることを確認してみた
CentOS7で確認してみました。自分で試してみるとわかりやすいですね。Linux bridgeは割愛していますが、構成はNetwork NodeとCompute Nodeを1台にまとめた状態です。
- Network Node
- Compute Node
それでは順を追って記載してきます。
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
モチベーション維持の観点で非常に励みになります。
オープンソース・クラウド基盤 OpenStack入門 構築・利用方法から内部構造の理解まで (アスキー書籍)
- 作者: 中井悦司,中島倫明
- 出版社/メーカー: KADOKAWA / アスキー・メディアワークス
- 発売日: 2014/06/03
- メディア: Kindle版
- この商品を含むブログ (2件) を見る
OpenStackクラウドインテグレーション オープンソースクラウドによるサービス構築入門
- 作者: 日本OpenStackユーザ会
- 出版社/メーカー: 翔泳社
- 発売日: 2015/01/28
- メディア: Kindle版
- この商品を含むブログを見る