Ubunt13.10へクラウドのOpenStack (havana)をNIC2枚のサーバーへインストール
クラウドというとまずAmazonWebService(AWS)をまず思い浮かべます。私も現在利用しています。
これを自前のサーバーで構築するためのオープンソースのクラウドがいくつかありますが、OpenStackはそのうちの1つです。
現在は2013/10/17リリースのHavana(約400の新機能)が最新となっています。
OpenStackは6ヶ月ごとのリリースサイクルをとっているので次は2014/04の予定
OpenStackのWeb管理画面はAWSに似てるのでAWS利用者には分かり易く取っ付きやすくなってます。
しかし、私がテストした環境では複数のVMを起動し外部との通信もでき、ロードバランサでhttpを振り分けるといったような動作をできるところまで構築するには至りませんでした。
主にネットワーク周りの自動構築が不完全なようで、まだまだ発展途上で敷居が高いように感じます。
ロードバランサを使わないで良い環境なら、高機能なネットワーク機能のneutronを使わないで、単純なネットワーク機能のnova-networkを使う方法なら複数のVMを起動し外部との通信も問題なく動作しました。この記事ではこの方法を解説します。
テスト環境は1台のサーバーへオールインワンで構築します。NICは2枚のっています。管理サーバーとなるためここではマネージメントサーバーと呼びます。
ManagedServer(マネージドサーバー)マシンのHWスペック
| HP ProLiant DL380 G5 (発売時期:2010/09) | |
| CPU | XEON L5420 2.5GHz * 2 (2P/8C) |
| MEMORY | 16GB (2GB*8) |
| HDD | 146GB(SAS72*2 RAID0) |
| NIC | gigabit*2 (NetXtreme II BCM5708) |
| 消費電力 | 280w/待機時22w (ワットチェッカーにて計測) |
OSインストール:Ubuntu13.10
OSのインストールは普通のインストール手順とほぼ同じですが、openstackが利用するLVMのstack-volumesを事前に切り分けておくのがポイントです。
- ホスト名 : managed
- ユーザ名 : stack
- DISKパーティション : 手動で先頭から次のように割り当てる
- 256MB : ext2 /boot
- 38GB : lvm
- VG : managed-vg
- LG : root 30GB ext4 /
- LG : swap 8GB swap
- VG : managed-vg
- 108GB(残り全部) : lvm
- VG : stack-volumes
- ソフトウェア選択 : OpenSSH Serverのみ選択
ネットワーク設定
eth0をローカルIPでの内部通信や管理用とし、eth1をグローバルIPでの外部接続用として構築します。
ただし実際に割り当てれるグローバルIPを持っていないため、内部LANのIP帯(192.168.0.0)をグローバルIPと仮定してテスト環境を構築します。そのため管理用のローカルIPは内部LANのIP帯とは別のIP帯(172.24.4.0)を利用することにします。
- eth0 : 172.24.4.10
- eth1 : 192.168.0.219
※このネットワーク設定はroot権限で行います
インターフェイス設定
cat << _EOF_ > /etc/network/interfaces
auto lo
iface lo inet loopback
# Internal Network
auto eth0
iface eth0 inet static
address 172.24.4.10
netmask 255.255.255.0
# External Network
auto eth1
iface eth1 inet static
address 192.168.0.219
netmask 255.255.255.0
network 192.168.0.0
broadcast 192.168.0.255
gateway 192.168.0.1
dns-nameservers 8.8.8.8
_EOF_
ホスト名設定
cat << _EOF_ > /etc/hostname
managed
_EOF_
hosts設定
cat << _EOF_ > /etc/hosts
127.0.0.1 localhost
172.24.4.10 managed.winkey.jp managed
_EOF_
ipv6無効+フォワード有効
cat << SYSCTL | tee -a /etc/sysctl.conf > /dev/null
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv4.ip_forward=1
SYSCTL
sysctl -p
再起動
ネットワーク設定を安全に設定反映するために再起動reboot
パッケージを最新にアップグレード
apt-get update
apt-get upgrade -qqy; apt-get dist-upgrade -qqy
sudoとgitのパッケージをインストール
OpenStackのインストールで使うdevstackにて利用するのでsudoとgitのパッケージを事前にインストール。
apt-get install sudo git -y
stackユーザー権限でsudoをパスワード無しで利用できるように設定します。echo "stack ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
devstackにてOpenStack(havana)をインストール
※ここからstackユーザー権限にて行います
git clone https://github.com/openstack-dev/devstack.git
cd devstack
git branch -a
git checkout stable/havana
localrc作成
devstackでインストールするOpenStackの構築内容の設定をlocalrcに記述します。
cat << _EOF_ > localrc
ADMIN_PASSWORD=admpass
MYSQL_PASSWORD=mysqlpass
RABBIT_PASSWORD=rabitpass
SERVICE_PASSWORD=\$ADMIN_PASSWORD
HOST_IP=172.24.4.10
FLOATING_RANGE=192.168.0.90/28
FIXED_RANGE=10.0.0.0/24
FIXED_NETWORK_SIZE=256
FLAT_INTERFACE=eth1
LOGFILE=\$DEST/logs/stack.sh.log
LOGDAYS=2
SCREEN_LOGDIR=\$DEST/logs/screen
SWIFT_HASH=66a3d6b56c1f479c8b4e70ab5c2000f5
SWIFT_REPLICAS=1
SWIFT_DATA_DIR=\$DEST/data
_EOF_
インストール&構築実行
./stack.sh
※ADMIN TOKENを入力してくれと言われたらそのままEnterでランダム作成されます。
devstackスクリプトの簡易説明
| stack.sh | openstack構築&初回実行 (再起動等で実行は終了) |
| rejoin-stack.sh | 構築済みの環境を実行 |
| unstack.sh | 動作中のOpenStackを停止 |
| openrc | CUI用の環境変数の設定 |
- 参考 : OpenStack勉強会スライドの16P
キーを作成
. openrc admin demo
cd ~
nova keypair-add mykey > mykey
chmod 600 mykey
仮想マシン(VM)用のUbuntu12.04のイメージを登録
VM起動用のイメージをダウンロード
Ubuntuはクラウド用のイメージファイルを用意してくれているので自分でOSインストールなどしなくてよく、このイメージでいきなり最小構成+SSHの状態で利用できます。
Ubuntu 12.04 LTSのCloudImageから64-bitでQCOW2のものをダウンロードします。
wget http://cloud-images.ubuntu.com/releases/precise/release/ubuntu-12.04-server-cloudimg-amd64-disk1.img
イメージをglanceで登録
glance add name="Ubuntu 12.04 LTS" is_public=true container_format=ovf disk_format=qcow2 < ubuntu-12.04-server-cloudimg-amd64-disk1.img
apache2でエラーがでてWeb管理画面が起動しないのを修正
つぎのようなエラーがログにでていてWeb管理画面(horizon)へアクセスできない。
[authz_core:error] [pid 8458:tid 140278916699904] [client 172.24.4.5:58365] AH01630: client denied by server configuration: /opt/stack/horizon/openstack_dashboard/wsgi/django.wsgi
/etc/apache2/sites-enabled/horizon.conf のallow from allの下に「Require all granted」を追加することで回避できます。
<Directory /opt/stack/horizon/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
Require all granted
</Directory>
apache2を再起動
/etc/init.d/apache2 restart
Web管理画面(horizon)
ブラウザにてHOST_IPに設定した管理用のIPアドレスへ http://172.24.4.10/ でアクセスするとログイン画面が出てきます。ユーザ名はadminでパスワードはADMIN_PASSWORDで設定したadmpassでログインできます。

