GNS3 + Nested KVM + OpenStack with RDO

Posted on 2014/09/21(Sun) 19:50 in technical

Summary

僕の枯れた休日はGNS3とOpenStackで出来ているようだ。

そんな一面をお見せしよう。

図で言うとこんな感じだ。

gns3_openstack_000.png

幸せな連休を過ごしている人がいるであろう世界を横目に今更ながらのOpenStack。

夢あふれるだろう?(死んだ魚の目をしている)

あ、今回は「Wow! OpenStackが動いてやがるぜ!」位のソフトタッチィなところまで歩を進めるつもりなのでよろしく。

途中からGNS3とは無関係にPackstackだけを使う話になっちゃうので、「これGNS3でqemu(KVM)を使う」って話と分けた方が良かったなって今なら思います。

でも、もう遅いんじゃよ。

物理構成

母艦となるマシンはこんな感じ。:

$ dmesg | grep -e "Xeon" -e "Memory:"
[    0.000000] Memory: 16228288K/16588576K available (7161K kernel code, 1083K rwdata, 3312K rodata, 1364K init, 1420K bss, 360288K reserved)
[    0.069976] smpboot: CPU0: Intel(R) Xeon(R) CPU E3-1265L V2 @ 2.50GHz (fam: 06, model: 3a, stepping: 09)
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=13.10
DISTRIB_CODENAME=saucy
DISTRIB_DESCRIPTION="Ubuntu 13.10"

内部完結にしようかと思うので、外向けの配線は普段使ってる1本だけ。

メモリも割と食うので16GBで精一杯な感じ。

事前準備

KVM周りのインストール

各自、何か適当に仮想マシンを作れるレベルまで必要なものを入れてください、って感じです。

Ubuntuだとこんな感じで揃うんじゃないですかね?(適当):

$ sudo apt-get install libvirt-bin kvm qemu-system virt-manager

GNS3のインストール

$ sudo apt-add-repository ppa:gns3/ppa
$ sudo apt-get update
$ sudo apt-get install gns3

テンプレート仮想イメージの作成

今回はRDOを使うので、無難なCentOS 6.5を使おうと思います。

OSのインストール手順は省略します。(流石にいらないよね...?)

方法は何でもいいので、virt-managerでも、packerでも、その辺に転がってるvmdkを拾ってくるでも問題ありません。

sudoが使えると良いんですけど、まぁrootログインでも構いませんね。

メモリは1台2GBずつ。

Compute Nodeとなるノードは仮想マシンを置くスペースも欲しいので、ディスク容量は40GB位。もちろん、最初にアロケートなんてしなくていいですよ?

GNS3を使うため、以下の点は考慮しましょう。ただし必須ではないです。

  • クローンを作るので、MAC変更でethXがどんどん増えるのは避ける。
  • GNS3からコンソールアクセス出来た方がイメージしやすいので、シリアルコンソールを有効にする。
  • GUIがあると邪魔なので、ランレベルは3に落としておく。

OS自体のインストールは省略して、上記3点を適当に対応します。

1個目:

$ sudo echo -n /etc/udev/rules.d/70-persistent-net.rules
$ sudo echo "# " > /etc/udev/rules.d/75-persistent-net-generator.rules

2個目:

$ sudo vi /etc/init/ttyS0.conf
start on runlevel [345]
stop on runlevel [016]

respawn
instance /dev/ttyS0
exec /sbin/agetty ttyS0 115200 vt100-nav
$ sudo echo "ttyS0" >> /etc/securetty

3個目:

$ sudo vi /etc/inittab
id:3:initdefault:

これとは別に、個人的に面倒だったので、NetworkManagerは無効にしてしまいました。:

$ sudo service NetworkManager stop
$ sudo chkconfig NetworkManager off

あと、GNS3がクローンを作るので、MACアドレス変更されてもいいように/etc/sysconfig/network-scripts/ifcfg-eth0からHWADDRとUUIDを消しておくと良いでしょう。

GNS3でトポロジを作る

GNS3を起動します。:

$ sudo gns3

