Back to the news overview

LXD 3.0.0 リリースのお知らせ

2nd of April 2018

はじめに

LXD チームは LXD 3.0.0 のリリースをお知らせできることをうれしく思います!
このリリースは LXD プロジェクトの2つめの LTS リリースです。そして 2023 年の 6 月までサポートされます。

新機能(2.21 以降)

LXD 3.0 は次の 2 年間のメインの LTS リリースとなります。最新の機能のリリースから短い間隔でバックポートされたバグフィックスの更新がなされます。

LXD 2.21 のリリース以来 3 ヶ月以上をかけて、LXD 3.0 で実装したかった機能をすべてリリースしました。そして既存コードを多数整理して、LTS の間メインテナンスしやすくなるようにしました。以下がメインのハイライトです。

クラスタリング

LXD 3.0 でのもっとも大きな新機能がクラスタリングサポートの導入です。
同じような設定を持つ LXD サーバをクラスタの一部として連携させることができます。そして大きなひとつの LXD サーバとして外部に見せられます。

LXD データベースは dqlite (sqlite3 と raft の組み合わせ)を使ってレプリケートされます。クラスタメンバーの 3 つが任意の時点でデータベース全体のコピーを持つようにします。

LXD クラスタリングをセットアップするための特別なシステム設定やサービスは必要ありません。必要なのは同様のネットワークとストレージプロパティを持つ、いくつかのマシンか VM が利用できることだけです。lxd init コマンドを使って、クラスタの作成やサーバをクラスタに追加する操作を、順に質問に答えることで行えます。

マシンとネットワークを割り当てるために、MAAS を使って 3 ノードの LXD クラスタを設定する録画をお見せしましょう:

この機能のメインコントリビューターである Free Ekanayaka も FOSDEM 2018 で LXD クラスタの長いプレゼンテーションを行いました。こちらでチェックできます:

ドキュメントもこちらでチェックできます: https://lxd.readthedocs.io/en/stable-3.0/clustering/

lxd-p2c を使った物理からコンテナへのマイグレーション

lxc-p2c という名前の新しいツールが、システムのファイルシステムを LXD コンテナに LXD API を使ってインポートできます。

ツールでのコピーが終わると、出来上がったバイナリーは、コンテナを作成したい任意のシステムに転送できます。リモートの LXD サーバを指定すると、システムのファイルシステムすべてが LXD のマイグレーション API を使って転送され、新しいコンテナが作成されます。

この機能のメインのコントリビューターである Stéphane Graber が FOSDEM 2018 でこの機能についてのプレゼンテーションを行いました。ビデオがご覧いただけます:

NVIDIA の動的なパススルーのサポート

NVIDIA GPUをコンテナ内で使う人たちの共通の問題は、ユーザスペースのライブラリをカーネルドライバと同期させておくことが必要なことです。

これは、コンテナの所有者がホストの所有者と異なる場合、警告なしに同期しなくなる可能性があり、特に難しくなります。

新たに導入された設定である nvidia.runtime と、nvidia-container-cli ツールと liblxc 3.0 を組み合わせると、ホスト上で正しい情報を自動で検出し、コンテナの起動時に必要な情報を与えるようになりました。(訳注: よくわからないけど、nvidia.runtime の設定とデバイスの設定を行えば、色々情報はホスト上で lxc が集めて、cli ツールやライブラリもコンテナ上で使えるようにしてコンテナを起動する、という感じか? 下の asciinema を参照)

これにより大量のスペースを節約でき、メンテナンスが大幅に簡素化されます。

Unix キャラクタデバイス、Unix ブロックデバイスのホットプラグのサポート

unix タイプのデバイスに新しい必須プロパティを追加しました。false に設定すると、LXD は要求されたパスがホスト上で利用できるようになってから、自動的にコンテナに追加します。

これで次のようなことができるようになります:

lxc config device add c1 ttyUSB0 unix-char path=/dev/ttyUSB0 required=false

c1 コンテナは、USB シリアルデバイスがシステムにプラグインされるとすぐにアクセスし、システムから抜かれると自動的に削除されます。

