KVM でライブマイグレーションに挑戦する

こんにちは、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 の管理はおまかせ出来るので安心です是非ご活用ください。

ブログの著者欄

長谷川 泰斗

GMOインターネットグループ株式会社

2020年 GMOインターネットグループ株式会社 新卒入社
クラウド基盤エンジニア
お名前.com KVM, ConoHa VPS等の開発運用に従事

採用情報

関連記事

KEYWORD

採用情報

SNS FOLLOW

GMOインターネットグループのSNSをフォローして最新情報をチェック