KubernetesのPodがTerminatingの状態でハングしていてPodが消えない場合にどうやってトラブルシューティングするかまとめてみました。
PodがTerminatingのままになっている
状況として、Deploymentなどをアップデートやリスタートしたときに一部のPodが以下のようにTerminating
の状態で止まりPodが削除されないことがあります。
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
my-pod-2 1/1 Running 0 15h8m 10.100.2.4 myk8snode2 <none> <none>
my-pod-3 1/1 Running 0 15h9m 10.100.6.0 myk8snode3 <none> <none>
my-pod-kep-0 0/1 Terminating 0 1h 10.100.2.8 myk8snode1 <none> <none>
my-pod-kep-1 1/1 Running 0 6h4m 10.100.5.13 myk8snode2 <none> <none>
ファイナライザー(Finalizers)の確認
ファイナライザーをリソースで使用している場合は、それが理由で削除ができないのか確認する必要があります。ファイナライザーは理由があって使用されているはずなので、Podを削除するためだけにファイナライザーをなくすのは解決法とは言えないと思われます。
強制削除
ベストの方法ではありませんが、とりあえずPodの削除を進めてデプロイなどを継続したり、サービスの継続をするために一時的な解決方法として強制削除もできます。
kubectl -n <NAMESPACE> delete pod <PODNAME> --grace-period=0 --force
kubeletからの確認を待たずに強制的に削除するので、Podのプロセスが完全になくならなかったりほかのリソースとの競合などが起こりえます。一時的には有効ですが、これを常に行っている場合は原因を追究する必要があります。
kubeletログの確認
kubeletのログを見ることによって原因を見つけられるかもしれません。
apiVersion: v1
kind: Pod
metadata:
name: nsenter
namespace: nsenter
spec:
hostPID: true
hostNetwork: true
hostIPC: true
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- myk8snode1
containers:
- name: nsenter
image: ubuntu
command: ['tail', '-f', '/dev/null']
securityContext:
privileged: true
管理者権限などが付いたPodです。nodeAffinity
でログを確認する必要があるノードを指定してデプロイします。
トラブルシューティング以外の時は使わないほうがいいと思います。
デプロイしたPodにexecします。
kubectl -n nsenter exec -it nsenter -- nsenter --target 1 --mount --uts --ipc --net /bin/bash
これで、Podnsenter
からmyk8snode1
内のログを見ることができます。
journalctl -u kubelet
とするとkubeletのログを確認し、原因を探ることができるかもしれません。