LXDとOpenStackでVM感覚でコンテナを使ってみよう

# LXDコンテナ + OpenStack

この記事はNTTテクノクロス Advent Calendar 2018の19日目の記事です。

[NTTテクノクロス](https://www.ntt-tx.co.jp/?utm_source=qiita&utm_medium=ac2018&utm_campaign=14)の本上です。
普段の業務では、OpenStackを利用したIaaS基盤やOpenStackコミュニティに投稿されたパッチに対するCIシステムの設計・構築・保守運用や、「[OSSクラウド基盤トータルサービス](https://www.ntt-tx.co.jp/products/osscloud/?utm_source=qiita&utm_medium=ac2018&utm_campaign=18)」を提供などを行っています。

さて、本題に入りましょう。
コンテナと聞いて、現在誰もが真っ先に思い浮かべるのは、Dockerではないでしょうか。
先日のJapanContainerDays v18.12でも、セッションで扱われているコンテナの大部分はDockerでした（特に実業務での事例紹介系セッションでは）。

Dockerはアプリケーション（プロセス）単位でコンテナを作成することで、デプロイや運用等の煩わしさを解消しますが、反面、レガシーなアプリケーションをコンテナ化する場合は設定に工夫が必要だったり、場合によってはアプリの改修が必要となることがあります。

一方で、「今使っている開発環境VMのかわりに、オーバーヘッドの小さいコンテナを使いたいだけなんだよなあ」「コンテナ化するためにシステム改修するほどの必要性は感じていない」「クラウドネイティブとか意識高すぎて怖い」といった、Dockerが適合しないタイプの需要（？）も当然存在すると思います。

そんな場合に、有望な選択肢の一つとなるのが、LXDコンテナです。
本記事では、LXDコンテナに、更にOpenStackを組み合わせて、便利に利用する方法をご紹介したいと思います。

## LXDコンテナとは

LXDコンテナは、基本的に、VMと同じくシステム単位で利用することを想定したコンテナです。
そのため、VMや物理マシンで利用していたアプリケーションも、比較的容易に移行ができます。

LXDは、コンテナ技術として比較的古株であるLXCをベースとしながら、REST APIのサポートや複数ホストの管理など、多数の現代的な機能の追加が行われています。
詳細は以下の公式サイトをごらんください。
https://linuxcontainers.org/ja/lxd/

# OpenStackとコンテナの関係

LXDとOpenStackの組み合わせについて紹介する前に、一旦、OpenStackとコンテナの関係について整理します。

OpenStackはもともとVM管理サービスNovaとオブジェクトストレージサービスSwiftの二つから出発しており、コンテナ管理機能は含まれていませんでした。
（OpenStackが初めてリリースされた当時、コンテナ技術は今ほど大々的な利用はされていなかったので、当然なのですが）

その後OpenStackは様々な機能拡充（サービス追加）が行われ、現在は主に以下3つのコンテナ関連サービス（機能）が存在しています。

* Zun
    * コンテナオーケストレーションサービス。雑な言い方をすればKubernetesやDocker Swarmの同類です。
* Magnum
    * OpenStackのVM管理サービスNovaで作成したVM上に、Kubernetes等のコンテナクラスタを展開するサービス。
* Nova LXD
    * OpenStackのVM管理サービスNovaに、VMではなくLXDコンテナの操作をさせるための追加ドライバ。

本記事の以降では、上記に挙げたうちの、Nova LXDについてご紹介をしたいと思います。

## Nova LXD

### Nova LXDとは

Nova LXDは、（前述したとおり）OpenStackの仮想マシン管理サービスNovaの、LXD用ドライバです。

Novaは、ユーザーが発行したREST APIを受け取ると、その内容に従って仮想化システム（LibvirtやHyper-Vなど）を操作します（例えばVMの作成・削除など）。
Nova LXDをNovaに組み込むことで、操作対象にLXDコンテナ追加することができます。

現状、Nova LXDのコードはNovaとは[別のリポジトリ](https://github.com/openstack/nova-lxd)で管理されていますが、将来的には[Novaのリポジトリ](https://github.com/openstack/nova)に組み込まれる可能性があるようです。

### なぜNovaを介してLXDを利用するのか

LXD単体でもLXCより優れた管理機能を有しているわけですが、Novaを介することで、OpenStackが持つ便利な機能をLXD操作に利用できます。
以下は一例です。

- マルチテナント
- リソースへのアクセスや操作に対する権限管理
- コンテナを作成する際の、資源利用量などを踏まえたスケジューリング
- 関連資源（仮想ネットワークや仮想ディスクなど）操作・管理の容易さ

また、OpenStackのダッシュボード（Horizon）からLXDコンテナを操作できることも、大きな利点でしょう。

上記のような利点・特性があるため、不特定多数のユーザーにコンテナの作成・削除などの操作を開放する場合、素のLXD ではなくOpenStack経由で利用したほうが適していると思います。
ダッシュボード（Horizon）も導入すれば、ほぼEC2のような感覚で利用できます。

### Nova LXDの導入方法

導入方法は、以下の公式ドキュメントにまとめられています。
https://linuxcontainers.org/ja/lxd/getting-started-openstack/
比較的簡易な手順で導入可能です。
おそらく、これ以外のOpenStackコンポーネント構築のほうが手間取ることが多いでしょう。

また、devstackであれば、local.confの[[local|localrc]]セクションに以下の一行を追加するだけで構築ができてしまいます。
```enable_plugin nova-lxd https://git.openstack.org/openstack/nova-lxd```

### OpenStack + LXDで出来ること

Nova LXDを組み込んだNovaによるLXDコンテナ操作について、ユーザーはVMの場合とまったく同じ感覚で利用ができます。
ユーザーが利用するNova APIやダッシュボード（Horizon）はVMの場合と同一なので、新たに操作を学習してもらう必要はありません。

ただし、Nova LXDでは、一部、利用できないNova APIが存在します。
Nova LXDで利用可能なAPIについては、まとまったドキュメントが無かったので、少し前に以下のドキュメントを作成いたしました。
https://github.com/openstack/nova-lxd/blob/master/doc/source/support_matrix/support-matrix.ini
※SphinxドキュメントなのでHTMLとしてビルドしてから閲覧することを推奨。

なお上記ですが、対応状況が不明だった箇所（ステータスをunknownとしている）や、実機確認が出来ていない箇所もあるため、今後改善していく予定です。
もし、誤っている箇所などありましたら、ご指摘いただけると（もしくは修正パッチを投げていただけると）幸いです。

### 豆知識：コンテナなら収容率が上がる？

突然ですがここでクイズです。
以下の考えは正しいでしょうか？

**「コンテナはVMに比べてオーバーヘッドが小さい。そのため、今のOpenStack環境のバックエンドをVMからLXDにすれば、インスタンスの収容率を上げられる。」**

LXDコンテナ単体であれば上記は正解なのですが、Nova LXDでLXDコンテナを利用する場合、実は不正解となります。

というのも、OpenStack Novaでは、インスタンス（VMやコンテナ）を作成する際に、フレーバ（EC2で言うインスタンスタイプ。インスタンスのCPUやメモリなどの性能を規定するテンプレート）を選択します。
そして、Novaが作成先ホストのスケジューリングするにあたっては、【各ホストの利用可能なリソース量から、作成済みインスタンスのフレーバの値を引いた量】が比較に用いられます。

そのため、いくらLXDコンテナのオーバーヘッドがVMに比べて小さくても、結局比較に用いられるのはフレーバが持つ仮想的な値（インスタンスが持ち得る最大値）なので、収容率の向上には寄与しないという動作となっています。

ただし、オーバーヘッドの小ささを見越して、スケジューラーのオーバーコミット率設定値を大きくするという対処は可能です。
Novaのオーバーコミット率は、ディスク/メモリ/CPUなど資源種別ごとに設定できます。

## 終わりに

明日の「NTTテクノクロス Advent Calendar 2018」は、 @saken2 さんが、「怖いと錯覚するVRコンテンツ」について語ってくれる予定です。
寒い季節にある意味ぴったりの（？）内容かもしれませんので、お楽しみに！