ストレージボリュームのローカルコピー/移動

ストレージプール間で、カスタムのストレージボリュームをコピーや移動ができるようになりました。

stgraber@castiana:~$ lxc storage volume copy ssd/example default/example
Storage volume copied successfully!

stgraber@castiana:~$ lxc storage volume move ssd/example default/example
Storage volume moved successfully!

カスタムストレージボリュームのリモート転送

新しいストレージマイグレーション API が導入されました。コンテナのマイグレーションで使うのと同じ構文を使って、LXD サーバ間で同様に操作できます。

ネットワーク接続を転送する新しい proxy デバイスタイプ

ホストとコンテナ間の TCP 接続を転送できるデバイスタイプである proxy デバイスタイプが新たに追加されました。

例えば、ホスト上の port 80 への任意の接続をコンテナ c1 の localhost の IP アドレスの 80 番に転送するには:

lxc config device add c1 http proxy listen=tcp:0.0.0.0:80 connect=tcp:127.0.0.1:80

/dev/lxd を経由したイベント通知

コンテナ内に対して提供されている REST API 使い、設定やデバイスが追加、削除、変更された場合のイベントを受け取ることができるようになりました。

root@c1:~# curl -i -N -H "Connection: Upgrade" -H "Upgrade: websocket" --header "Sec-WebSocket-Version: 13" --header "Sec-WebSocket-Key: SGVsbG8sIHdvcmxkIQ==" --unix-socket /dev/lxd/sock lxd/1.0/events
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: qGEgH3En71di5rrssAZTmtRTyFk=

{"metadata":{"key":"user.foo","old_value":"","value":"bar"},"timestamp":"2018-04-02T23:58:54.433992023-04:00","type":"config"}
{"metadata":{"action":"added","config":{"path":"/home","source":"/home","type":"disk"},"name":"home"},"timestamp":"2018-04-02T23:59:25.65007597-04:00","type":"device"}

コマンドラインパーサーの変更

以前使っていたコマンドラインパーサの gnuflag は、LXD のコマンドライン構造とあまりマッチしておらず、ヘルプやエラーメッセージがわかりづらくなっていました。そこで、多数の主要な Go プロジェクトに使われている、cobra コマンドラインパーサに移行しました。

lxc list のプロセス数表示

lxc list で表示を指定できるカラムに "processes" が追加されました。コンテナの内部で動作しているプロセスの数を表示します。

stgraber@castiana:~$ lxc list -c nsN c1
+------+---------+-----------+
| NAME |  STATE  | PROCESSES |
+------+---------+-----------+
| c1   | RUNNING | 33        |
+------+---------+-----------+

lxc storage info サブコマンド

ストレージプールの情報をわかりやすく取得できる info サブコマンドが新たに追加されました:

stgraber@castiana:~$ lxc storage info ssd
info:
  description: ""
  driver: dir
  name: ssd
  space used: 9.29GB
  total space: 173.12GB
used by: {}

代替 IPv4 ゲートウェイ向けのオプション

LXD が管理するブリッジ用に新たに ipv4.dhcp.gateway オプションが利用できます。LXD 自身が作るゲートウェイ以外を設定することができ、LXD のブリッジと物理ネットワークを混在させる場合に便利です。

ファイル転送時のシンボリックリンクサポート

シンボリックリンクを含む再帰的なファイル転送を行う場合、リンク先のファイルの内容ではなく、転送先でもただしくシンボリックリンクとして作られるようになりました。

lxc monitor コマンドでのログエントリの Pretty レンダリング

LXD のログは、lxc monitor ツールを使って、イベントインターフェース経由で利用できました。しかし、そのままでは非常に読みにくいことがありました。

コマンドラインクライアントでは、このようなログイベントをフィルタし、再フォーマットして、サーバのログ出力を見ているように見れるようになりました。

