Back to the news overview

LXD 3.4 リリースのお知らせ

14th of August 2018

はじめに

LXD チームは LXD 3.4 のリリースを発表することにとてもワクワクしています!

このリリースの主なハイライトは、パフォーマンスの大幅な向上です。
データベースバックエンドを新しいバージョンにアップグレードし、バッチクエリ用の新しい内部 API を導入し、1 回の API コールで全コンテナの状態が問い合わせできるようになり、クラスタパフォーマンスにかなりの悪影響を及ぼした多数のボトルネックを修正しました。

最初のテストで、数千のコンテナが稼働しているクラスタで、コンテナの基本的な状態を通常は数秒で返すようになりました(lxc list --fast)。その他の操作も以前に比べて大幅に高速化しています。特に数百〜数千のコンテナのすべての状態を問い合わせるような場合などは、まだ完全に想定の速度には到達していません(lxc list)。しかし、それを改善するためのオプションもいくつかあります。

新機能は、いくつかのコマンドラインクライアントに欠けていた進捗表示を追加し、外部コマンドにエイリアスを設定する機能を追加しました。そして、クラスタ上の Fan ブリッジを使っている場合のホストをまたいで DNS が使えるようになりました。

Enjoy!

重要なお知らせ

コンテナのスナップショットとバックアップのネーミングの修正

従来は、すべてのスナップショットとバックアップの name プロパティは、コンテナ名に続いてスラッシュが続き、その後にスナップショットもしくはバックアップ名が続いていました。

これは、特定のコンテナを検索することでしかこの情報を得ることができなかったため、冗長でした。

API はスナップショットもしくはバックアップ名のみ返すようになりました。しかし LXD は、既存のバックアップのマイグレーションやリストアもできるように、依然として古い形式も認識します。

新しい dqlite の実装に切り替わりました

LXD 3.0 で使い始めた分散 sqlite3 実装である dqlite を、多数のパフォーマンス上のボトルネックを解消するために、大幅に修正しました。

ほとんどのデータベースロジックを、C ライブラリ(libdqlite)と、LXD 用の SQL インターフェースを提供する Go パッケージ(go-dqlite)内で実行するようになりました。

ディスク上のフォーマットに変更はありませんので、この変更に対するアップグレード処理に危険はありません。しかし、パッケージを作成する場合には、新しいライブラリを忘れずに、LXD と一緒にパッケージングする必要があります。

lxc remote set-defaultlxc remote switch に変更されました

lxc remote set-default をより親しみやすく、短い lxc remote switch に変更しました。この変更は、LXD プロジェクトで今後予定されている、同様の switch サブコマンドの追加に対する準備としてなされました。

lxc remote set-defaultlxc remote switch のエイリアスとして、今後も有効なままです。

macaroon 認証オプションを candid に変更しました

Candid project で、macaroon ベースの認証の標準的な実装が公開されたので、これをサポートするように LXD を更新しました。そして設定オプションをこれに合うように変更しました。

これは主に、現在は candid.api.url に変更された、以前の core.macaroon.endpoint に影響します。LXD 3.4 にアップグレードすると、自動的にこの名前を変換します。

新機能

クラスタ向けの Fan を使った DNS 名前解決

オーバーレイ・ネットワークとして、Ubuntu の Fan を使っている LXD クラスターを実行しているユーザの問題のひとつに、様々なノード間ですべてのトラフィックが適切にルーティングされていても、同じクラスタノード上で実行中の場合のみ、コンテナの名前解決が働くというものがありました。

LXD 3.4 では、すべてのノードに対してネットワークの定義されたドメイン(デフォルトで lxd)に対する DNS クエリの解決にひとつの値を返すので、単一の統合 DNS サーバにが処理しているように感じます。

コンテナの状態向けのより速い API

新しい /1.0/containers?recursion=2 API が追加されました。これにより、すべてのコンテナの設定、状態、スナップショットやバックアップのリストを単一の呼び出しで取得できます。

これにより、コンテナごとに行っていた、ひとつのメインの API 呼び出しと、それに続く 3 つの追加呼び出しを、効率的にひとつの呼び出しで行えるようになりました。

lxc filelxc import の進捗表示

