Blog

[OpenStack] nova-lxd で instance を lxc で起動させてみよう


皆様あけましておめでとうございます。アドテク本部の makocchi です。

自分にとって新年 1 発目の記事になりますね。今年もよろしくお願いします!

 

アドテク本部では現在次の新しい OpenStack の環境についていろいろ検討しているところなのですが、中でも nova-lxd に注目しています。

OpenStack の Compute で hypervisor に lxd を使い instance を lxc コンテナで動かすことが可能になります。

 

nova-lxd のインストール

今回の環境には Ubuntu 16.04 を使用し、OpenStack の release は newton で検証しました。

nova-lxd のインストールの方法についてはこちらに書かれている通り、すごく簡単に導入することができます。

インストール後に /etc/nova/nova-compute.conf が配置されていると思います。

この conf には compute_driver として lxd の driver を使用するように設定されていますね。

この conf は systemd 経由で起動される /etc/init.d/nova-compute 内で

というように読み込まれています。

その他の nova-compute の設定は従来通り /etc/nova/nova.conf にすれば問題ないです。

 

無事に起動されれば

このように hypervisor_type に lxd が出て来ると思います。

 

glance に lxc の image を登録して instance を起動する

compute の準備が終わったら次は起動用の image を作成します。

起動確認用の cirros の image を登録してみます。

ポイントとしては disk-format に raw を指定する所です。

登録できたらこちらの image から起動してみます。

uname で見ると kernel の version は Host 側の version になりますね。

 

一方、compute 側ではどのようになっているかというと lxc list で確認できます

instance id でコンテナが作成されていて、nova-lxd が生成した instance id の profile が適用されています。

 

docker の image を lxc で動かしてみる

docker で動かすことのできる image を lxc でも動かすことが可能です。

意味があるかは置いておいて、つまり docker build した image を glance に登録して nova boot できるということです。

試しに CentOS 7 の image を作ってみましょう。

 

こんな感じの Dockerfile と

eth0 起動用の ifcfg-eth0 を用意してあげます

docker build して docker export します

できあがった centos-lxc.tar.gz を glance に登録すれば完成です。

 

意味があるかは置いておいて、Docker の image が使えるということは、先日発表された Amazon linux のコンテナイメージを OpenStack で動かすこともできちゃいます。

(実はそのままでは動かなくて、いろいろ設定を変えないと動かなかったりするのですが)

一気に幅が広まりますね。

 

lxc 内で systemd まわりが上手く動かない場合は apparmor を無効にしないと駄目かもしれません。

検証では apparmor は無効にしていました。

 

Docker on lxc

lxc 上で docker を動かすことも可能です。コンテナ on コンテナが実現できちゃいます。

lxc の profile に docker というものが用意されていて、それを適用することで lxc 内で docker を動かすことができます。

 

現状の nova-lxd の実装ですと instance に対して nova-lxd が自動生成する 1 つの profile しか適用されません。

ですので、利用ケースによっては nova-lxd の driver を改造して docker の profile も自動で適用されるようにしたり、raw.lxc に lxc.include を入れるようにしたり、より柔軟に lxc の設定ができるようにする必要があるかもしれません。

nova-lxd の driver はそれほどコード量も多くなくて比較的簡単に機能追加することができそうでしたので、現在は自動的に docker の profile があたるように改造して検証しています。(blueprint とか出すことも検討しています)

security に関する設定だけは実装されていて、flavor の meta 情報に lxd:nested_allowed を設定しておくとsecurity.nesting が有効になり、lxd:privileged_allowed を設定しておくと security.privileged が有効になります。

今後はこういう機能がどんどん実装されていくといいですね。

 

さて nova-lxd いかがだったでしょうか。

使ってみた感想ですが、起動が早くてすごく使いやすかったです。また image の size が小さいので image の転送にかかる時間も少なくて済むのもいいですね!

 

懸念点としては利用者は instance に対して console アクセスすることができなくなることでしょうか。compute に login することができる管理者であれば lxc で動いている instance に対して直接アクセスできる (default では /var/lib/lxd/containers/ 以下) ので console の機能は特に必要ないのですけども。

もし導入する場合はここらへんは割り切った運用にしないといけないですね。

 

今後は cinder との連携や live-migration の検証等行っていく予定ですので、また情報が集まりましたら記事を書きたいと思います!

 

 

 

 

Author

アバター
makocchi