Ubuntu Weekly Recipe

第574回 LXD 3.0のスナップショットとマイグレーション

この記事を読むのに必要な時間:およそ 7 分

第521回から紹介しているLXD 3.0の基本的な使い方シリーズ。今回はスナップショットとリストア,それにコンテナのマイグレーションについて紹介します。

LXDコンテナのバックアップとリストア

LXDはシステムコンテナです。つまりDockerコンテナのように不変(immutable)で使い捨て(disposable)可能な使い方ではなく,むしろvirt-manager/KVMやVMWareのように,システムを立ち上げたあとにログインして様々な変更を加えることで,最終的なイメージを構築する使い方を想定しています。

今そこにあるLXDコンテナが,もう一度まったく同じ構成で構築可能かどうかは運用次第です。実運用で使っているコンテナであれば,おそらくcloud-initやAnsibleで再構築可能でしょう。ポリシーによっては,ドキュメントでフォローしているかもしれません。

ただし実験目的でちょっと作ったコンテナにそこまで手間をかけていられないかもしれません。また「試しに何かする」際に「前の状態を残しておきたい」ケースもよくあります。

そこでLXDでは,virt-manager/KVMやVMWareのような仮想マシンシステムと同じように,次のようなコンテナイメージのバックアップ・リストア機能を備えています。

  • 停止中のコンテナを他のホストへ移動するマイグレーション機能
  • 停止中のコンテナを他のホストへ複製するコピー機能
  • 稼働中のコンテナをステートレスに保存するスナップショット機能
  • 稼働中のコンテナをステートフルに保存するスナップショット機能
  • スナップショットされたコンテナをリストアする機能
  • スナップショットをベースイメージとしてエクスポートする機能
  • ベースイメージをインポートする機能
  • クラスタとして構成されたLXDホスト間でイメージを同期する機能
  • 稼働中のコンテナを他のホストへ移動するライブマイグレーション機能(実験的な機能)

今回はこのスナップショットを利用したバックアップとリストア,さらには別ホストとのマイグレーションについても紹介しましょう。

今回もUbuntu 18.04 LTSとLXD 3.0.xの環境をベースに紹介します。debパッケージ版とsnap版でほぼ違いはありませんが,もし違いがある場合は都度説明します。

LXDのスナップショット機能

コンテナのスナップショットを取る方法は至極簡単です。まずは適当なコンテナを作っておきます。

$ lxc launch ubuntu:18.04 kasumi
Creating kasumi
Starting kasumi

$ lxc info kasumi
Name: kasumi
Remote: unix://
(中略)
Resources:
(中略)
    lo:
      Bytes received: 1.02kB
      Bytes sent: 1.02kB
      Packets received: 12
      Packets sent: 12

lxc infoはスナップショット作成後との比較のために表示しています。

さて,現在の状態のスナップショットを取ってみましょう。スナップショットはコンテナが起動状態でも取得できます。取得方法はlxc snapshot コンテナ名 スナップショット名です。スナップショット名を省略した場合は「snap0」から始まる連番の名前が自動的に付与されます。

$ lxc snapshot kasumi arisa
$ lxc info kasumi
(中略)
Snapshots:
  arisa (taken at 2019/06/16 08:24 UTC) (stateless)

コンテナの情報にスナップショットが追記されていることがわかりますね。

さっそく作ったスナップショットをリストアしてみましょう。リストアされたことがわかるよう,あらかじめコンテナに変更を加えておきます。

$ lxc exec kasumi touch /home/ubuntu/snap0
$ lxc exec kasumi ls /home/ubuntu/
snap0
$ lxc exec kasumi uptime
 09:02:37 up  2:49,  1 user,  load average: 0.07, 0.04, 0.00

最後のuptimeは,kasumiコンテナが起動していた時間を確認しています。

実はLXDの普通のリストアは,対象となるコンテナを停止させる必要があります。もし起動中のコンテナに対してリストアを実行した場合,一度コンテナを停止し(シャットダウンし)⁠リストアを実行した上で,自動的に再起動します。たとえばSSHでログインしているなら,リストアによって一度切断されます。

一時的であれコンテナが停止すると困る場合は,--statefulオプションを利用してステートフルなスナップショット・リストアを使いましょう※1)⁠

※1
ここでの「コンテナが停止する困る場合」はより正確に言うと「コンテナ上のサービスが終了すると困る場合」です。ステートフルなリストアであっても,一時的にコンテナが応答できない期間は発生します。ステートフルなスナップショットを利用するには,後述の「LXDのライブマイグレーション」で言及しているように,CRIUを用意する必要があります。

リストアはlxc restore コンテナ名 スナップショット名で実施します。

$ lxc restore kasumi arisa
$ lxc exec kasumi ls /home/ubuntu/
$ lxc exec kasumi uptime
 09:11:56 up 0 min,  0 users,  load average: 1.19, 0.30, 0.09

先ほど作成したsnap0が,リストアによって削除されていることがわかります。さらにリストア対象のコンテナが再起動したために,uptimeが0分に戻っています。

LXDコンテナはシステムコンテナとは言え,カーネルの起動がスキップできるため,ベースコンテナの起動時間は数秒です。よって大抵のケースにおいては,再起動のダウンタイムはそこまで気にするほどの長さではないでしょう。もちろんcloud-initや,他のサービスによっては起動時間は長くなりますので,プロダクション用途の場合はなんらかの対策が必要になります。

スナップショットの削除はコンテナの削除と同様にlxc deleteコマンドを利用します。スナップショット単体で削除したい場合は,⁠コンテナ名/スナップショット名」と指定してください。

$ lxc delete kasumi/arisa

ちなみにLXD 3.8からはコンテナの自動スナップショット設定が追加されました。この設定を利用すると,特定のコンテナに対して定期的に任意の名前でスナップショットを作成できます。

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member株式会社 創夢所属。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。