ある日男はk8sクラスタを用意しました。
よし、これから運用していくぞ!そう意気込んでいました。
しかししばらくすると Evicted
や ContainerStatusUnknown
, 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
の中で再度どこがディスク食ってるのかなってみてみると
overlay2
と containers
ってディレクトリがかなり容量を食ってるんですね。
overlay2
の方は docker system prune -a
で消せるものを消してこれ以上消せないぽいので仕方ないなあって思って見過ごすことにしたんですが、containers
さんの方は全然認知していなかったんですよね。
そこで調べてみるとこちらの方、コンテナの stderr
と stdout
を全部記録していらっしゃると。
これはいけない。とひとまず今あるログを 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