MicroK8sを動かしているサーバーのディスク容量枯渇への対処

はじめに

私は自宅サーバーでMicroK8sでKubernetesクラスターを構築して運用しているのですが、先日ディスクの空きが減っているというアラートが出ていました。
不要なデータを削除するようにして復旧させたので、その手順などを書いておこうと思います。

原因の調査

VM内を調べたところ、 /var/snap/microk8s/common/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots というディレクトリが数十GBのサイズになっていることが分かりました。
このディレクトリにはコンテナのイメージデータが入っているらしく、 microk8s ctr image ls コマンドでVM内にあるイメージを一覧表示させたところ、大量のイメージが保存されていることが分かりました。
ただ、イメージの殆どは古いバージョンのイメージなど、すでに使っていないものがほとんどでした。
もし必要になったらpullすればいいだけなので、不要なイメージデータは削除することにしました。

対処

Dockerであれば docker image prune コマンドで不要なイメージの掃除ができますが、MicroK8sには同様のコマンドはありません。
このようなツールが見つかりましたが、できればMicroK8sやKubernetesの標準の機能で対処したいと思い、なにか良い方法はないか調べたところ、Kubernetesにはイメージのガベージコレクションの機能があることが分かりました。
kubernetes.io

ドキュメントによれば、ディスクの使用率が HighThresholdPercent を超えるとガベージコレクションの処理が実行され、 LowThresholdPercent の値を下回るまで古いイメージを削除していくようです。そして、 HighThresholdPercent のデフォルト値は85%とのことでした。
私の環境では、アラート通知のしきい値を80%に設定していたため、ガベージコレクションが実行される前にアラートが出ていたようです。
今回は、 HighThresholdPercent の値をアラートのしきい値未満である70%に設定することにしました。

以下のGitHub上のコメントによると、MicroK8sでは /var/snap/microk8s/current/args/kubelet というファイルでkubeletのコマンドライン引数を設定しており、このファイルにパラメータを追記すれば良さそうです。
github.com
今回は、以下の設定を追記しました。

--image-gc-high-threshold=70
--image-gc-low-threshold=50

ディスクの使用率が70%を超えたらガベージコレクションを実行し、ディスク使用率が50%以下になるまで古いイメージを削除するようにしています。
追記後は、 sudo snap stop microk8ssudo snap start microk8s でMicroK8sのプロセスを再起動し、設定を反映させます。

おわりに

設定後無事にガベージコレクションが実行され、以下の画像のようにディスク使用率が減少していました。

今回、設定値を適切に変更できたので、クラスターはしばらく放置しても大丈夫そうです。