コンテナ監視のなかみを調べた
はじめに
コンテナ監視ツールといえばcAdvisorがありますが、何をしているのでしょうか。
監視について全く知らなかった自分がコンテナのどこを監視しているか疑問に思ったので調べてみました。
参考にしたcAdvisorのレポジトリ
コンテナ監視とは
cgroup
コンテナ監視と言えば、使用されているメモリ、cpuの値を見たいですよね。
ではどこの値を見ているのでしょうか。
結論から言えば、下記の値を見ています。
/sys/fs/cgroup/cpuacct/docker/コンテナID/cpuacct.~
/sys/fs/cgroup/memory/docker/コンテナID/memory.~
...
docker以外にもコンテナを作る方法はあるのですが、ここではdockerに絞っていきます。
dockerはコンテナ作成時に/sys/fs/cgroup以下にdocker/コンテナIDのディレクトリを作り、
cpuやmemoryの情報は、/sys/fs/cgroup/cpuacct/docker/コンテナID/cpuacct.~だったりで見ることができます。
例としてdockerでredisコンテナを作成すると下記みたいな感じです。
$docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2a1c7e7f13ce 410a3afe446c "docker-entrypoint.s…" About a minute ago Up About a minute 6379/tcp tender_cerf
/sys/fs/cgroup/cpuacct/docker/2a1c7e7f13ceb03a1c86607e27b19b5d8bb6bc0d391f225a0fcac18e501e6013$ ls
cgroup.clone_children cpuacct.usage cpuacct.usage_percpu_sys cpuacct.usage_user
cgroup.procs cpuacct.usage_all cpuacct.usage_percpu_user notify_on_release
cpuacct.stat cpuacct.usage_percpu cpuacct.usage_sys tasks
参考
値を見る場所はわかりましたが、いちいちコンテナIDを指定してツールに値を取って来てもらうのは面倒です。
ツールが自動で作成済みのコンテナだったり、新規作成されたコンテナを取得して監視してほしいですよね。
作成済みのコンテナはツール起動時に/sys/fs/cgroup/cpuacct/docker/以下を探せばわかりそうですが、新規作成されたコンテナはどうするのかというとinotifyという仕組みを使います。
inotify
inotifyとはlinuxに備わっているファイル監視の仕組みです。
ファイルを関した場合はファイルの変更を、
ディレクトリを監視した場合はディレクトリ直下のみの変更を監視します。
試しにtestディレクトリを作って監視してみます。
二つタブを開いて監視する側をタブ1,いろいろ操作する側をタブ2とします。
タブ1
~/test$ inotifywait ./
Setting up watches.
Watches established.
タブ2
~/test$ touch sample.txt
タブ1
~/test$
./ CREATE sample.txt
タブ2
~/test$ rm sample.txt
タブ1
~/test$
./ DELETE sample.txt
上記のようにファイル作成時にはCREATEが、削除時にはDELETEがinotifyによって通知されます。
参考
さて、ここでコンテナ作成時に
/sys/fs/cgroup/cpuacct/docker/コンテナIDが作成されることを思い出すと、
/sys/fs/cgroup/cpuacct/dockerディレクトリを監視すれば新たに作成したコンテナをツールで発見できそうですね。
上記ではdockerコンテナに限りましたが、cAdvisorではcrioなど他のコンテナも発見できるようになっています。
おわりに
cgroupの作成とコンテナの作成を紐づける発想がなかったのでいい学びとなりました。
学びついでに、おもちゃコンテナ監視ツールを作ってみました。
dockerだけとはいえちゃんとコンテナの値を監視できるようになっています。
ただ監視自体については理解が薄いので入門監視だったり読まなければいけなさそう...
Discussion