2015/09/25

lxc上でlxdを動かしたり・・・

シングルマシン1台でopenstackやらdevstackやらnovaのlxd版やら、色々試してみたものの動いたり動かなかったり、動いてもすごいリソース食いだったり(当たり前か)を一通り体感したので、原点に立ち戻った。

方針
* ホストはUbuntu15.04をクリーンインストールしたところに、openssh-serverと lxc だけ入れる
* lxdはlxcコンテナの中で動かす(仮想の仮想)
* 構築した録画システムは、lxcコンテナ上で稼働させる


インストール関係は過去の記事で書いたので、ここでは上のプランを実施する上で行ったことを書く。

lxcコンテナ作成と日本語化
ぼやぼやしているうちに、lxcもバージョンアップしたのか15.04だからか不明だけれど、テンプレートがスクリプトになったため、テンプレートからコンテナ作成するとものすごく遅くなった。日本語化も同時にやってくれるので面倒な無いけど、余計なものも入ってしまう。
ということでイメージダウンロードでコンテナ作成する。

$ sudo lxc-create -n test -t download -d ubuntu -r vivid -a amd64
前はこんな感じで出来た気がするのだけれど、-dが理解してくれない。仕方ないので

$ sudo lxc-create -t download  -n
で、対話式でやった。

このクラウドイメージは素の状態なので、日本語化とか、いくつか手を加える
#!/bin/bash
lxc-start -n $1
lxc-attach -n $1 -- adduser ubuntu
lxc-attach -n $1 -- passwd ubuntu
lxc-attach -n $1 -- apt-get install language-pack-ja -y
lxc-attach -n $1 -- apt-get install emacs -y
lxc-attach -n $1 -- update-locale LANG=ja_JP.UTF-8
lxc-attach -n $1 -- dpkg-reconfigure tzdata
lxc-stop -n $1
こんなスクリプトを書いてそのコンテナに対して実行すると、デフォルトのubuntuユーザと日本語化を一気にやる。といってもubuntuパスワード設定と最後のタイムゾーン設定は対話になる。

毎回 lxc-create するのは面倒なので、lxc-createしたものをマスターにして、実際使うコンテナはlxc-cloneして使うようにする。それから、マスターにはopenssh-serverは入れないようにする。
入れちゃうとクローンしてもちゃんと動かない。MACアドレスが変わるので認証コードも変える必要があるが、作りなおさせるのも面倒なので、最初から入れない。

sshサーバーはクローンして入れる
#!/bin/bash
lxc-clone $1 $2
lxc-start -n $2
lxc-attach -n $2 -- apt-get update
lxc-attach -n $2 -- apt-get install openssh-server -y
何度もやるのは面倒なので、クローンしてsshを入れるところまでのスクリプトを書いておく。

lxdを動かすlxcコンテナのNesting設定
lxcコンテナのコンフィグファイルに以下の設定を追記する
# Nesting
lxc.mount.auto = cgroup
lxc.aa_profile = lxc-container-default-with-nesting
これで、lxcコンテナにlxdをインストールして普通にlxdコンテナを稼働させることができるようになる。
自分の理解では、lxcならば仮想の仮想になってもCPUコストはほとんど変わらない。ただしネットワークがブリッジのブリッジになるのでその分通信パフォーマンスは落ちるか。
この辺は仮想ネットワーク構成を工夫すれば改善できるんじゃないかな。

何でこんなことするかというと、ホストに直接lxdを入れても動くが、いざlxcを使おうと思ってもlxd用のlxcになっているらしく思うように使えなかったため。dnsmasqも変。なので一番思い通りに動くlxcを親にした。いずれ lxdの方が一般的になってくるだろうから、その時に再考する。

コンテナ上でdevstack動くかな?
性懲りもなくやってみたが、当然というべきなのか動かなかった。
/lib/modulesがなかったり、ebtablesでエラーになったり。。コンテナ自体がカーネルを持っていないからだろうね。独立したカーネル上で動くKVMベースだったら動かせるのかなあ。

録画環境のコンテナ移設は次回。

2015/09/16

devstackにlxdコンテナ組み込み やってみたが・・


先の記事では、Shuttle DS57Uというスモール環境にopenstackを構築してみた話を書きました。

インスタンスをkvmからlxdに切り替えてみたいと思って色々試したのですが、残念ながら最後のインスタンス作成で失敗します。
手順は間違っていないと思っているので、手順自体は記録しておこうと思って書きました。

lxd は、lxcとopenstack/novaを繋ぐハイパバイザーってことらしい。
nova-compute-lxd をdevstackに組み込めば良いだけ。
Introduction to nova-compute-lxd が全てを教えてくれています。

Ubuntu 15.04 vividをクリーンインストールする(opensshだけ入れる)

$ sudo apt-get update
$ sudo apt-get install ntp git -y
$ sudo apt-get upgrade -y

ネットワークを固定IPにして、ipv6をディスエーブルする。お好みで。



パスワード要求無しでsudo出来るスーパーユーザを作る

$ sudo adduser stack
「stack ALL=(ALL) NOPASSWD:ALL」 を /etc/sudoers に追記

以降は全てstackユーザでの操作

$ su - stack

最初にnova-compute-lxdを/opt/stackにクローンする
別の場所にすると適応時に面倒なので、素直にここに置く

$ git clone https://github.com/lxc/nova-compute-lxd /opt/stack/nova-compute-lxd
nova-compute-lxd/contrib/devstack/README.first に書かれている通りにdevstackをクローン

$ git clone https://github.com/openstack-dev/devstack /opt/stack/devstack