まず最初に作ったテンプレートイメージを登録しましょう。 Edit -> Preferencesから。

gns3_openstack_001.png

QEMUの項目で、Test Settingsを叩いてテストに成功することを確認します。

gns3_openstack_002.png

成功しない場合は、Path to qemuを見直すのが良いと思います。と言うのも、Ubuntuの場合はqemu(実体はqemu-systemへのシンボリックリンク)が無い可能性があるので、その辺上手くパスを張ります。

手元の環境だとこんな感じになってる。:

$ ls -la /usr/bin/qemu
lrwxrwxrwx 1 root root 22  8月  9  2013 /usr/bin/qemu -> /etc/alternatives/qemu
$ ls -la /etc/alternatives/qemu
lrwxrwxrwx 1 root root 25  8月  9  2013 /etc/alternatives/qemu -> /usr/bin/qemu-system-i386

で、単にqemuを叩くとi386が起動するのに、virt-managerでゲストOSを設定している時にプロセスを見るとqemu-system-x86_64で起動してたりするので、必要に応じて使い分けないといけないです。

今回はx86_64しか使わない予定なのでそれを使ってます。

さっき作ったOSのテンプレイメージを指定してゲストイメージを登録します。

gns3_openstack_003.png

警告

ここが、GNS3でKVMを使うときに山ほどハマる点だと思います。と言ってもそんなに多くはありませんが。

  • Qemu flavorを適切に選択しないと起動しない(前述の問題と合わせて確認)
  • NIC modelはe1000以外だと起動しない
  • Qemu optionsには-cpu hostをつけとく (vmxフラグが欲しいって話でしかないのでOpenStackで言うところのCompute Nodeだけでも良いんだけど、ゲストOSが必要とするフラグも混ざってて、いちいち判定が面倒なので設定しておく方が楽)

通報

Qemu optionsには好きなオプションを入れられる(例えば -vga std とか)ので、spiceを使いたいとか言う用途でも使えるはず。今回は使いませんが。

ここまですると、Qemu guestが使えるようになっているので、

gns3_openstack_004.png

適当に乗っけると、

gns3_openstack_005.png

ほい、出来た。

gns3_openstack_006.png

一応、起動できることは確認しておきましょう。

gns3_openstack_007.png

ここで起動するようであれば、その後はさしたる問題も無く進むと思うんだけど、ここで、起動したのにコンソールUIが立ち上がってこない場合はプロセスを確認しましょう。

上手くいっていない場合、こんな表示が見えるんじゃないかと思う:

$ ps axww | grep [q]emu-system
24887 pts/1    ZN+    0:00 [qemu-system-x86] <defunct>

これは完全に起動に失敗しているパターンなので、手前の設定を見直しましょう。(色気出してNIC modelをvirtioとかにすると、当然こうなります)

上手くいってる場合のプロセスは、こんな感じ(これに近づけるように設定とかパスをこねくり回して何とかする力技が使える人はそれでもいいです):

$ ps axww | grep [q]emu-system
24907 pts/1    SNl+   0:02 /usr/bin/qemu-system-x86_64 -name client -m 2048 /home/yuki/GNS3/Projects/openstack/qemu-flash-drives/client/FLASH -hdb /home/yuki/GNS3/Projects/openstack/qemu-flash-drives/client/SWAP -enable-kvm -device e1000,mac=00:ab:60:8e:08:00,netdev=gns3-0 -netdev socket,id=gns3-0,udp=127.0.0.1:10006,localaddr=127.0.0.1:40005 -device e1000,mac=00:00:ab:21:19:01 -device e1000,mac=00:00:ab:3d:08:02 -device e1000,mac=00:00:ab:d2:25:03 -device e1000,mac=00:00:ab:03:5e:04 -device e1000,mac=00:00:ab:ce:9e:05 -serial telnet:127.0.0.1:3002,server,nowait -cpu host

と言うわけで、こんな感じのトポロジを作ります。(GUI見ながら雰囲気で作ってください)

gns3_openstack_008.png

警告

VirtualBoxの場合は、GNS3におけるホスト1台ごとに仮想マシンが1個必要でした。

