Kubernetesでログを見ようとしても"no space left on device"と言われる


Minikubeの話

仕事でMinikubeを使っている時の話。
ある時突然こんなメッセージが出てきました

$ kubectl log -f hogehoge-controller-xxx
failed to watch file "/var/log/pods/hogehoge/hogehoge-controller/1.log": no space left on device

状況としては複数のコンテナをいくつも立ち上げて、ログ祭りになってる様な環境でMinikubeなのでもちろんローカル環境
これを調べても英語しか出てこないので日本語でまとめておこうと思います。

Chk.1 本当にディスクの空き容量がない

調べませう

$ minikube ssh

からの

$ df
Filesystem     1K-blocks      Used Available Use% Mounted on
tmpfs            6344536    464280   5880256   8% /
devtmpfs         3454136         0   3454136   0% /dev
tmpfs            3524740         0   3524740   0% /dev/shm
tmpfs            3524740     34288   3490452   1% /run
tmpfs            3524740         0   3524740   0% /sys/fs/cgroup
tmpfs            3524740        12   3524728   1% /tmp
/dev/sda1       17784772  12684384   4060148  76% /mnt/sda1 <=ここが大事
/Users         488245288 148308708 339936580  31% /Users
$

<=ここが大事 としている「/mnt/sda1」の空き容量がDockerエンジンが使用するスペースの模様。
この例では80%未満なので余裕があります。よって、ディスク容量には問題はなく他の問題の様です。

仮にここが100%とか95%とかだったら本当にディスク容量が足りないので 自己責任 において

$ minikube ssh
$ docker system prune -a

などとしてクリーンアップしてあげてください。ただし、上記はバルス同等の破壊的クリーンアップなので大事なDockerImageがある場合は適時変えてください。

Chk.2 ディスク容量は足りているのにエラーになる

これが本稿の本題。
stackoverflow的な海外サーバーで話題に上がっていました。
https://serverfault.com/questions/963529/minikube-k8s-kubectl-failed-to-watch-file-no-space-left-on-device

何を言っているかというとfs.inotify.max_user_watches=ファイルシステム的にユーザが監視できるファイル数の上限
それがデフォルトで限りなく少なく設定されてるから問題が起きるんだよ! ということらしいです。

で、ここで回答されているのがどこまで正解なのかは不明なのですが、
成功するまで2倍づつ増やしながら試せ。 とのこと

本当かいな

fs.inotify.max_user_watchesを変更する

minikubeの中で操作します。

まず、今の設定を確認

$ minikube  ssh

...中略...

$ sysctl fs.inotify.max_user_watches
fs.inotify.max_user_watches = 8192

8192。。。少ない。。。のかもしれない笑
アプリ単体ではなくOSとしての監視数なのでなんともいえないですがこれを2倍に設定します。

アバウトに2倍 しても大丈夫です!(理由は後述)

sudo sysctl fs.inotify.max_user_watches=16000

この状態で一回試して、変わらない様だったらさらに2倍に。。。と言った具合で増やしてみてください。
これでもダメならもっと他の原因だと思われますが、私は遭遇していません

後述:アバウトに2倍とは

なぜアバウトに2倍にしてもいいのか。
それは、これが揮発性の設定だからです。

minikube stopとかしてしまうとリセットされてしまいます。
なのでローカル環境なのも相待って、おかしくなっちゃったらリセットしてきちんと設定すればいいのです。

厳密には2の乗数で設定した方が良いのでしょうが、そこに労力をかける意味は特にないと思います

終わり

私は最近あるプロダクトの開発を通してKubernetesやIstio、Docker、YAML等々のホットトピックに触れる機会が多くなっています。難しい、でも奥深くて面白い世界をみれていると思います。

数多くのOSSに支えられた次世代のシステム開発をQiitaの様なメディアを通してボチボチ流布してきますので、ぜひフォローしてみてください!