devstackに対してlxdの設定スクリプトを実行する

$ cd /opt/stack/nova-compute-lxd
$ contrib/devstack/prepare_devstack.sh

すると、/opt/stack/devstackに対して、さくっと色々やってくれます。

/opt/stack/devstack/localrcファイルが作られているので、そこに自分の設定を追記します。
VIRT_DRIVER=lxd
export NON_STANDARD_REQS=1

SERVICE_TOKEN=shuttle01
ADMIN_PASSWORD=admin
MYSQL_PASSWORD=$ADMIN_PASSWORD
RABBIT_PASSWORD=$ADMIN_PASSWORD
SERVICE_PASSWORD=$ADMIN_PASSWORD

LOGFILE=$DEST/logs/stack.sh.log
LOGDAYS=2
な感じ。FIXED_RANGEやFLOATING_RANGEやら追加してもいいでしょう。自分はデフォルトでいいのでこんなもんです。

devstackのインストール&開始

$ cd /opt/stack/devstack
$ ./stack.sh

lxc、lxd、その他諸々、この中で一気にインストールとセットアップが行われます。
30分ほど待つと、めでたく lxdがインテグレーションされたopenstackが稼働します。

しかし残念ながら今のところ、コンテナ起動が成功しません。



クラウドイメージの準備・やってみたものの・・


標準で入っている cirros イメージはlxdコンテナとしては起動できません。

$ wget -O vivid-server-cloudimg-amd64-root.tar.gz https://cloud-images.ubuntu.com/vivi/current/vivid-server-cloudimg-amd64-root.tar.gz

$ source /opt/stack/devstack/openrc
$ glance image-create --name='lxc' --container-format=bare --disk-format=raw < vivid-server-cloudimg-amd64-root.tar.gz

これでイメージが取り込まれます。
が、これを起動したんですが、残念ながら起動できませんでした。

No valid host was found. There are not enough hosts available

になってしまう・・・

nova-compute-lxd/contrib/images/convert-ubuntu-cloud-images.sh というのがあったので

$ sudo ./convert-ubuntu-cloud-images.sh ~/vivid-server-cloudimg-amd64-root.tar.gz ~/vivid-server-cloudimg-amd64-root2.tar.gz
$ glance image-create --name='lxc2' --container-format=bare --disk-format=raw < vivid-server-cloudimg-amd64-root2.tar.gz

でトライしてみましたが、結果は変わらず。

ログを見ると、n-condのでエラーが出ている。
ソースを軽く追いかけると、selected_hostsがない。もしくは見つけられない?状態らしい。
インスタンスが必要とするvCPUの数と用意されている数を比較して足りない場合エラーっていう
処理のところらしいけど。

イメージが同行という以前のところでコケている感じ。まあ、もう少し待って再トライです。

openstackをプアーに体感してみる

lxc使ってみていたら、仮想環境に興味が湧いてしまいまして、色々やってみました。

今まで作ったものをバックアップして、Ubuntu 15.04 (vivid) でOS入れ直し。
このバージョンから仮想化向けの機能が追加されたので、良いかなと思って。

仕事では普通にVMWareを使ってVM構築したり、サーバー立ち上げたりしているけれど、クライアントユーザとして使っているだけだったので、実はあまり仮想化を知らなかったりする。
おもちゃにして使っている Shuttle DS75U を仮想ホストにしてプライベートクラウドしたら、どうなってしまうんだろ?しかも1台だけで、、、という個人的興味でのアプローチです。

lxcが動いているので、CPUの仮想化支援機能は問題ない。動くはずだ。

まずは OpenStack Installation Guide for Ubuntu 14.04 を読んで見るものの・・・
ほー。それぞれのコンポーネント構成は何とか理解するものの、 これを手動でセットアップするのはほぼ不可能に近い。

ということで Ubuntu OpenStack Installer を試みる

嬉しいことに、このインストーラーで入れるとコンピュートノードはlxcで作られる構成にしてくれるらしい。

本格的な構成とシングルマシン用のインストーラーということらしいので Single Installer Guide を頼りに実行してみた。こには
って書いてあるが、見なかったことにしてインストールしてみた。ものすごい時間を要したが特に途中何の問題もなくインストールが完了した。

が、しかし、それぞれのコンポーネント用のインスタンスが8つぐらい稼働しようとする。かなり頑張っていたが、3つ目くらいのインスタンス起動の途中から先に進まなくなった。
それぞれのインスタンスのメモリ設定が4GBとか6GBとかになっていて、実メモリ4GBしかないDS75Uでは太刀打ちできなかった様だ。。。

DevStack を使って入れる

DevStackっていうのは最初からあるインストーラーで、開発者のテスト環境構築にも使われているようで、タイニーな環境でも動こうような構成で入れてくれるらしい。

Ubuntu15.04では途中でこけていたが・・・
実はこの記事を書く前に、やった時にはUbuntu15.04ではインストーラースクリプトが途中でこけてしまう問題があった。DevStack自体が15.04に対応していなかったため、rabibitmqのスタートアップ周りで不具合があったのだ。
やってみると確かに、この部分で失敗した。 問題の箇所に関するバグIssue https://bugs.launchpad.net/devstack/+bug/1449056 を追っていたら、つい最近解決したコミットが!ということでmasterブランチをプルし直して
All-In-One Single Machineに書いてあるとおりにやったら問題なく15.04でも成功した。 やほ~。

ほぼデフォルト状態でのセットアップなので、次は、仮想ノードタイプをkvmからlxcにしたり、ネットワーク周りをいじったりしてみようと思う。