TL;DR
手法1. CrontabにEvictedのPodを削除するコマンドを追加する。
crontabにEvictedのpodを一括削除するコマンドを登録する。
$ crontab e
インタラクティブモードになるので下記の行を追加する。1分間に1回、default namespaceに属するEvictedのPodを一括削除する。
* * * * * /usr/bin/kubectl get pod -n default | grep Evicted | awk '{print $1}' | xargs kubectl delete pod -n default
手法2. kube-controller-managerにステータスがterminatedになっているPodを削除する設定を追加する。
sudo su -
vi /etc/kubernetes/manifests/kube-controller-manager.yaml
インタラクティブモードになるのでspec.containers.commandに下記を追加する。
- --terminated-pod-gc-threshold=1
目的
Kubernetes上でPodを起動しているとメモリ不足やディスク容量の問題で、PodがEvictedの状態になり大量に溜まってしまう現象がたまにあります。このEvictedのPodを一括で消すコマンドがQiitaの記事に紹介はされていましたが、自動的に消したくなったので今回検証しました。
検証環境
下記の環境で検証しました。
OS: Ubuntu 18.04
kubernetes v1.18.4
kubernetesのセットアップはkubeadmを用いました。
手法1 CrontabにEvictedのPodを削除するコマンドを追加する。
一番直感的にわかりやすい方法です。KuberntesのEvictedのPodを一括削除するワンライナーをcrontabに登録します。詳しくはcrontabの設定方法をネットで調べてもらいたいのですが、実行頻度も定義することができます。Evictedは秒単位で発生するような頻繁な事象ではないため、十分これで対応できると思います。
手順
下記のコマンドでcrontabに設定を追加します。ubuntuのユーザーはkubernetesをインストールした時のユーザーで実行して下さい。
$ crontab e
インタラクティブモードになるので下記の行を追加する。1分間に1回、default namespaceに属するEvictedのPodを一括削除する。
* * * * * /usr/bin/kubectl get pod -n default | grep Evicted | awk '{print $1}'
手法2 kube-controller-managerにステータスがterminatedになっているPodを削除する設定を追加する。
kube-controller-managerのコマンドにオプションを追加することで、PodやコンテナイメージのGarbage Collection機能を設定することができます。詳しくはKubernetesのドキュメントを参照してください。
手順
私はkubeadmでkubernetesをインストールしたので、kube-contoller-managerのマニフェストファイルに設定を追加する方法で行いました。
terminated-pod-gc-thresholdという設定を追加するのですが、ここに閾値を設定することでterminatedとなったコンテナの数が閾値より大きくならないようにkube-controller-managerが削除します。(デフォルト値は12500となっており機能するタイミングはほとんどありません。)
今回は閾値を1に設定しているので、terminated状態のPodが1より増えないように設定しています。
sudo su -
vi /etc/kubernetes/manifests/kube-controller-manager.yaml
インタラクティブモードになるのでspec.containers.commandに下記を追加する。
- --terminated-pod-gc-threshold=1