GNS3 + Nested KVM + OpenStack with RDO
Posted on 2014/09/21(Sun) 19:50 in technical
Summary
僕の枯れた休日はGNS3とOpenStackで出来ているようだ。
そんな一面をお見せしよう。
図で言うとこんな感じだ。
幸せな連休を過ごしている人がいるであろう世界を横目に今更ながらの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から。
QEMUの項目で、Test Settingsを叩いてテストに成功することを確認します。
成功しない場合は、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でKVMを使うときに山ほどハマる点だと思います。と言ってもそんなに多くはありませんが。
- Qemu flavorを適切に選択しないと起動しない(前述の問題と合わせて確認)
- NIC modelはe1000以外だと起動しない
- Qemu optionsには-cpu hostをつけとく (vmxフラグが欲しいって話でしかないのでOpenStackで言うところのCompute Nodeだけでも良いんだけど、ゲストOSが必要とするフラグも混ざってて、いちいち判定が面倒なので設定しておく方が楽)
通報
Qemu optionsには好きなオプションを入れられる(例えば -vga std とか)ので、spiceを使いたいとか言う用途でも使えるはず。今回は使いませんが。
ここまですると、Qemu guestが使えるようになっているので、
適当に乗っけると、
ほい、出来た。
一応、起動できることは確認しておきましょう。
ここで起動するようであれば、その後はさしたる問題も無く進むと思うんだけど、ここで、起動したのにコンソール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見ながら雰囲気で作ってください)
警告
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はこんな感じで設定。
警告
virshで管理されていないとvportが接続されないのでいつまでたってもブリッジがUPしない問題が出てくる。
そこで、TAPインタフェースを使う。GNS3はTAP接続もサポートしているので、ブリッジ対象が物理インタフェースではない場合は、こちらを利用した方が良いでしょう。
$ sudo ip tuntap add dev tap0 mode tap user root $ sudo brctl addif virbr1 tap0
これをしないで、GNS3から直接ブリッジにNIO接続するとDHCPが解決できなくてしょんぼりするので、注意が必要ですぅ。
で、プロジェクトを保存。
OpenStack構築
まずは起動してコンソール開いたらこんな感じになるな?じゃあいくぞー。
通報
ここから先の手順について、間違えたりやり直したくなった場合は、 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) にアクセスしてみましょう。
おー、それっぽい。
パスワードはこれの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でログインするとこんな感じ。
うん、それっぽい。
デモ用環境もインストールしてないので、適当に触って適当にトポロジとか作ってみる。
あとはちょっと設定を入れる必要がある。
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を動かす。
仮想マシンイメージはこれを使用。
適当にイメージを登録して
手元の環境ではリソースが足りなかったので、 Admin->System Panel->Flavors でm1.picoを増やしておいて
更に、OpenStackインストール直後に用意されているSecurity GroupはDHCPを通さないって言う落とし穴があるので、自分で勝手にSecurity Group(名前はtest)を作ったりなんかして
で、ようやく起動する。
正しくDHCPでIPを貰えているようであれば、こんなログが見えるはずです。
Network Topologyの画面からNoVNCのコンソールアクセスも出来ます。
ほーら、いつもの黒い画面だよー。
日本語圏で言うとkeymap問題があるのですが、ここでは無視したいので、Floating IPを割り当てて、外側(10.0.0.0/24)からアクセスできるようにします。
Clientからsshでアクセスして、pingが通るところまで確認します。
例えば、(今回仮想マシンが動いている)compute02のInternal network側でキャプチャを取ると、こんな感じです。
で、それをwiresharkで見るとこんな感じです。
ログインしている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ライフを過ごせるようお祈り申し上げます。