きっかけ
- knife-lxc を使っていてコンテナの IP アドレスが取得出来ない
- そもそもどうやって IP を取得しているんだろう
- ついでに私的な knife-lxc を作ってしまおうという算段
knife-lxc
- ざっくり言うと knife-lxc は Chef の補助ツールの一つ
- 動きとしては任意のコンテナを起動してから任意の cookbook を起動する等...
機能
とてもシンプル。
コマンド | 機能 | メモ |
---|---|---|
knife lxc server list |
コンテナの一覧を取得 | 一応、動く |
knife lxc server create |
コンテナを作成して run list に記載された cookbook を実行する | cucumber-chef の古いバージョンに依存していて動かない |
knife lxc server delete |
コンテナの削除 | 一応、動く |
インストールは gem で一発。
sudo gem install knife-lxc --no-ri --no-rdoc -V
いきなり、動かなかった
上記のメモにある通り cucumber-chef
の 1.0.4 までに含まれている handy
というモジュールに knife lxc server create
が依存している関係でインストール当初は動作しなかった為、knife lxc server create
の該当部分をコメントアウトして動作させた。
とりあえずは knife lxc server list
を試してみた。
IP を取得する為の試行錯誤
ようやく本題。
knife lxc server list
を試している過程でコンテナの IP が表示出来るのに表示されていなかったので調査をしてみた。
$ knife lxc server list Lxc containers list Name Ip centos-test1 centos1
knife lxc ではどうやっているのか?
knife lxc においてコンテナの IP アドレス取得はコンテナのコンフィグファイルから取得してきている。以下は lxc_server_list.rb"
の一部抜粋。
コンフィグファイルは環境によって異なる。尚、Debian wheezy の場合には /var/lib/lxc/コンテナ名/config
となるが、そもそも、IP アドレスを決め打ちで記載してはいないので IP の取得はこの方法では難しい。
dnsmasq.leases で取得する
ググると...こちらでは dnsmasq
のリリースした記録(/var/lib/misc/dnsmasq.leases
)を cat するのがシンプルでイイよって書かれていたので試してみた。
cat /var/lib/misc/dnsmasq.leases
を実行すると...
1374364571 de:33:db:24:0f:45 192.168.8.84 * *
おお、ちゃんと IP が...しかし、この場合コンテナとの関連付けをどのようにハンドリングするか悩ましいところ。さらに、こちらには、コンテナに対して任意のコマンドを投げることが出来る lxc-attach
というコマンドを使って you should be able to
とあったので lxc-attach
も試してみた。
lxc-attach は...orz
結論から言うと、lxc-attach
はカーネルの 3.8 以降で動作するらしく、それ以下の環境だと動作しないようで lxc 0.9.0~alpha3-2
ですら動作しないことを @ten_forward さんに教えて頂いた。
@inokara lxc-attach は kernel 3.8 以降しか動かないですねー :-)
— TenForward (@ten_forward) 2013, 7月 20
lxc-attach
の動作については @ten_forward さんのブログ記事が詳細に記載されていて解り易かった。記事にも書かれているように、カーネル 3.8 以下な環境(手元の Debian wheezy(3.2.0-4-amd64))
で lxc-attach すると、以下のようなエラーとなってしまう...
lxc-attach: No such file or directory - failed to open '/proc/14854/ns/pid' lxc-attach: failed to enter the namespace lxc-attach: No such file or directory - failed to open '/sys/fs/cgroup//lxc/lxc/centos1/tasks'
残念。ちなみに、カーネル 3.8 な Ubuntu 13.04 だと見事に動作することを確認している。
結局
現時点、現環境(カーネル 3.8 以下)でホスト側からコンテナの IP アドレスを取得する手段としては...
方法 | 課題 |
---|---|
コンテナのコンフィグに IP を決め打ち | コンテナを DHCP 環境で IP 取得させる場合にどうするか? |
dnsmasq.leases を確認する | IP とコンテナの関連付けをどうするか? |
しか無さそう...前途、多難。