フレーバー整理
管理>フレーバーから使わないであろうnanoとmicroとlargeとxlargeを削除します。
削除して残ったm1.tinyかm1.smallを主に利用することになります。
システム情報
管理>システム情報の動いているサービスはこんなかんじです。
コンピュートサービスはこんなかんじです。
インスタンスの起動
ボリュームを作成
なぜか直接イメージからの起動ではErrorが出るので一旦イメージからボリュームを作成しておきます。
プロジェクト>demo>ボリューム>ボリュームの作成
ボリューム名はvol_adminで容量10GBでイメージUbuntu 12.04 LTSからボリュームを作成します。
インスタンスの起動
プロジェクト>demo>インスタンス>インスタンスの起動
さきほど作ったボリュームからフレーバーm1.tinyにてインスタンスを起動します。インスタンス名はadminとしておきます。
フローティングIPの割り当て
FloatingIPの割り当て
外部通信用となる固定IP(グローバルIP)にあたるフローティングIPをインスタンスadminへ割り当てます。
セキュリティのルール
プロジェクト>アクセスとセキュリティ>defaut>ルールの編集>ルール追加
すべてのICMPとSSH接続を許可します。
VMと疎通確認
PingとSSHの接続テスト
マネージドサーバー自身(172.24.4.10)へSSHで接続し、そこからVMのインスタンスへpingやsshが接続できるかテストします。