stgraber@castiana:~$ lxc monitor --pretty --loglevel=info --type=logging
INFO[04-02|22:57:39] Stopping container                       action=stop created="2018-02-27 18:02:02 -0500 EST" ephemeral=false name=snapcraft stateful=false used="2018-03-29 15:33:05 -0400 EDT"
INFO[04-02|22:57:40] Stopped container                        action=stop created="2018-02-27 18:02:02 -0500 EST" ephemeral=false name=snapcraft stateful=false used="2018-03-29 15:33:05 -0400 EDT"
INFO[04-02|22:57:40] Starting container                       action=start created="2018-02-27 18:02:02 -0500 EST" ephemeral=false name=snapcraft stateful=false used="2018-03-29 15:33:05 -0400 EDT"
INFO[04-02|22:57:41] Started container                        action=start created="2018-02-27 18:02:02 -0500 EST" ephemeral=false name=snapcraft stateful=false used="2018-03-29 15:33:05 -0400 EDT"

lxc network list-leases サブコマンド

LXD が管理するブリッジの DHCP リース情報が API 経由とコマンドライン経由で直接取得できるようになりました。

stgraber@castiana:~$ lxc network list-leases lxdbr0
+-----------+-------------------+---------------+---------+
| HOSTNAME  |    MAC ADDRESS    |  IP ADDRESS   |  TYPE   |
+-----------+-------------------+---------------+---------+
| bar       | 00:16:3e:e0:36:3a | 10.166.11.185 | DYNAMIC |
+-----------+-------------------+---------------+---------+
| snapcraft | 00:16:3e:be:f1:87 | 10.166.11.120 | DYNAMIC |
+-----------+-------------------+---------------+---------+

lxc alias コマンド

コマンドエイリアスを管理するのに、設定ファイルを直接編集するのではなく、コマンドラインツールを使って直接コマンドエイリアスを一覧表示、作成、削除できるようになりました。

stgraber@castiana:~$ lxc alias list
+--------+-------------------------------------------+
| ALIAS  |                  TARGET                   |
+--------+-------------------------------------------+
| delete | delete -f                                 |
+--------+-------------------------------------------+
| ls     | list -c ns46S                             |
+--------+-------------------------------------------+
| ubuntu | exec @ARGS@ -- sudo --login --user ubuntu |
+--------+-------------------------------------------+

lxc config device override サブコマンド

デフォルトのネットワークインターフェースのような、プロファイルから継承したデバイスの特定のオプションを上書きするには、コンテナにローカルなデバイスを作成し、プロファイルと同じ名前を使う必要があります。このデバイスはプロファイルのデバイスよりも優先されますので、必要な任意の設定を行うことができます。

この操作を簡単にするために、変更が必要なコンテナ、デバイス、設定キーを指定して、lxc config device override を使うことができます。

stgraber@castiana:~$ lxc launch ubuntu:16.04 c1
Creating c1
Starting c1
stgraber@castiana:~$ lxc config device override c1 eth0 ipv4.address=10.166.11.42
Device eth0 overridden for c1
stgraber@castiana:~$ lxc restart c1
stgraber@castiana:~$ lxc list c1
+------+---------+---------------------+----------------------------------------------+------------+-----------+
| NAME |  STATE  |        IPV4         |                     IPV6                     |    TYPE    | SNAPSHOTS |
+------+---------+---------------------+----------------------------------------------+------------+-----------+
| c1   | RUNNING | 10.166.11.42 (eth0) | 2001:470:b368:4242:216:3eff:fed1:aff3 (eth0) | PERSISTENT | 0         |
+------+---------+---------------------+----------------------------------------------+------------+-----------+

オペレーションへの説明(description)の追加

すべてのバックグラウンド操作用に、新たに API に説明(description)フィールドが追加されました。コマンドラインツールからも表示できます。

stgraber@castiana:~$ lxc operation list
+--------------------------------------+-----------+---------------------+---------+------------+----------------------+
|                  ID                  |   TYPE    |     DESCRIPTION     | STATUS  | CANCELABLE |       CREATED        |
+--------------------------------------+-----------+---------------------+---------+------------+----------------------+
| 343b1700-c0bd-44fa-8b1f-e6a8fdb91b42 | WEBSOCKET | Migrating container | RUNNING | NO         | 2018/04/03 02:51 UTC |
+--------------------------------------+-----------+---------------------+---------+------------+----------------------+
| 65494c6e-7643-4ed5-8abf-497e57cfdd5c | WEBSOCKET | Executing command   | RUNNING | NO         | 2018/04/03 02:51 UTC |
+--------------------------------------+-----------+---------------------+---------+------------+----------------------+

