🔎

コンテナ監視のなかみを調べた

2023/01/13に公開

はじめに

コンテナ監視ツールといえばcAdvisorがありますが、何をしているのでしょうか。
監視について全く知らなかった自分がコンテナのどこを監視しているか疑問に思ったので調べてみました。

参考にしたcAdvisorのレポジトリ
https://github.com/google/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

参考
https://www.datadoghq.com/ja/blog/how-to-collect-docker-metrics/

値を見る場所はわかりましたが、いちいちコンテナ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によって通知されます。

参考
https://qiita.com/stc1988/items/464410382f8425681c20

さて、ここでコンテナ作成時に
/sys/fs/cgroup/cpuacct/docker/コンテナIDが作成されることを思い出すと、
/sys/fs/cgroup/cpuacct/dockerディレクトリを監視すれば新たに作成したコンテナをツールで発見できそうですね。

上記ではdockerコンテナに限りましたが、cAdvisorではcrioなど他のコンテナも発見できるようになっています。

おわりに

cgroupの作成とコンテナの作成を紐づける発想がなかったのでいい学びとなりました。
学びついでに、おもちゃコンテナ監視ツールを作ってみました。
dockerだけとはいえちゃんとコンテナの値を監視できるようになっています。
https://github.com/stone-like/toyAdvisor

ただ監視自体については理解が薄いので入門監視だったり読まなければいけなさそう...

Discussion