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インターネットグループ株式会社 新卒入社<br> クラウド基盤エンジニア<br> お名前.com KVM, ConoHa VPS等の開発運用に従事

採用情報

関連記事

KEYWORD

TAG

もっとタグを見る

採用情報

SNS FOLLOW

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