このエントリの情報はおそらく古いです
先月、LXD 0.3 のリリースでライブマイグレーションサポート、というアナウンスがあったので早速試しましたが失敗しました (> lxd を使ったライブマイグレーション(未完) - TenForwardの日記)。
これはバグがあったようで、その後の LXD と LXC の更新で修正され、0.6 でとりあえず動くようになったようなので試してみました。とりあえずネットワークの設定がされないシンプルなコンテナで試しました。
LXD はまだまだリリースのたびにかなり機能が変わっていますし、LXC の C/R 関連のパッチもガンガン投稿されている状況ですし、CRIU もバージョンアップのたびに新機能が追加されていますので、以下の例がいつまで有効かわかりません。(明日には動かないかも?)
準備
まずは準備です。OS は Ubuntu Trusty をインストールした環境を 2 つ準備しています。
LXC/LXD のリポジトリは以下を登録します。
- LXD
- lxd-stable(最新のstableリリース)
- LXC
- lxc-git-stable-1.1(1.1系列の最新リリース)
以下の操作は両方のホストで行います。
$ sudo add-apt-repository ppa:ubuntu-lxc/lxd-stable $ sudo add-apt-repository ppa:ubuntu-lxc/lxc-git-stable-1.1 $ sudo apt-get update
LXDをインストールします。その後、依存関係で入る lxcfs を削除します。これは、現時点では lxcfs が行う bind mount を CRIU でサポートしていないためのようです。
$ sudo apt-get install lxd $ dpkg-query --show lxd lxd 0.6-0ubuntu1~ubuntu14.04.1~ppa1 $ dpkg-query --show lxc lxc 1.1.2+stable~20150415-0023-0ubuntu1~trusty $ sudo apt-get remove lxcfs
LXD 0.6, LXC 1.1.2 がインストールされています。
ここで lxd インストール時に管理者アカウント (sudo グループに所属だっけ?) は lxd グループに属するように設定されますので、一度ログアウトするなどして lxd グループに属した状態にします。
$ id uid=1000(ubuntu) gid=1000(ubuntu) groups=1000(ubuntu),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),110(lpadmin),111(sambashare),113(lxd)
各 LXD ホストのパスワードを設定しましょう。
$ lxc config set password hogehoge
LXD の設定
以下は lxc コマンドを実行するところで実行します。ここでは lxd01 で実行しています。
- イメージを準備します。linuxcontainers.org の Ubuntu イメージを使います。イメージのエイリアスとして "ubuntu" という名前を登録します。
$ lxd-images import lxc ubuntu trusty amd64 --alias ubuntu
Downloading the GPG key for https://images.linuxcontainers.org
Downloading the image list for https://images.linuxcontainers.org
Validating the GPG signature of /tmp/tmp5y_tj_h4/index.json.asc
Downloading the image: https://images.linuxcontainers.org/images/ubuntu/trusty/amd64/default/20150415_03:49/lxd.tar.xz
Validating the GPG signature of /tmp/tmp5y_tj_h4/ubuntu-trusty-amd64-default-20150415_03:49.tar.xz.asc
Image imported as: 45cd14361df508652160a28f76d96360a68e6c354e39879671b8b600a788562c
Setup alias: ubuntu - リモートホストの登録。現時点では自ホストも登録しておく必要があります。
$ lxc remote add lxd01 lxd01:8443
$ lxc remote add lxd02 lxd02:8443
$ lxc remote list
local
lxd01 https://lxd01:8443
lxd02 https://lxd02:8443 - デフォルトで登録されているprofileの"default"を適当な名前のプロファイルにコピーします。ここでは"criu"にしました。
$ lxc config profile copy default criu
- "criu"を編集します。
$ lxc config profile edit criu
- 内容はこんな風にします。
name: criu
config:
raw.lxc: |
lxc.tty = 0
lxc.console = none
lxc.cgroup.devices.deny = c 5:1 rwm
security.privileged: "true"
devices: {} - "raw.lxc"で設定されているものは、現時点でLXCでCRIUを使う場合に必須の設定です。
- 現時点で、非特権コンテナの C/R はできませんので "security.privileged" を "true" にします。これで特権コンテナで起動します。
- 内容はこんな風にします。
- マイグレーション元と先に同じ profile がなければマイグレーションできませんので lxd02 側にコピーします。
$ lxc config profile copy lxd01:criu lxd02:criu
$ lxc config profile list
default
criu
$ lxc config profile list lxd02:
default
criu
マイグレーション
- コンテナを作成します。イメージは "ubuntu" を使い、"ct01" という名前です。
$ lxc init ubuntu ct01
- 作成したコンテナに、先ほど作成した profile である "criu" を適用します。
$ lxc config profile apply ct01 criu
Profile criu applied to ct01 - コンテナを起動します。このコンテナは veth の設定もされない独立したネットワークにいるコンテナです。
$ lxc start ct01
$ lxc list
+------+---------+------+------+
| NAME | STATE | IPV4 | IPV6 |
+------+---------+------+------+
| ct01 | RUNNING | | |
+------+---------+------+------+ - マイグレーションします。
$ lxc move lxd01:ct01 lxd02:ct01
$ lxc list
+------+-------+------+------+
| NAME | STATE | IPV4 | IPV6 |
+------+-------+------+------+
+------+-------+------+------+
$ lxc list lxd02:
+------+---------+------+------+
| NAME | STATE | IPV4 | IPV6 |
+------+---------+------+------+
| ct01 | RUNNING | | |
+------+---------+------+------+
とりあえず lxd01 で動いていたコンテナが lxd02 に移動しました。
これだけではコンテナ上で動いているデーモン等がちゃんと移動したのかもわかりませんし、ダウンタイムも不明ですが、とりあえず移動したということで。
続編は こちら