読者です 読者をやめる 読者になる 読者になる

TenForward

技術ブログ。はてなダイアリーから移転しました

lxd を使ったライブマイグレーション (1)

Container lxc lxd

このエントリの情報はおそらく古いです

先月、LXD 0.3 のリリースでライブマイグレーションサポート、というアナウンスがあったので早速試しましたが失敗しました (> lxd を使ったライブマイグレーション(未完) - TenForwardの日記)。

これはバグがあったようで、その後の LXD と LXC の更新で修正され、0.6 でとりあえず動くようになったようなので試してみました。とりあえずネットワークの設定がされないシンプルなコンテナで試しました。

LXD はまだまだリリースのたびにかなり機能が変わっていますし、LXC の C/R 関連のパッチもガンガン投稿されている状況ですし、CRIU もバージョンアップのたびに新機能が追加されていますので、以下の例がいつまで有効かわかりません。(明日には動かないかも?)

準備

まずは準備です。OS は Ubuntu Trusty をインストールした環境を 2 つ準備しています。

lxd01
ライブマイグレーション元のホスト、lxcコマンドを実行するホスト
lxd02
ライブマイグレーション先のホスト

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 で実行しています。

  1. イメージを準備します。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
  2. リモートホストの登録。現時点では自ホストも登録しておく必要があります。
    $ lxc remote add lxd01 lxd01:8443
    $ lxc remote add lxd02 lxd02:8443
    $ lxc remote list
    local
    lxd01 https://lxd01:8443
    lxd02 https://lxd02:8443
  3. デフォルトで登録されているprofileの"default"を適当な名前のプロファイルにコピーします。ここでは"criu"にしました。
    $ lxc config profile copy default criu
  4. "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" にします。これで特権コンテナで起動します。
  5. マイグレーション元と先に同じ profile がなければマイグレーションできませんので lxd02 側にコピーします。
    $ lxc config profile copy lxd01:criu lxd02:criu
    $ lxc config profile list
    default
    criu
    $ lxc config profile list lxd02:
    default
    criu

マイグレーション

  1. コンテナを作成します。イメージは "ubuntu" を使い、"ct01" という名前です。
    $ lxc init ubuntu ct01
  2. 作成したコンテナに、先ほど作成した profile である "criu" を適用します。
    $ lxc config profile apply ct01 criu
    Profile criu applied to ct01
  3. コンテナを起動します。このコンテナは veth の設定もされない独立したネットワークにいるコンテナです。
    $ lxc start ct01
    $ lxc list
    +------+---------+------+------+
    | NAME | STATE | IPV4 | IPV6 |
    +------+---------+------+------+
    | ct01 | RUNNING | | |
    +------+---------+------+------+
  4. マイグレーションします。
    $ lxc move lxd01:ct01 lxd02:ct01
    $ lxc list
    +------+-------+------+------+
    | NAME | STATE | IPV4 | IPV6 |
    +------+-------+------+------+
    +------+-------+------+------+
    $ lxc list lxd02:
    +------+---------+------+------+
    | NAME | STATE | IPV4 | IPV6 |
    +------+---------+------+------+
    | ct01 | RUNNING | | |
    +------+---------+------+------+

とりあえず lxd01 で動いていたコンテナが lxd02 に移動しました。

これだけではコンテナ上で動いているデーモン等がちゃんと移動したのかもわかりませんし、ダウンタイムも不明ですが、とりあえず移動したということで。

続編は こちら