ようへいの日々精進XP

よかろうもん

LXC コンテナの IP アドレスを取得する(出来てないけど)

きっかけ

  • 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-chef1.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 さんに教えて頂いた。

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 とコンテナの関連付けをどうするか?

しか無さそう...前途、多難。

参考