LXD 2.0でlive migrationしてみる
- Ubuntu 16.04
- LXD 2.0.0
基本的には
に書いてある通りなんで、これの補足という形になります。
まず、live migrationを行う(ホストh1にあるコンテナc1をホストh2にlive migrationする場合)のにこのようなコマンドを実行すると
hirose31@h1$ lxc move c1 h2:
「error: Error transferring container data: websocket: bad handshake」というエラーで失敗し、以下のようにlocalの場合でもremote名を添えて実行すれば成功しました。
hirose31@h1$ lxc move h1:c1 h2:
従って、予め自ホストの分もremoteの登録が必要でした。
hirose31@h1$ lxc remote add h1 192.168.33.21 hirose31@h1$ lxc remote add h2 192.168.33.22 hirose31@h2$ lxc remote add h1 192.168.33.21 hirose31@h2$ lxc remote add h2 192.168.33.22
次にハマったのは、lxc moveするとこのようなエラーで失敗した点です。
hirose31@h1$ lxc move h1:c1 h2: error: Error transferring container data: checkpoint failed: (00.093894) Error (sockets.c:129): Diag module missing (-2) (00.173958) Error (sockets.c:339): Sockets (family 16, proto 0) are not collected (00.173977) Error (cr-dump.c:1303): Dump files (pid: 8476) failed with -1 (00.178203) Error (cr-dump.c:1600): Dumping FAILED.
エラーメッセージを見て、てっきりエラーの原因を表示するためのGo(LXDのlxcコマンドはGoで書かれています)のソケット関連のdiagnostic(診断)ライブラリが足りてないのかな?と思い、いろいろ調べたのですが、結局原因はGoは関係なく、netlink_diag.koというkernel moduleがなかったためでした。思い込みはよくないですね!
Ubuntu 16.04ではnetlink_diag.koは別パッケージに収録されているのでそれをインストールします。
sudo apt-get install linux-image-extra-$(uname -r)
これでlive migrationが成功しました!
ちなみにですけど、netlink_diag.koがないとstateful stop/start やstateful snapshotsも失敗します。
他に気をつける点は、ググるとひっかかる古い情報ではprofileを変更してたりしますが、デフォルトのdefault profileだけで動きました。むしろ、下手にいじると動かない場合がありました。
LXDの感想
システムコンテナとしてDockerを使い、CentOS 6とUbuntu 14.04を動かそうとしたときはいろいろハマった(gettyがCPU食いつぶすとかudevadm settleでbootが止まるとかとか)んですが、LXDでは images.linuxcontainers.org のイメージを使った限りではすんなりCentOS 6やUbuntu 16.04が動かせていまのところはだいぶ好印象です。
LXDはOpenStackとの連携もできるようですし、より軽量なKVMの代替としてよい選択肢になるんじゃないかと思います。
追記 2017-02-10
live migration元と先とでlxdのバージョンが違うと(例えば2.0.5と2.0.8)このようなエラーで失敗する。
move: error: Bad key: volatile.idmap.base
バージョンを揃えれば成功する。apt-get install lxd でコンテナは稼働したままバージョンを上げられた。