(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【Kubernetes】imageGCManagerによってイメージの削除が行われる流れ

スポンサーリンク

はじめに

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が設定ファイルやデフォルト値に沿ってガーベッジコレクションをしてくれる点は覚えておきたいです。

以上、ご参考になれば幸いです。