風邪を引いて更新を滞らせたものの、技術メモだけは溜まっていくこのごろ。
live migration でVMを停止せずにHost間を移動させる、仮想環境の醍醐味から復活するとしましょう。
Cephをマウント
live migration 機能はNovaデータの共有化が必須となります。このように全ComputeNodeでマウントしておいてください。
1 2 3 |
df -Th /mnt/ceph ファイルシス タイプ サイズ 使用 残り 使用% マウント位置 192.168.0.11:6789:/ ceph 5.4T 221G 5.2T 5% /mnt/ceph |
Novaデータ移動
一度Novaを停止し、Cephにデータ構造をコピーします。ここではVMは無い状態で行っているので1台でコピーしているだけですが、既にVMがある場合は全て停止し、各ComputeNodeからCephに移すことになります。
また、イメージキャッシュ置き場となる _base ディレクトリですが、この値は instances_path の配下に必ず入るようになっており、フルパス指定ができません。そして、_base ディレクトリを全ComputeNodeで共有すると、競合が発生するという問題があり(@ishikawa84gのツイート)、もし共有ストレージ上に置く場合は base_dir_name=_base_$my_ip や base_dir_name=_base_$host としてHostごとに分ける必要があります。
が、そもそもCeph上に保存しているGlanceイメージを、持ってきてまたCeph上にキャッシュ保存しても意味ないと考え、ここでは各Hostにある大きいパーティション(ex: /data)に保存することにしました。若干汚らしいですが、そのためにCephの _base はローカルディスクへのシンボリックリンクを置いています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# nova 停止 for init in /etc/init.d/nova-*; do $init stop; done # データディレクトリ構成コピー # - 構造だけなら1サーバでやればOK cp -Rp /var/lib/nova /mnt/ceph/ # キャッシュ置き場の実体作成 mkdir -p /data/nova/instances/_base # 権限変更 chown -R nova:nova /mnt/ceph/nova /data/nova # キャッシュ置き場をリンクに変更 # - 1サーバでやればOK rm -R /mnt/ceph/nova/instances/_base/ ln -s /data/nova/instances/_base /mnt/ceph/nova/instances/ |
Novaデータの所有者確認
共有ストレージにデータをコピーすると、あるサーバからファイルを見ると nova ユーザが所有者になっていても、違うサーバから見ると異なる所有者になっているかもしれません。なので、全ComputeNodeから確認してみます。
1 2 |
# nova:nova になっていることを確認 ls -l /mnt/ceph/nova/ |
もし、食い違っている場合は、全サーバでユーザIDを統一する必要があります。これをやらないと、novaデータの操作でエラーが発生します。
OpenStackインストール前にユーザ/グループ作成
IDを調整すると、各データディレクトリの所有者も変更する必要が出るため、できればOpenStackインストール前に重要なユーザ/グループを作成しておいた方が楽です。
1 2 3 4 5 6 7 8 9 10 |
groupadd -g 121 quantum groupadd -g 122 nova groupadd -g 123 ceilometer groupadd -g 124 libvirt groupadd -g 125 kvm useradd -u 121 -g 121 -d /var/lib/quantum -s /bin/bash quantum useradd -u 122 -g 122 -G 124 -d /var/lib/nova -s /bin/bash nova useradd -u 123 -g 123 -G 122,124 -d /var/lib/ceilometer -s /bin/bash ceilometer useradd -u 124 -g 125 -G 124 -d /var/lib/libvirt -s /bin/bash libvirt-qemu |
インストール後に調整する場合
/etc/passwd, /etc/group を見ながら、usermod, groupmod でIDを統一したら、データディレクトリの所有者も修正する必要があります。修正対象はこのような感じです。
1 2 3 4 5 6 7 8 9 10 11 12 |
chown -R nova:nova \ /etc/nova/ \ /data/nova \ /var/log/nova/ \ /var/lock/nova/ \ /tmp/keystone-signing-nova/ \ /tmp/nova-coverage_* chown -R ceilometer:ceilometer \ /etc/ceilometer/ \ /var/lib/ceilometer/ \ /var/log/ceilometer/ |
設定変更
state_path を書き換えます。instances_path と base_dir_name はデフォで記述されてなかったので、明記しておきました。/etc/nova/nova.conf
1 2 3 |
state_path=/mnt/ceph/nova instances_path = $state_path/instances base_dir_name = _base |
novaを起動します。
起動したらVMの動作確認を行なってください。
1 |
for init in /etc/init.d/nova-*; do $init start; done |
live migration用の設定
live migration機能を使うために、いくつか専用の設定を入れる必要があります。libvirtd 設定
まずは livevirtd のご機嫌をとります。/etc/libvirt/libvirtd.conf
1 2 3 |
listen_tls = 0 listen_tcp = 1 auth_tcp = "none" |
/etc/default/libvirt-bin
1 |
libvirtd_opts=" -d -l" |
再起動します。
1 |
/etc/init.d/libvirt-bin restart |
nova 設定
完全に新しい項目を追加します。[DEFAULT] なので、QUOTA の下にでも入れておきます。
/etc/nova/nova.conf
1 2 3 4 5 6 7 8 9 10 11 |
[DEFAULT] ~snip~ ################## # LIVE MIGRATION # ################## live_migration_bandwidth=0 live_migration_flag=VIR_MIGRATE_UNDEFINE_SOURCE,VIR_MIGRATE_PEER2PEER,VIR_MIGRATE_LIVE live_migration_retry_count=30 live_migration_uri=qemu+tcp://%s/system |
再起動します。
1 |
for init in /etc/init.d/nova-*; do $init restart; done |
hosts 設定
nova設定の live_migration_uri の %s のところには自動的にHostOSの hostname が入り、live migrationの通信時に使用されます。よって、hostnameで接続できる必要があるため、/etc/hosts に書いておきます。(ここまで hosts を使ってなかったのでできれば止めたいところですが!)/etc/hosts
1 2 3 |
192.168.0.11 openstack-test-01 192.168.0.12 openstack-test-02 192.168.0.13 openstack-test-03 |
live migration実行
VMの所有Hostを確認したら、移動先のHostを指定して live migration を発動します。せっかくなので、発動時に ping, ssh, Cinderボリュームアタッチ をしておきつつやると面白いですが、素晴らしいことに全て切断無しにHostを移動してくれます。
1 2 3 4 5 6 7 8 9 10 11 |
# 色々確認 nova-manage vm list nova-manage service list nova list # 実行 # usage: nova live-migration [--block-migrate] [--disk-over-commit] <server> [<host>] nova live-migration test-01 openstack-test-02 # 確認 nova-manage vm list |
これで、live migration自体は確認出来たのですが、VMのルートイメージをCephマウント上に置くと、肝心のVM動作でディスクsyncエラーとか出るようになり、結局諦めて各Hostのローカルディスクに保存することに・・・
CephはCinderボリュームとして使う分にはベンチマークとってもエラーが出ないのですが、マウントしてしまうとアレなようで。apt-get update ですらディスクエラーが出たので、もっとまともなストレージでやれればな、という感じで未導入(というか解除した)の情報ですが、まぁ楽しかったのでよしとします!