qemu(KVM)を使用する場合は、~/GNS3/Projects/<project-name>/qemu-flash-drives/<hostname>/FLASHに差分ディスクが作成されるため、テンプレートとなるイメージを1個登録しておけば、それをポコポコ増やしていけるのでとっても楽です。

こんな感じになります:

$ qemu-img info ~/GNS3/Projects/openstack/qemu-flash-drives/compute01/FLASH
image: /home/yuki/GNS3/Projects/openstack/qemu-flash-drives/compute01/FLASH
file format: qcow2
virtual size: 40G (42949672960 bytes)
disk size: 6.2M
cluster_size: 65536
backing file: /var/lib/libvirt/images/centos65.img

ただこのFLASHはプロジェクトフォルダ内に保存されてしまうので、テンプレートイメージを変更する場合は、このFLASHファイルも消した方が無難です。

逆に、このFLASHを消せばトポロジを維持したまま特定のマシンの差分をクリアできるので、やり直したい時役に立ちますね。

右下のKVM-NAPTはこんな感じで設定。

gns3_openstack_009.png

警告

virshで管理されていないとvportが接続されないのでいつまでたってもブリッジがUPしない問題が出てくる。

そこで、TAPインタフェースを使う。GNS3はTAP接続もサポートしているので、ブリッジ対象が物理インタフェースではない場合は、こちらを利用した方が良いでしょう。

$ sudo ip tuntap add dev tap0 mode tap user root
$ sudo brctl addif virbr1 tap0

これをしないで、GNS3から直接ブリッジにNIO接続するとDHCPが解決できなくてしょんぼりするので、注意が必要ですぅ。

で、プロジェクトを保存。

gns3_openstack_010.png

OpenStack構築

まずは起動してコンソール開いたらこんな感じになるな?じゃあいくぞー。

gns3_openstack_011.png

通報

