はじめに
Kubernetesクラスターにおけるコンテナ基盤はkubeletプロセスによって動作していますが、kubeletにはファイルシステムが一定以上になるとガベージコレクションを行う機能が存在します。
本記事はコンテナイメージ領域の逼迫に伴い発動するイメージのエビクションについて説明しました。
環境情報
- Kubernetes 1.21
imageGCHighThresholdPercent
kubeletプロセスには起動時に読み込んでいる設定ファイルがあり(例えば/var/lib/kubelet/config.yaml)、そこにてkubeletにおけるパラメータ関連の値が管理されています。
その中にはclusterDNSのIPアドレスやhealthzPortなどが記載されており、他にもイメージを保管するファイルシステム(imagefs)に対する設定も記載されています。
apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration ... evictionSoft: ... imagefs.available: "10%" ... evictionSoftGracePeriod: ... imagefs.available: "10m" ... evictionHard: ... imagefs.available: "5%" ... imageGCHighThresholdPercent: 85 imageGCLowThresholdPercent: 80
そして、イメージのガーベッジコレクションは"imageGCHighThresholdPercent"という%表記の値にファイルシステムが抵触するとトリガーされます。
未使用イメージの削除処理
Kubernetesではイメージの領域が逼迫して上記の閾値を超えるとイメージ削除をkubeletが行います。そしてその削除処理の終了判定ですが、これはimageGCLowThresholdPercentに記載された条件を満たすまで最も利用されていないイメージから順番に削除されます。
imageGCManagerが動作するとkubeletのログ(kubelet.log)には
image_gc_manager.go:304] [imageGCManager]: Disk usage on image filesystem is at 86% which is over the high threshold (85%). Trying to free XX bytes down to the low threshold (80%).
と書き込まれ、記載されている条件であるファイルシステムが80%以下(imageGCLowThresholdPercentのデフォルトは80%)となるまでイメージの削除が繰り返されます。
終わりに
KubernetesではEviction Managerによってよしなに利用していないコンテナやイメージを削除してくれます。
リソースを急激に使い切るとコンテナの強制終了を引き起こしますが
ゆるやかな上昇に対してはkubeletが設定ファイルやデフォルト値に沿ってガーベッジコレクションをしてくれる点は覚えておきたいです。
以上、ご参考になれば幸いです。