今のお仕事は「お試しでいいから○○が動くクラスタを作って」みたいな話をぽこぽこいただいて作業をする感じなのですが、数台~十数台程度の小さな規模のクラスタ用途としてはMuninが手間がかからずいいのかなと思っているわけです。
で、クラスタを作ると、そのたびにDockerでMunin masterコンテナを作って動かしていたのですが、設定ファイルが異なる、パッケージのバージョンが異なるなど色々なバージョンのMunin masterができてしまって、管理するのが面倒になるというパターンに。そんな中でひとつやり方を見いだせた感じがするのでメモ。
使い方
Dockerfileは https://github.com/yacchin1205/docker-munin とか https://registry.hub.docker.com/u/yacchin1205/docker-munin/ を参照。Docker Hubでビルドずみ。
以下のような構成のmunin masterをポート8081で起動する場合の例。
- 監視対象サーバ
- node1.testcluster 192.168.11.5
- node2.testcluster 192.168.11.6
$ sudo docker pull yacchin1205/docker-munin
$ sudo docker run -d -p 8081:80 -e NODES="node1.testcluster:192.168.11.5 node2.testcluster:192.168.11.6" -v /etc/localtime:/etc/localtime:ro -v /home/yacchin1205/data/munin:/var/lib/munin yacchin1205/docker-munin
このあと数分後(Munin masterのUpdateが走ったのち)、 http://ホストのIP:8081/ にブラウザでアクセスすると、Munin masterの画面を確認することができる。
なお、コンテナの/var/lib/muninに対応づけたホストの/home/yacchin1205/data/muninに対しては、コンテナ内でmuninユーザから書き込まれることになるので、パーミッションを適切に設定することを忘れないようにする。
考え方
Immutable Infrastructure的な構成をどう実現するかという中で、設定をどうパラメータ化するかという点が考えどころ。いろいろアプローチはあるようだけれども、今回は以下のようにしてみた。
環境変数(-e)を使う
Fork元の https://github.com/arcus-io/docker-munin を見てああなるほどと思ったのが、ノード一覧を環境変数NODESで渡させて、これをコンテナ起動時に /etc/munin/munin.conf に定義として書き出しているところ。
コンテナ中に用途固有の設定が記述されると、用途ごとにコンテナが増えてしまい、メンテナンスのコストが上がるのが悩みどころだったので、用途により変化する部分は環境変数で渡せるようにするというのは一つの解かなと。
たとえば今回の例では、ノードが増えても、既存コンテナをつぶしてNODES変数に渡すセットを増やしたうえで新規コンテナを作ればマシン一覧を増やすことができる(データはホスト側のディレクトリに維持されるので)。ベースとなるコンテナが更新された場合なども、環境変数とデータのディレクトリ設定を同じように与えてあげれば、更新前と同じ設定をもったサービスを再起動することができる。(バージョン間でデータに互換性があることが前提になるが)
Shared Filesystems(-v)をReadOnlyで使う
コンテナを作ってよくやらかすのが「TimeZoneがJSTじゃないじゃん」。これは-vオプションで、ホストの/etc/localtimeをコンテナの/etc/localtimeとしてReadOnlyで見せてあげることで対応。こうすればコンテナに環境固有の設定が記述されることを防げる。
-vは、コンテナ内(だけ)にデータを持たせないためにも使えるし、イメージにない情報をコンテナに与えるのにも使えるのだなあ、と。
まとめ
コンテナをぽこぽこ作っていると亜種みたいなのが山ほどできてきて、どこかで汎化というか、パラメータ化して共通化みたいなことをやって管理の手間を減らしたくなってくる。こんなときのコンテナとホストのインタフェースとして、環境変数、ReadOnlyでShared Filesystemsが活用できそう。
あと、DockerでよくハマるのがJVMのメモリサイズのような、プロセスに対してリソース量を教えてあげなければならないようなシチュエーション。これについても何かやり方を見出したい・・・