ここから先の手順について、間違えたりやり直したくなった場合は、 rm -r ~/GNS3/Projects/<project-name>/qemu-flash-drives/* を叩けば一からやり直せます。

まず最初に、ホスト名の設定と、Network NodeとCompute Nodeが仮想ノード間通信を行うためのサブネットを設定しておきます。

(今回はVXLANを使おうと思っているので、こういうことしてます。VLANなら飛ばしても良いですが、後述のanswer.confの設定では説明していないので、何とかしましょう)

controller

$ sudo hostname controller
$ sudo sed -i -e 's/localhost/controller/g' /etc/sysconfig/network
$ sudo echo "DHCP_HOSTNAME=controller" >> /etc/sysconfig/network
$ sudo echo "DHCPLEASE=yes" >> /etc/sysconfig/network
$ sudo ifdown eth0
$ sudo ifup eth0

network

$ sudo hostname network
$ sudo sed -i -e 's/localhost/network/g' /etc/sysconfig/network
$ sudo echo "DHCP_HOSTNAME=network" >> /etc/sysconfig/network
$ sudo echo "DHCPLEASE=yes" >> /etc/sysconfig/network
$ sudo ifdown eth0
$ sudo ifup eth0
$ sudo ip add add 192.168.101.2/24 dev eth1
$ sudo ip link set up eth1

compute01

$ sudo hostname compute01
$ sudo sed -i -e 's/localhost/compute01/g' /etc/sysconfig/network
$ sudo echo "DHCP_HOSTNAME=compute01" >> /etc/sysconfig/network
$ sudo echo "DHCPLEASE=yes" >> /etc/sysconfig/network
$ sudo ifdown eth0
$ sudo ifup eth0
$ sudo ip add add 192.168.101.11/24 dev eth1
$ sudo ip link set up eth1

compute02

$ sudo hostname compute02
$ sudo sed -i -e 's/localhost/compute02/g' /etc/sysconfig/network
$ sudo echo "DHCP_HOSTNAME=compute02" >> /etc/sysconfig/network
$ sudo echo "DHCPLEASE=yes" >> /etc/sysconfig/network
$ sudo ifdown eth0
$ sudo ifup eth0
$ sudo ip add add 192.168.101.12/24 dev eth1
$ sudo ip link set up eth1

警告

eth1の設定を再起動後も維持したい場合は /etc/sysconfig/network-scripts/ifcfg-eth1 を書きましょう。

その後、packstackを使ってController Nodeから自動構築を走らせます。

controller

controllerにだけpackstackを入れる。(RDOってのはCommunityの名前でしかない)

$ sudo yum install -y https://repos.fedorapeople.org/repos/openstack/openstack-icehouse/rdo-release-icehouse-4.noarch.rpm
$ sudo yum install -y openstack-packstack
$ packstack --gen-answer-file=answer.conf

警告

RDO Quickstart に従ってもいいのだが、問答無用でバグ付最新版が降ってくるので、今回は明示的にIcehouseを使うことにしている。

URLは「Looking for an older version? See http://rdo.fedorapeople.org/ for the full listing.」と書かれた部分を見てくれ。

で、answer.confファイルを編集する。

以下変更点のみ。IPアドレス(192.168.100.0/24の範囲)はDHCP任せなので、ホント適当です。eth1ってのはさっき設定した192.168.101.0/24を使うため。

$ vi answer.conf
CONFIG_CONTROLLER_HOST=192.168.100.210
CONFIG_COMPUTE_HOSTS=192.168.100.233, 192.168.100.198
CONFIG_NETWORK_HOSTS=192.168.100.243
CONFIG_NEUTRON_OVS_TUNNEL_IF=eth1
CONFIG_PROVISION_DEMO=n

インストールを実行すると、rootログイン用のパスワードを聞かれるので躊躇なくパスワードを入れる。すると、puppetファイルが生成、転送されて勝手にインストールが始まる。座して待つ。

$ packstack --answer-file=answer.conf
Welcome to Installer setup utility
Packstack changed given value  to required value /home/yuki/.ssh/id_rsa.pub

Installing:
Clean Up                                             [ DONE ]
root@192.168.100.243's password:
root@192.168.100.198's password:
root@192.168.100.210's password:
root@192.168.100.233's password:
Setting up ssh keys                                  [ DONE ]
Discovering hosts' details                           [ DONE ]
Adding pre install manifest entries                  [ DONE ]
Preparing servers                                    [ DONE ]
Adding AMQP manifest entries                         [ DONE ]
Adding MySQL manifest entries                        [ DONE ]
Adding Keystone manifest entries                     [ DONE ]
(中略)
Applying Puppet manifests                            [ DONE ]
Finalizing                                           [ DONE ]

 **** Installation completed successfully ******


Additional information:
 * Time synchronization installation was skipped. Please note that unsynchronized time on server instances might be problem for some OpenStack components.
 * File /root/keystonerc_admin has been created on OpenStack client host 192.168.100.210. To use the command line tools you need to source the file.
 * Copy of keystonerc_admin file has been created for non-root user in /home/yuki.
 * To access the OpenStack Dashboard browse to http://192.168.100.210/dashboard .
Please, find your login credentials stored in the keystonerc_admin in your home directory.
 * To use Nagios, browse to http://192.168.100.210/nagios username: nagiosadmin, password: bdf8cf27d5be4211
 * The installation log file is available at: /var/tmp/packstack/20140921-035856-hHIyla/openstack-setup.log
 * The generated manifests are available at: /var/tmp/packstack/20140921-035856-hHIyla/manifests

こんな感じ。

Wow! OpenStackが動いてやがるぜ!

ではとりあえず書いてある通り、Horizon( ttp://<your-controller>/dashboard) にアクセスしてみましょう。

gns3_openstack_012.png

おー、それっぽい。

パスワードはこれのOS_PASSWORDってやつね。:

$ cat keystonerc_admin
export OS_USERNAME=admin
export OS_TENANT_NAME=admin
export OS_PASSWORD=86a294ac8a424c3c
export OS_AUTH_URL=http://192.168.100.210:5000/v2.0/
export PS1='[\u@\h \W(keystone_admin)]\$ '

admin/86a294ac8a424c3cでログインするとこんな感じ。

gns3_openstack_013.png

うん、それっぽい。

デモ用環境もインストールしてないので、適当に触って適当にトポロジとか作ってみる。

gns3_openstack_014.png

あとはちょっと設定を入れる必要がある。

Network Nodeのbr-exと繋がるWAN側インタフェースと接続して、Clientの動作を確認する。

network

$ sudo ovs-vsctl add-port br-ex eth2
$ sudo ip link set up eth2

client

$ sudo ip add add 10.0.0.101/24 dev eth0
$ sudo ip link set up eth0
$ ping 10.0.0.2 -c5
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=0.463 ms
64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=0.698 ms
64 bytes from 10.0.0.2: icmp_seq=3 ttl=64 time=0.544 ms
64 bytes from 10.0.0.2: icmp_seq=4 ttl=64 time=0.727 ms
64 bytes from 10.0.0.2: icmp_seq=5 ttl=64 time=0.438 ms

--- 10.0.0.2 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4007ms
rtt min/avg/max/mdev = 0.438/0.574/0.727/0.118 ms

ハイオッケーデース。

ゲストOSを動かす。

仮想マシンイメージはこれを使用。

適当にイメージを登録して

gns3_openstack_015.png

手元の環境ではリソースが足りなかったので、 Admin->System Panel->Flavors でm1.picoを増やしておいて

gns3_openstack_016.png

更に、OpenStackインストール直後に用意されているSecurity GroupはDHCPを通さないって言う落とし穴があるので、自分で勝手にSecurity Group(名前はtest)を作ったりなんかして

gns3_openstack_017.png gns3_openstack_018.png

で、ようやく起動する。

gns3_openstack_019.png

正しくDHCPでIPを貰えているようであれば、こんなログが見えるはずです。

gns3_openstack_020.png

Network Topologyの画面からNoVNCのコンソールアクセスも出来ます。

gns3_openstack_021.png

ほーら、いつもの黒い画面だよー。

gns3_openstack_022.png

日本語圏で言うとkeymap問題があるのですが、ここでは無視したいので、Floating IPを割り当てて、外側(10.0.0.0/24)からアクセスできるようにします。

gns3_openstack_023.png

Clientからsshでアクセスして、pingが通るところまで確認します。

gns3_openstack_024.png

例えば、(今回仮想マシンが動いている)compute02のInternal network側でキャプチャを取ると、こんな感じです。

gns3_openstack_025.png

で、それをwiresharkで見るとこんな感じです。

gns3_openstack_026.png

ログインしているSSH、それから仮想マシン間のpingも良く見えます。

一応置いておきましたので、見たい方はご自由に。 https://www.ainoniwa.net/data/pcap/gns3_openstack_compute02_eth1.pcap

今回はとりあえずここまで。

別の構成で試したくなった場合は、一旦GNS3を落とした後に:

$ sudo rm -r ~/GNS3/Projects/<project-name>/qemu-flash-drives/*
$ sudo gns3

からやり直すと良いでしょう。

一からやり直せるので、時間はかかりますが確実です。(今回も、この記事を書きながら何度もスクラップアンドビルドしました)

おしまい

Nested環境でOpenStackってのはたまに聞くのだけど、GNS3を使ってトポロジを視覚化した上で構築するOpenStackと言うのはあんまり見かけないので、 これを機にGNS3がもっと利用されるようになれば良いなぁ(そして、それを理由にある程度の性能を持った物理マシンを購入する理由になると良いなぁ)と思うのであった。

まとめるとこんな感じですかね。

GNS3 + qemu(KVM)を使うなら

  • e1000しか使えないので注意
  • 動作する仮想マシンの実体は、テンプレートイメージの差分ファイルとして展開される
  • テンプレートイメージを変更する場合は、プロジェクトファイルの中の qemu-flash-drives/<hostname>/FLASH を削除すること
  • 起動しない場合は、オプションとqemuパス、Qemu flavorの調整をすること
  • 物理インタフェース以外のインタフェースと接続する場合は、TAPを使う

それでは、良いGNS3ライフを過ごせるようお祈り申し上げます。