ノードのストレージが足りなくなるのカバー画像
ノードのストレージが足りなくなる
2023/6/23
このエントリーをはてなブックマークに追加

ある日男はk8sクラスタを用意しました。

よし、これから運用していくぞ!そう意気込んでいました。
しかししばらくすると EvictedContainerStatusUnknown, Error になって落ち、再起動を繰り返すpodが目立ってきました。

こわいなあ~こわいな~と思って describe してみると

Warning FailedScheduling 45m default-scheduler 0/3 nodes are available: 3 node(s) had untolerated taint {node.kubernetes.io/disk-pressure: }. preemption: 0/3 nodes are available: 3 Preemption is not helpful for scheduling.

って出てるんですね。
image は kubelet が掃除してくれるはずだし、永続化したい容量が増えそうなディレクトリはボリュームマウントしてNFSで別のノードに置いてるのでディスク容量が足りなくなっていく。なんてことは無いはずなんですよね。

おかしいなあ~おかしいな~って思って恐る恐る
du -h -d 3 /
ってすると /var/lib/docker がほとんど食い尽くしているんですよ。

やだなあやだなあって思いながら /var/lib/docker の中で再度どこがディスク食ってるのかなってみてみると
overlay2containers ってディレクトリがかなり容量を食ってるんですね。

overlay2 の方は docker system prune -a で消せるものを消してこれ以上消せないぽいので仕方ないなあって思って見過ごすことにしたんですが、containers さんの方は全然認知していなかったんですよね。

そこで調べてみるとこちらの方、コンテナの stderrstdout を全部記録していらっしゃると。
これはいけない。とひとまず今あるログを truncate -s 0 */*.log で奇麗にお掃除しました。

するとこれまで再起動をしていたpodの再起動がパタッと止まり、正常に動き始めるではありませんか。

これで一件落着と思いきや、このままではまたしばらくすると再発してしまうのでログのローテートを入れておきましょう。
/etc/docker/daemon.json

{
        "log-driver": "json-file",
        "log-opts": {
                "max-size": "500m",
                "max-file": "10"
        }
}

これを置いた後お祓いの呪文を唱えればおそらく今回の問題は解決することでしょう。
時間をおいてログが単調増加していないことを確認する必要はありますが。

systemctl daemon-reload
systemctl restart docker
ノードのストレージが足りなくなる - ねこの部屋