OpenStack Neutronはどのようにしてネットワークを構築しているのでしょうか? 今回は、順を追ってその挙動を確かめていきます。
こんにちは。ユニアデックス株式会社でSDNエバンジェリストを担当している吉本です。
連載第1回では、Neutronが作るネットワークの動作を解説しました。今回は、そのネットワークはどう作られるのか――つまりNeutronの内部がどのように動作しているのかを見ていきます。今回は詳細に挙動を探るために「Atlasくん」と「Maiaちゃん」に一つずつ読み解いてもらいます*。具体的にはNeutron内部で実行している処理を、一つずつ、コマンドライン操作で追いかけていくことにします。題材とする環境は、本文中でも出現する、連載第1回で紹介したネットワーク構成を構築するまでの流れです。
まずは、Network Namespaceの仕組みを確認し、Network Namespace同士の接続、外部ネットワークとの接続を試します。Neutron側の実装もソースコードで確認していきましょう。
*本記事は日本仮想化技術主催のOpenStack最新情報セミナー(2014年10月開催)で実施した実機デモを基にしており、前提環境は基本的にOpenStack Icehouseリリースです。今回新たに最新のJunoリリースで変更された部分を記事後半にまとめていますので参考にしてください。
ねぇ、Maiaちゃん、この間の「Neutronとは?」って記事、面白かったね
あぁそれ、あたしも読んだ。でもNetwork Namespaceってやつがよく分からなかったなー。「独立したネットワーク」ってどういうことなの?
簡単、簡単。使ってみればすぐ分かるるよ! 僕のサーバーにログインしてネットワーク見てみるよ
root@ub1:~# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 02:00:2e:9c:00:01 brd ff:ff:ff:ff:ff:ff inet 192.168.100.24/24 brd 192.168.100.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::2eff:fe9c:1/64 scope link valid_lft forever preferred_lft forever
普通だね。loとeth0がある
うん。このままでは、普通の環境だね。早速、第一回の連載で紹介したNetwork Namespaceを作ってみよう
root@ub1:~# ip netns add qrouter root@ub1:~#
ほら、できた
何よ、何も起こらないじゃない
作っただけだからね。中に移動するよ
root@ub1:~# ip netns exec qrouter bash root@ub1:~#
だから、何も起こらないじゃない
まぁまぁ……
root@ub1:~# ip addr 1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 root@ub1:~#
あ、eth0がなくなった! どうなってるの?
eth0だけがなくなったわけじゃないよ。loはDOWNだし、IPアドレスも付いてないよね?
ホントだー。っていうか、もうできたの? 何かインストールとか、何もしてないじゃない? 中に入るにはログインとか?
インストールもログインも必要ないね
うーん、ますます分かんない。「オーバーヘッドなしに仮想マシンのような効果を」って書いてあったから、コンテナみたいなものかなって思ってたんだけど……?
コンテナって思うと、だいぶぶイメージ違うかもね。そもそも、ファイルシステムは共通だからインストールは必要ないんだよ
ファイルシステムは共通?
そう。もう一回やってみるよ
root@ub1:/tmp# cd /tmp ← /tmpに移動 root@ub1:/tmp# ls root@ub1:/tmp# touch afo ← afoというファイルを作る root@ub1:/tmp# ls -l total 0 -rw-r--r-- 1 root root 0 11月 13 17:07 afo ← 今作ったafoが見えている root@ub1:/tmp# ip netns exec qrouter bash ← qrouterの中に移動 root@ub1:/tmp# ls -l total 0 -rw-r--r-- 1 root root 0 11月 13 17:07 afo ← ファイルは見えている
ほらね。ファイルを作ってからNetwork namespaceの中に移動しても、ファイルが見えているでしょ?
おぉぉ!!
ちなみにプロセス番号も共通だよ*1
root@ub2:~# echo $$ ← 親シェルのpidは1957 1957 root@ub2:~# ip netns exec qrouter bash ← qrouterの中でbashが子プロセスとして実行される root@ub2:~# echo $$ ← 子シェルのpidは1989 1989 root@ub2:~# ps -ef | egrep '1957|1989' | grep -v grep root 1957 1956 0 15:12 pts/1 00:00:00 /bin/bash ← pidの管理は共通 root 1989 1957 0 15:14 pts/1 00:00:00 bash root 2003 1989 0 15:15 pts/1 00:00:00 ps -ef
*1 プロセス番号が共通 Linux Namespaceは、各種のリソースを分割する機能であり、対象となるリソースにはネットワークの他にプロセス番号、マウント、IPCなどがあります(http://man7.org/linux/man-pages/man7/namespaces.7.html)。
親と子は共通のプロセス番号で管理されていて、ファイルも同じものが見えているんだね。「ネットワークだけ独立」っていう意味がちょっと分かったような気がするけれど、どうやって使うのかイメージ湧かないなぁ……。
Copyright © ITmedia, Inc. All Rights Reserved.