ポッドの一部がkubernetesによって削除されたのを見たところです。彼らはどうなりますか?そのようにぶらぶらしているだけですか、それとも手動で削除する必要がありますか?
ポッドの一部がkubernetesによって削除されたのを見たところです。彼らはどうなりますか?そのようにぶらぶらしているだけですか、それとも手動で削除する必要がありますか?
DiskPressure
使用して見つけることができます)kubectl describe pods my-pod-name --namespace prod
回答:
私が使用する簡単な回避策は、インシデント後にすべての削除されたポッドを手動で削除することです。次のコマンドを使用できます。
kubectl get pods --all-namespaces -o json | jq '.items[] | select(.status.reason!=null) | select(.status.reason | contains("Evicted")) | "kubectl delete pods \(.metadata.name) -n \(.metadata.namespace)"' | xargs -n 1 bash -c
-a
です。引数が無効です。
名前空間で失敗状態のポッドを削除するには default
kubectl -n default delete pods --field-selector=status.phase=Failed
status.phase=Evicted
。私はなんとかこれを行うことができましたkubectl -n default delete pods --field-selector=status.phase!=Running
。しかし、注意してください、これはすべてのものを削除します
kubectl -n default get pods --field-selector=status.phase=Failed
最初に実行すると便利だと思います。
Evicted
私のためにポッドを取り除きます。
削除されたポッドは手動で削除する必要があります。次のコマンドを使用して、Error
状態のすべてのポッドを削除できます。
kubectl get pods --all-namespaces --field-selector 'status.phase==Failed' -o json | kubectl delete -f -
ソフトまたはハードのエビクションしきい値が満たされているかどうかに応じて、ポッド内のコンテナは猶予期間の有無にかかわらず終了し、PodPhase
としてマークされFailed
、ポッドが削除されます。アプリケーションがデプロイなどの一部として実行されている場合、Kubernetesによって作成およびスケジュールされた別のポッドがあります。おそらく別のノードでエビクションのしきい値を超えていません。
エビクションは必ずしもしきい値によって引き起こされる必要はありませんが、ノードkubectl drain
を空にするために呼び出すことも、KubernetesAPIを介して手動で呼び出すこともできることに注意してください。
kubectl get pods -n mynamespace
kubectl describe pod <pod>
言うの?
kubectl describe
「ステータス:失敗理由:削除されたメッセージ:ポッドノードのリソースが不足しています:[MemoryPressure]」と表示されます。
Kube-controller-manager
デフォルトでは、K8sがインストールされています。GCが開始される前のデフォルトは最大12500の終了ポッドであるようです。
K8sドキュメントから直接:https://kubernetes.io/docs/reference/command-line-tools-reference/kube-controller-manager/#kube-controller-manager
--terinated-pod-gc-threshold int32デフォルト:12500
終了したポッドガベージコレクタが終了したポッドの削除を開始する前に存在できる終了したポッドの数。<= 0の場合、終了したポッドガベージコレクタは無効になります。
kubectl edit pod kube-controller-manager-<master_name> -n kube-system
したい場合はpod is invalid
、設定ファイルを保存した後にエラーが発生します。
誰かがすべての名前空間のすべての削除されたポッドを自動的に削除したい場合に備えて:
Foreach( $x in (kubectl get po --all-namespaces --field-selector=status.phase=Failed --no-headers -o custom-columns=:metadata.name)) {kubectl delete po $x --all-namespaces }
kubectl get po --all-namespaces --field-selector=status.phase=Failed --no-headers -o custom-columns=:metadata.name | xargs kubectl delete po --all-namespaces
すべてのEvicted
ポッドを強制的に削除するには、次の1行のコマンドを試すことができます。
$ kubectl get pod -A | sed -nr '/Evicted/s/(^\S+)\s+(\S+).*/kubectl -n \1 delete pod \2 --force --grace-period=0/e'
ヒント:代わりp
にs
コマンドの修飾子を使用すると、実際のコマンドが出力されて削除ジョブが実行されます。sed
e
$ kubectl get pod -A | sed -nr '/Evicted/s/(^\S+)\s+(\S+).*/kubectl -n \1 delete pod \2 --force --grace-period=0/p'
しきい値をハードコーディングする方法の「公式」ガイドは次のとおりです(削除されたポッドをあまり多く表示したくない場合):kube-controll-manager
しかし、既知の問題は、kube-controll-managerをインストールする方法です...
まだ別の方法awk
。
私を夢中にさせる可能性のある人為的エラー(望ましいポッドの削除)を防ぐために、get pods
コマンドの結果の前にチェックします:
kubectl -n my-ns get pods --no-headers --field-selector=status.phase=Failed
それがよさそうなら、ここに行きます:
kubectl -n my-ns get pods --no-headers --field-selector=status.phase=Failed | \
awk '{system("kubectl -n my-ns delete pods " $1)}'
以下のコマンドは、デフォルトの名前空間からすべての削除されたポッドを取得し、それらを削除します
kubectl get pods | grep Evicted | awk '{print$1}' | xargs -I {} kubectl delete pods/{}
Evicted
13日間状態になっているポッドを持っています。削除されたポッドが削除されないようです(または、単なるバグである可能性があります)。