ファイルの転送や LXD へのバックアップのアップロードで、進捗表示が表示されるようになりました。
サイズがわかる場合は、転送された割合と現在のスピードが表示されます。サイズがわからない場合は、転送された量と転送スピードを表示します。

外部コマンドに対するエイリアス

コマンドラインクライアントに対して、外部コマンドを指すエイリアスが設定できるようになりました。
エイリアスの定義を、実行したいコマンドの絶対パスから開始するだけで済みます。

lxc alias add my-script "/usr/local/bin/myscript @ARGS@ --extra-args"

ファイルケーパビリティのサポート

tarrsync を呼び出す場合はすべて、ファイルのケーパビリティを含む拡張属性を保存、復元するのに必要なオプションを与えるようになりました。

さらに、最近導入された非特権のファイルケーパビリティを使用して、ファイルのケーパビリティを含むファイルの ID のシフトやシフト解除(unshift)するためのロジックを idmap パッケージに実装しました。

適切なカーネル(upstream の 4.14 以上)では、LXD イメージは pingmtr のようなユーティリティに対してファイルケーパビリティを含めることができ、特権コンテナのユーザでも非特権コンテナのユーザでも同じように、これらのケーパビリティを設定して使うことができます。

バグ修正

  • client: クラスタのターゲット取得処理を1ヶ所で扱うようにしました
  • client: CopyContainerSnapshot API を修正しました
  • doc: スナップショットの API 出力を修正しました
  • doc: ストレージのドキュメント内の typo を修正しました
  • doc: README に make deps について記載し、動作環境の情報を更新しました

  • global: rsync 呼び出しで xattrs をサポートしました

  • global: tar 呼び出しで xattrs をサポートしました
  • global: エラーメッセージを統一しました
  • i18n: weblate から翻訳を更新しました
  • i18n: 翻訳テンプレートを更新しました
  • lxc: 外部コマンドに対してエイリアスを設定できるようになりました
  • lxc: remote add の際の回答を翻訳可能にしました
  • lxc/container: Ceph の場合でもオフラインクォータを設定するようにしました
  • lxc/copy: 修正した CopyContainerSnapshot に更新しました
  • lxc/file: 進捗表示を行うようになりました
  • lxc/image: URL ベースのインポートの問題を修正しました
  • lxc/import: 進捗表示を行うようになりました
  • lxc/list: ContainerFull を使うようにしました
  • lxc/list: recursion=2 のサポートを追加しました
  • lxc/remote: 不適切なリモート名を指定した場合のクラッシュを修正しました
  • lxc/remote: set-defaultswitch にリネームしました
  • lxc/storage: 不適切な引数のパースを修正しました
  • lxc/utils: 進捗表示するものがない場合の扱いを追加しました
  • lxc-to-lxd: lxc.rootfs のパースの問題を修正しました
  • lxc-to-lxd: rootfs のテストを修正しました
  • lxd: dns フォワーダーを追加しました
  • lxd: バックアップ・スナップショットにコンテナ名を含めないようにしました
  • lxd: --syslog オプションの問題を修正しました
  • lxd: 新しい containerLoadAll 関数を使うようにしました
  • lxd: 新しい containerLoadNodeAll 関数を使うようにしました
  • lxd/backups: インターフェースである必要がない部分を修正しました
  • lxd/cluster: 新しい join API で空の MemberConfig も許可されるようにしました
  • lxd/cluster: エラーメッセージの typo を修正しました
  • lxd/cluster: ユニットテストのリグレッションを修正しました
  • lxd/cluster: 必要なときのみコンテナの問い合わせを行うようにしました
  • lxd/cluster: ペンディング状態のネットワーク/プールを適切にスキップするようにしました
  • lxd/cluster/gateway: プロキシのエラーをログ出力するようにしました
  • lxd/cluster/gateway: エラーメッセージを少し変更しました
  • lxd/containers: コンテナを取得するヘルパを追加しました
  • lxd/containers: スナップショットのリースをフラッシュしないようにしました
  • lxd/containers: 並列でコンテナを取得するようにしました
  • lxd/containers: recursion=2 のサポートを実装しました
  • lxd/containers: クラスタノードのシャットダウンロジックを改良しました
  • lxd/containers: プロファイルを一度だけ取得するようにしました
  • lxd/containers: リカーシブなリスト取得をスピードアップしました
  • lxd/containers: 内部的な構造体の値を使うようにしました
  • lxd/db: メインパッケージを新しいクラスタサブパッケージ API に合わせました
  • lxd/db: ContainerArgsList 関数と ContainerArgsNodeList 関数を追加しました
  • lxd/db: lxd sql global .sync コマンドを追加しました
  • lxd/db: エラーメッセージを大文字で始めるようにしました
  • lxd/db: go-1.6 に対する後方互換性用のコードを削除しました
  • lxd/db: raft のスナップショットのための回避コードを削除しました
  • lxd/db: lint のエラーを修正しました
  • lxd/db: スナップショットのフィルタリングの問題を修正しました
  • lxd/db: 欠けていたエラーチェックをいくつか修正しました
  • lxd/db: ローカル DB を初期化した後のオープンしているコネクション数を制限しました
  • lxd/db: dqlite のロギングを lxd のロギングにリダイレクトするようにしました
  • lxd/db: 空のテーブルチェックを復活させました
  • lxd/db: grpc-sql を dqlite のカスタムプロトコルに置き換えました
  • lxd/db: 自身(カノニカル)の fork の代わりに mattn の sqlite3 バインディングを使うようにしました
  • lxd/db: dqlite サーバを使うようにしました
  • lxd/forkproxy: {g,u}id に正しい型を使うようにしました
  • lxd/images: スタートアップ時に残ったイメージをクリーンアップするようにしました
  • lxd/images: イメージを削除した際に他のノードに通知を送るようにしました
  • lxd/import: コンテナ名なしのスナップショットサポートの問題を修正しました
  • lxd/init: 新しいクラスタに参加する API を使うようにしました
  • lxd/networks: FAN のクラスター化された DNS が使えるようになりました
  • lxd/networks: lo に対してコンテナをリストしないようにしました
  • lxd/networks: 使われていない DB プロパティを削除しました
  • lxd/networks: コンテナのパケット統計の問題を修正しました
  • lxd/networks: veth デバイスを無視するようにしました
  • lxd/networks/state: 存在しないインターフェースをスキップするようにしました
  • lxd/patches: データベース更新中の「アクティブなトランザクションはありません」というエラーを修正しました
  • lxd/state: state 構造体に endpoints を追加しました
  • lxd/storage: ストレージのバージョンをキャッシュするようにしました
  • lxd/storage: ストレージの初期化ごとにログを記録しないようにしました
  • lxd/storage/ceph: デフォルトのコンテナクォータを修正しました
  • lxd/storage/zfs: ディスク使用量の取得を最適化しました
  • Makefile: deps ターゲットを追加しました
  • Makefile: gccgo のサポートを削除しました
  • Makefile: 古くなったコメントを削除しました
  • Makefile: タグの扱いを修正しました
  • Makefile: .PHONY の typo を修正しました
  • Makefile: dist tarball に dqlite を含めました
  • Makefile: protobuf を update-protobuf にリネームしました
  • Makefile: libsqlite3 に依存するようになりました
  • Makefile: CGO_CFLAGS を参照するようになりました
  • Makefile: PKG_CONFIG_PATH を設定するようにしました
  • Makefile: sqlite のビルドフラグを調整しました
  • Makefile: dist の clone で最新版のみ取得するようにしました
  • Makefile: deps の clone で最新版のみ取得するようにしました
  • shared/api: ContainerFull を定義しました
  • shared/idmap: C コーディングスタイルを修正しました
  • shared/idmap: uid をビッグからリトルエンディアンに変換するようにしました
  • shared/idmap: xattr.h のインポートを修正しました
  • shared/idmap: fscaps をシフトするようにしました
  • shared/idmap: s/set_caps/set_vfs_ns_caps/g
  • tests: クラスターのシャットダウンロジックのテストを追加しました
  • tests: lxc-to-lxd のユニットテストを修正しました
  • tests: 新しいストレージの get/set テストを修正しました

試用環境

この新しい LXD リリースは私たちの デモサービス で利用できます。

ダウンロード

このリリースの tarball は ダウンロードページ から取得できます。