はじめに
私は自宅サーバーで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 microk8s
、 sudo snap start microk8s
でMicroK8sのプロセスを再起動し、設定を反映させます。
おわりに
設定後無事にガベージコレクションが実行され、以下の画像のようにディスク使用率が減少していました。
Image may be NSFW.
Clik here to view.
今回、設定値を適切に変更できたので、クラスターはしばらく放置しても大丈夫そうです。