lifecycle タイプのイベント

新しいイベントクラスとして "lifecycle" と呼ばれるクラスが導入されました。これにより、スクリプトや他の API を使ったクライアントから、LXD が何をしているのかトラッキングしやすくなりました。LXD のログメッセージを読み取る必要はありません。

stgraber@castiana:~$ lxc monitor --type=lifecycle
metadata:
  action: container-updated
  source: /1.0/containers/bar
timestamp: "2018-04-02T22:53:06.742745596-04:00"
type: lifecycle


metadata:
  action: container-started
  source: /1.0/containers/bar
timestamp: "2018-04-02T22:53:07.234066242-04:00"
type: lifecycle


metadata:
  action: container-shutdown
  source: /1.0/containers/bar
timestamp: "2018-04-02T22:53:19.885795751-04:00"
type: lifecycle


metadata:
  action: container-deleted
  source: /1.0/containers/bar
timestamp: "2018-04-02T22:53:23.813480386-04:00"
type: lifecycle

システム要件

LXD 3.0 の動作には Go 1.9 以上が必要です。現時点では、これより古いバージョンでもビルドできるかもしれませんが、今後のバグフィックスリリースでは、より新しい Go の関数を使わないという保証はありません。

サポートとアップグレード

LXD 3.0.0 は 2023 年 6 月までサポートされ、最新の LTS リリースとなります。LXD 2.0 はより遅いペースでのメンテナンスとなり、致命的なバグ修正とセキュリティ修正のみなされます。

LXD のフィーチャーブランチ (現在 2.21) のユーザは、サポートを継続して受け、すべてのバグ修正と LXD 3.0 が提供する新しい機能を使うには、3.0 へのアップデートが必要です。

LXD の LTS ブランチ (現在 2.0.11) のユーザは、LXD 2.0 を使い続け、重要なセキュリティ修正を入手するか、LXD 3.0 へアップグレードするかを選択できます。重要なプロダクション環境で LXD LTS を使っているユーザは、いくつかのテストシステムで LXD 3.0 へのアップグレードを開始し、潜在的な問題をチェックし、LXD 3.0.1 がリリースされた後で残りのマシンをアップグレードしても良いでしょう。

開発元からの snap パッケージの利用が可能に

LXD をインストールし、最新の状態に保つおすすめの方法は、開発元が提供する snap パッケージを使うことです。すべてのシステムが確実に LXD の同じコピーが実行されますし、バグレポートとデバッグのプロセスが簡単になります。

LXD の snap として、3 つのトラックが提供されます:

  • latest(最新の LXD フィーチャーリリース、現時点では 3.0)
  • 2.0 (前の LTS リリース)
  • 3.0 (現在の LTS リリース)

それぞれのトラックで、3 つのチャンネルがメンテナンスされます:

  • edge(開発元のリポジトリから取得したコードから自動的にビルドされテストされていない)
  • candidate (将来の stable ビルド、バージョンアップ前の約 48 時間のテスト用)
  • stable(現時点の stable なサポート対象のビルド)

LXD 3.0 をインストールし、1 ヶ月程度で 3.1 にアップグレードするには、次のように実行します:

snap install lxd

LXD 3.0 をインストールし、その後はバグフィックスとセキュリティフィックスのみ取得するには、つぎのように実行します:

snap install lxd --channel=3.0

ステージングのシステムを実行する場合、--channel=candidate--channel=3.0/candidate を使うことで、candidate チャンネルの LXD をそれぞれ実行できます。

トラックやチャンネルは snap refresh コマンドを使って変更できます。しかし LXD はダウングレードはサポートしませんので、実行しても起動しないでしょう。

ダウンロード

コントリビューター

LXD 3.0.0 は、全部で 18 名の貢献によりリリースされました。