経路やIPの割り振りの状態
この状態でのマネージドサーバーでのrouteやip addrの結果は次のようになってます。

ここまでで無事にOpenStackのインストールは完了です。
インスタンスというクラウド上の仮想マシン(VM)でUbuntu12.04LTSも起動しネットワークも使えるようになっています。
あとは普通にsshでリモート接続して普段通り利用できます。
せっかく構築した環境ですから、このVM上のUbuntu12.04LTSでの簡単なベンチマークをとってみたいと思います。
VMのベンチマーク
VMへsshにてログインしてroot権限にて計測
hdparm
root@admin:~# hdparm /dev/vda1
/dev/vda1:
HDIO_DRIVE_CMD(identify) failed: Inappropriate ioctl for device
readonly = 0 (off)
readahead = 256 (on)
geometry = 20803/16/63, sectors = 20969472, start = 2048
root@admin:~# hdparm -Tt /dev/vda1
/dev/vda1:
Timing cached reads: 10836 MB in 2.00 seconds = 5422.80 MB/sec
Timing buffered disk reads: 582 MB in 3.01 seconds = 193.66 MB/sec
fio
fioにて最新をチェックしダウンロード。記事作成時現在で2013/11/19に2.1.4がリリースされていました。
fio 2.1.4 インストール
apt-get install gcc make libaio-dev -y
mkdir -p /usr/local/src/fio
cd /usr/local/src/fio
wget http://brick.kernel.dk/snaps/fio-2.1.4.tar.bz2
tar jxvf fio-2.1.4.tar.bz2
cd fio-2.1.4
./configure
make
make install
計測
cd /tmp
wget http://www.winkey.jp/downloads/visit.php/fio-crystaldiskmark -O crystaldiskmark.fio
fio crystaldiskmark.fio
結果からread:行を抜粋。
Seq-Read: (groupid=0, jobs=1): err= 0: pid=8458: Mon Dec 9 17:16:47 2013
read : io=1024.0MB, bw=499322KB/s, iops=487, runt= 2100msec
Seq-Write: (groupid=1, jobs=1): err= 0: pid=8459: Mon Dec 9 17:16:47 2013
write: io=1024.0MB, bw=192824KB/s, iops=188, runt= 5438msec
Rand-Read-512K: (groupid=2, jobs=1): err= 0: pid=8460: Mon Dec 9 17:16:47 2013
read : io=1024.0MB, bw=416598KB/s, iops=813, runt= 2517msec
Rand-Write-512K: (groupid=3, jobs=1): err= 0: pid=8461: Mon Dec 9 17:16:47 2013
write: io=1024.0MB, bw=176945KB/s, iops=345, runt= 5926msec
Rand-Read-4K: (groupid=4, jobs=1): err= 0: pid=8462: Mon Dec 9 17:16:47 2013
read : io=795024KB, bw=13250KB/s, iops=3312, runt= 60000msec
Rand-Write-4K: (groupid=5, jobs=1): err= 0: pid=8473: Mon Dec 9 17:16:47 2013
write: io=716572KB, bw=11943KB/s, iops=2985, runt= 60001msec
Rand-Read-4K-QD32: (groupid=6, jobs=1): err= 0: pid=8484: Mon Dec 9 17:16:47 2013
read : io=1024.0MB, bw=45853KB/s, iops=11463, runt= 22868msec
Rand-Write-4K-QD32: (groupid=7, jobs=1): err= 0: pid=8495: Mon Dec 9 17:16:47 2013
write: io=1024.0MB, bw=43324KB/s, iops=10831, runt= 24203msec
以前の書いたLinuxのI/OベンチマークでCrystalDiskMarkと同等の計測をfioで実現のように手動でCrystalDiskMark3.0のような形に整理してみます。
-----------------------------------------------------------------------
fake CrystalDiskMark 3.0 fio (C) 2013 hiroron
WinKey : http://www.winkey.jp/
-----------------------------------------------------------------------
* MB/s = 1,048,576 byte/s
Sequential Read : 487.62 MB/s
Sequential Write : 188.3 MB/s
Random Read 512KB : 406.83 MB/s
Random Write 512KB : 172.8 MB/s
Random Read 4KB (QD=1) : 12.94 MB/s [ 3312 IOPS]
Random Write 4KB (QD=1) : 11.66 MB/s [ 2985 IOPS]
Random Read 4KB (QD=32) : 44.78 MB/s [ 11463 IOPS]
Random Write 4KB (QD=32) : 42.31 MB/s [ 10831 IOPS]
Test : 1024 MB [/dev/vda1 type ext4]
Date : 2013/12/10 2:16:47
OS : Ubuntu 12.04 LTS [precise] (3.2.0-57-virtual)
まずまずの性能は出てるようです。
abベンチ
計測環境
Windows7上のVirtualBoxの仮想マシン(CPU:1C 2.80GHz/MEM:1GB)へUbuntu13.10を入れてそこからabにて計測しました。Windows7もマネージドサーバーも同じHUB上に有線で繋がってる状態での計測です。
VMをm1.tinyからm1.smallへリサイズして割り当てメモリを2GBに増やしました。そしてApache2.2+MySQL5.5+php5.3+fcgid+APC3.1+ProFTP1.3+Postfix2.9なインターネットサイト環境を構築し計測
Geeklog2.1RC1をインストールし画像付きの記事を5件ほど投稿した状態のサイトを構築し計測(動的なphpコンテンツ)
ab -n500 -c15 http://admin.domain.com/
初回はキャッシュがきいてなくて若干遅い上にFailedも出ている。2回めの計測結果からFailedがなくなり、3回目移行もほぼ同様の結果になります。
1回目Document Length: 26025 bytes
Time taken for tests: 41.409 seconds
Failed requests: 48
Requests per second: 12.07 [#/sec] (mean)
2回目
Document Length: 26025 bytes
Time taken for tests: 37.449 seconds
Failed requests: 0
Requests per second: 13.35 [#/sec] (mean)
3回目
Document Length: 26025 bytes
Time taken for tests: 37.412 seconds
Failed requests: 0
Requests per second: 13.36 [#/sec] (mean)
4回目
Document Length: 26025 bytes
Time taken for tests: 37.443 seconds
Failed requests: 0
Requests per second: 13.35 [#/sec] (mean)
上記はインスタンスをリサイズした後にメモリが512MBから2GBになったのでチューニングしてなかったApacheやMySQLをチューニングしてから再度計測
Failedは出なくなりましたがスピードは同じようなものです。
Document Length: 26025 bytes
Time taken for tests: 41.442 seconds
Failed requests: 0
Requests per second: 12.07 [#/sec] (mean)
Document Length: 26025 bytes
Time taken for tests: 37.405 seconds
Failed requests: 0
Requests per second: 13.37 [#/sec] (mean)
次に、どれくらいでFailedが出るかやってみます。
秒間の処理数が12~13のようですから同時接続25をまず試してみます。
ab -n500 -c25 http://admin.domain.com/
Document Length: 26025 bytes
Concurrency Level: 25
Time taken for tests: 38.608 seconds
Complete requests: 500
Failed requests: 0
Write errors: 0
Requests per second: 12.95 [#/sec] (mean)
25はクリアしました。次は同時接続35にチャレンジです。
ab -n500 -c35 http://admin.domain.com/
Document Length: 26025 bytes
Concurrency Level: 35
Time taken for tests: 38.483 seconds
Complete requests: 500
Failed requests: 27
(Connect: 0, Receive: 0, Length: 27, Exceptions: 0)
Write errors: 0
Requests per second: 12.99 [#/sec] (mean)
ここでFailedが出ました。phpが動いてるのでオールインワンの単一サーバーだとこんなものですね。
(おまけ)Chrome開発ツールのNetwork
Geeklog2.1で構築したサイトの表示時のリソースへのネットワークに関する情報をGoogleChromeの開発ツールでみるとこんな感じです。







