こんにちは、GMOインターネットグループ株式会社の長谷川です。今回は KVM 単体でのライブマイグレーションに関して語っていこうと思います。
KVM でのライブマイグレーションに挑むモチベーション
古い筐体に乗っている KVM の VM を停止せず出来るだけ少ない通信断で新しい筐体に移行したいOpenStack を導入するほどではないが VM をライブマイグレーションできるようにしておきたい
検証用環境
# virsh version
Compiled against library: libvirt 4.5.0
Using library: libvirt 4.5.0
Using API: QEMU 4.5.0
Running hypervisor: QEMU 2.12.0
【STEP1】検証用 VM を作成(マイグレーション元)
QEMU のバージョンがかなり低い場合には場合によりライブマイグレーション出来ないので事前にテスト VM で検証をしましょう。VLAN 等や IF の設定はマイグレーション先と元は同じ設定に揃えてください
今回はテスト VM を元に KVM でのライブマイグレーションの手順をご紹介します。KVM による VM 作成に関しては今回の主旨から外れるので割愛します。
# virsh list --all |grep tmp
27 tmp-test-mg-hase
【STEP2】ディレクトリ作成(マイグレーション先)
ここではマイグレーション先に保存されるイメージファイルの格納先ディレクトリを作成します。
# mkdir /var/lib/kvm/tmp-test-mg-hase
マイグレーション先のディレクトリ構造はマイグレーション元のイメージファイルがある場所と同じに揃えてください。
【STEP3】qcow2 のイメージファイル事前作成(マイグレーション先)
これを行わない場合にはライブマイグレーションした VM のイメージファイル実容量が拡張限界まで膨れ上がる可能性があります。(イメージファイルの実容量が 50GB なのにマイグレーション後に 500GB の拡張限界まで肥大してしまい転送しきれない等)
決められた容量でイメージファイルを作成し上記の事故防止の対策をします。
# qemu-img create -f qcow2 /var/lib/kvm/tmp-test-mg-hase.img 50G
【STEP4】ストレージプール設定(マイグレーション先)
KVM のストレージプールを定義します。
# virsh pool-define-as --name default --type dir --target /var/lib/kvm/tmp-test-mg-hase
定義したストレージプールをスタートさせます。
# virsh pool-start default
プールがスタートされているか確認します
# virsh pool-list --all
Name State Autostart
-------------------------------------------
default active no
【STEP5】疎通確認(マイグレーション元から先)
ライブマイグレーションするにあたり、FQDN での疎通の確認が必要となります。名前解決できない場合は hosts や DNS 登録をして名前解決出来るようにしましょう。
また、マイグレーション先には SSH 出来るか事前に確認が必要です。
# ping -c 5 [FQDN]
.....
64 bytes from 172.21.20.20 (172.21.20.20): icmp_seq=1 ttl=64 time=0.171 ms
.....
--- hogehoge.com ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4091ms
rtt min/avg/max/mdev = 0.087/0.122/0.171/0.028 ms
【STEP6】ライブマイグレーション(マイグレーション元)
ここまで来るとライブマイグレーションが出来るようになります。以下コマンドでマイグレーションを行います。
# virsh migrate --live --copy-storage-all tmp-test-mg-hase qemu+ssh://[マイグレーション先のFQDN]/system --verbose --compressed --abort-on-error --persistent
virsh コマンドでのマイグレーションは様々なオプションがあるので、それぞれの環境に合わせて調整してください。今回は転送時の圧縮とエラーが起きた際には中止、転送先環境で VM を永続化させるをオプションを付けています。
基本的には
--live --copy-storage-all --persistent
上記のオプションがついて入れば最低限ライブマイグレーションを行うことが出来ます。
# virsh migrate --help
NAME
migrate - migrate domain to another host
SYNOPSIS
migrate <domain> <desturi> [--live] [--offline] [--p2p] [--direct] [--tunnelled] [--persistent] [--undefinesource] [--suspend] [--copy-storage-all] [--copy-storage-inc] [--change-protection] [--unsafe] [--verbose] [--compressed] [--auto-converge] [--rdma-pin-all] [--abort-on-error] [--postcopy] [--postcopy-after-precopy] [--migrateuri <string>] [--graphicsuri <string>] [--listen-address <string>] [--dname <string>] [--timeout <number>] [--timeout-suspend] [--timeout-postcopy] [--xml <string>] [--migrate-disks <string>] [--disks-port <number>] [--comp-methods <string>] [--comp-mt-level <number>] [--comp-mt-threads <number>] [--comp-mt-dthreads <number>] [--comp-xbzrle-cache <number>] [--auto-converge-initial <number>] [--auto-converge-increment <number>] [--persistent-xml <string>] [--tls]
DESCRIPTION
Migrate domain to another host. Add --live for live migration.
OPTIONS
[--domain] <string> domain name, id or uuid
[--desturi] <string> connection URI of the destination host as seen from the client(normal migration) or source(p2p migration)
--live live migration
--offline offline migration
--p2p peer-2-peer migration
--direct direct migration
--tunnelled tunnelled migration
--persistent persist VM on destination
--undefinesource undefine VM on source
--suspend do not restart the domain on the destination host
--copy-storage-all migration with non-shared storage with full disk copy
--copy-storage-inc migration with non-shared storage with incremental copy (same base image shared between source and destination)
--change-protection prevent any configuration changes to domain until migration ends
--unsafe force migration even if it may be unsafe
--verbose display the progress of migration
--compressed compress repeated pages during live migration
--auto-converge force convergence during live migration
--rdma-pin-all pin all memory before starting RDMA live migration
--abort-on-error abort on soft errors during migration
--postcopy enable post-copy migration; switch to it using migrate-postcopy command
--postcopy-after-precopy automatically switch to post-copy migration after one pass of pre-copy
--migrateuri <string> migration URI, usually can be omitted
--graphicsuri <string> graphics URI to be used for seamless graphics migration
--listen-address <string> listen address that destination should bind to for incoming migration
--dname <string> rename to new name during migration (if supported)
--timeout <number> run action specified by --timeout-* option (suspend by default) if live migration exceeds timeout (in seconds)
--timeout-suspend suspend the guest after timeout
--timeout-postcopy switch to post-copy after timeout
--xml <string> filename containing updated XML for the target
--migrate-disks <string> comma separated list of disks to be migrated
--disks-port <number> port to use by target server for incoming disks migration
--comp-methods <string> comma separated list of compression methods to be used
--comp-mt-level <number> compress level for multithread compression
--comp-mt-threads <number> number of compression threads for multithread compression
--comp-mt-dthreads <number> number of decompression threads for multithread compression
--comp-xbzrle-cache <number> page cache size for xbzrle compression
--auto-converge-initial <number> initial CPU throttling rate for auto-convergence
--auto-converge-increment <number> CPU throttling rate increment for auto-convergence
--persistent-xml <string> filename containing updated persistent XML for the target
--tls use TLS for migration
【STEP7】動作のチェック(マイグレーション先)
実際に VM 内に入って確認し、必要があれば筐体の再起動等をして問題がないか確認します。また、事前に対策したイメージファイルが膨張問題が起きていないか確認します。必要に応じて XML やイメージファイルのバックアップも取得しておきましょう。
# ls -lah /var/lib/kvm/tmp-test-mg-hase
# virsh list --all
# virsh console [INSTANCE_NAME]
【STEP8】マイグレーション後のお掃除(マイグレーション先)
マイグレーション後の VM 正常動作確認後には不要になるストレージプール定義を削除します。まずストレージプールを止め、それから undefine していきます。最後にストレージプール停止後も正常に VM が稼働しているかを確認します。
# virsh pool-stop default
# virsh pool-undefine default
# virsh list --all
まとめ
長い道のりお疲れ様でした。出来るだけ無停止で KVM による VM ライブマイグレーションを行う手順を説明しましたがオンプレで VM 管理しなくても ConoHa VPS であれば、上記のような手順は必要なくVM の管理はおまかせ出来るので安心です是非ご活用ください。