koukiblog

たぶんweb系の話題

PreemptibleVMを利用しているGKEクラスタで "shutdown"ステータスのPodが残るようになった

PreemptibleVMを利用しているGKEクラスタで去年の夏ぐらいからshutdownステータスのPodが残るようになっていました。 ノードがシャットダウンの影響を受けたPodなんだろうなと思いつつ、調べる時間は取れてなかったので改めて時間をとって調べたのでその結果を残しておきます。

原因

KubernetesにGracefulNodeShutdownという機能が追加されており、この影響です。

https://kubernetes.io/blog/2021/04/21/graceful-node-shutdown-beta/

GKEでは、1.20.5 以降で有効化されています

https://cloud.google.com/kubernetes-engine/docs/release-notes#May_03_2021

1.20.5 以前では、PreemptibeVMがシャットダウンされた場合Podがそのまま削除されていたが、GracefulNodeShutdown機能が追加されたことにより、一定の猶予時間内にevictされるようになり、evictされたPodはshutdownステータスで残るようになる、ということのようです。

リリースされたのが2021/5/3なので、去年の夏頃から仕様が変わったという体感ともあっています。

shutdown Podへの対応

ガベージコレクション( https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#pod-garbage-collection ) されるまではずっと残ります。 この閾値は、GKEユーザーからは変更することができないようです。かつそのデフォルト値は12500と非常に大きいです。 https://issuetracker.google.com/issues/172663707?pli=1

削除する場合、kubectl コマンドでまとめて削除することができます。GKEのドキュメント内にも記載があります。

1.21.3 以前:

kubectl get pods --all-namespaces | grep -i shutdown | awk '{print $1, $2}' | xargs -n2 kubectl delete pod -n

1.21.3 以降:

kubectl get pods --all-namespaces | grep -i NodeShutdown | awk '{print $1, $2}' | xargs -n2 kubectl delete pod -n
kubectl get pods --all-namespaces | grep -i Terminated | awk '{print $1, $2}' | xargs -n2 kubectl delete pod -n

https://cloud.google.com/kubernetes-engine/docs/how-to/preemptible-vms#graceful-shutdown

参考URL

https://stackoverflow.com/questions/68687716/k8s-pods-stuck-in-failed-shutdown-state-after-preemption-gke-v1-20