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 のインストールの方法についてはこちらに書かれている通り、すごく簡単に導入することができます。
1 2 3 4 5 6 7 |
// newton repository を有効にする # apt install software-properties-common # add-apt-repository cloud-archive:newton # apt update && apt dist-upgrade // nova-lxd を install # apt-get install nova-lxd |
インストール後に /etc/nova/nova-compute.conf が配置されていると思います。
この conf には compute_driver として lxd の driver を使用するように設定されていますね。
1 2 3 |
# cat /etc/nova/nova-compute.conf [DEFAULT] compute_driver = lxd.LXDDriver |
この conf は systemd 経由で起動される /etc/init.d/nova-compute 内で
1 2 3 4 |
DAEMON_ARGS="" if [ -f '/etc/nova/nova-compute.conf' ] ; then DAEMON_ARGS="--config-file=/etc/nova/nova-compute.conf" fi |
というように読み込まれています。
その他の nova-compute の設定は従来通り /etc/nova/nova.conf にすれば問題ないです。
無事に起動されれば
1 2 3 4 5 6 |
# openstack hypervisor show ubuntu_host -c hypervisor_type +-----------------+-------+ | Field | Value | +-----------------+-------+ | hypervisor_type | lxd | +-----------------+-------+ |
このように hypervisor_type に lxd が出て来ると思います。
glance に lxc の image を登録して instance を起動する
compute の準備が終わったら次は起動用の image を作成します。
起動確認用の cirros の image を登録してみます。
1 2 3 4 5 6 7 8 9 |
# wget http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-lxc.tar.gz # openstack image create --file cirros-0.3.4-x86_64-lxc.tar.gz --disk-format raw --container-format bare cirros-0.3.4 # openstack image list +--------------------------------------+------------------------------------+--------+ | ID | Name | Status | +--------------------------------------+------------------------------------+--------+ | c1572e19-3ad1-4a2e-8c67-023c59af4809 | cirros-0.3.4 | active | +--------------------------------------+------------------------------------+--------+ |
ポイントとしては disk-format に raw を指定する所です。
登録できたらこちらの image から起動してみます。
1 2 3 4 5 6 7 8 9 |
// flavor はテスト用に作った lxd.c1.small // --nic は適当に指定して下さい (今回の検証環境では network を 1 つしか作ってないので --nic を省略して起動させてます) # openstack server create --image cirros-0.3.4 --flavor lxd.c1.small test // ssh で login も可能 $ ssh cirros@192.168.1.11 cirros@192.168.1.11's password: $ uname -a Linux cirros 4.4.0-53-generic #74-Ubuntu SMP Fri Dec 2 15:59:10 UTC 2016 x86_64 GNU/Linux |
uname で見ると kernel の version は Host 側の version になりますね。
一方、compute 側ではどのようになっているかというと lxc list で確認できます
1 2 3 4 5 6 |
# lxc list +-------------------+---------+--------------------------------+------+------------+-----------+ | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | +-------------------+---------+--------------------------------+------+------------+-----------+ | instance-0000004f | RUNNING | 192.168.1.11 (eth0) | | PERSISTENT | 0 | +-------------------+---------+--------------------------------+------+------------+-----------+ |
instance id でコンテナが作成されていて、nova-lxd が生成した instance id の profile が適用されています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# lxc config show instance-0000004f --expanded name: instance-0000004f profiles: - instance-0000004f config: boot.autostart: "True" limits.cpu: "2" limits.memory: 4096MB raw.lxc: |- lxc.console.logfile=/var/log/lxd/instance-0000004f/console.log volatile.base_image: 80037860f840a552c683da517956725c50fa7c1ac18c8a61f38379ddfb4e8a8c volatile.idmap.base: "0" volatile.idmap.next: '[]' volatile.last_state.idmap: '[]' volatile.last_state.power: RUNNING volatile.qbrb24438a7-5d.name: eth0 devices: qbrb24438a7-5d: host_name: tapb24438a7-5d hwaddr: fa:16:3e:62:66:d2 nictype: bridged parent: qbrb24438a7-5d type: nic root: path: / type: disk ephemeral: false |
docker の image を lxc で動かしてみる
docker で動かすことのできる image を lxc でも動かすことが可能です。
意味があるかは置いておいて、つまり docker build した image を glance に登録して nova boot できるということです。
試しに CentOS 7 の image を作ってみましょう。
こんな感じの Dockerfile と
1 2 3 4 5 6 7 8 9 10 11 |
FROM centos:7.3.1611 MAINTAINER makocchi # updte RUN yum update -y # install depend packages RUN yum install -y dhclient cloud-init openssh-server sudo passwd && yum clean all # add interface COPY ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-eth0 |
eth0 起動用の ifcfg-eth0 を用意してあげます
1 2 3 4 |
DEVICE=eth0 BOOTPROTO=dhcp ONBOOT=yes TYPE=Ethernet |
docker build して docker export します
1 2 3 4 5 |
# docker build -t centos7-lxc . // docker export するために 1 回 run させる # docker run --cidfile cid.tmp centos7-lxc uname # docker export $(cat cid.tmp) | gzip > centos-lxc.tar.gz |
できあがった 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 を動かすことができます。
1 2 3 4 5 6 7 8 9 10 11 12 |
# lxc profile show docker name: docker config: linux.kernel_modules: overlay, nf_nat security.nesting: "true" description: Profile supporting docker in containers devices: aadisable: path: /sys/module/apparmor/parameters/enabled source: /dev/null type: disk usedby: [] |
現状の nova-lxd の実装ですと instance に対して nova-lxd が自動生成する 1 つの profile しか適用されません。
1 2 3 4 5 6 7 |
# lxc config show instance-0000004f name: instance-0000004f profiles: - instance-0000004f config: ... ... |
ですので、利用ケースによっては 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