免責事項:これは英文の記事「Inaccurate Container Status Reported By Containerd in vSphere Supervisor Workload Cluster 」の日本語訳です。記事はベストエフォートで翻訳を進めているため、ローカライズ化コンテンツは最新情報ではない可能性があります。最新情報は英語版の記事で参照してください。
vSphere Supervisor ワークロードクラスターのノード上でコンテナを確認した際、実際には当該ノード上に基盤となるプロセスが存在しないにもかかわらず、containerd がコンテナの状態を「Running」と誤って報告する事象が発生します。
この影響により、Kubernetes がコンテナの停止を正しく認識できず、ノードが Deleting 状態、または cordon 状態(SchedulingDisabled)のまま停止してしまう場合があります。
ワークロードクラスターのコンテキストにおいて、以下のいずれか、または複数の症状が確認されます:
kubectl get pods -n <pod namespace> -o wide
kubectl get nodes
Pod およびそのコンテナが稼働しているノードに直接 SSH 接続した場合:
crictl ps
journalctl -xeu containerd
MON DD HH:MM:SS <node name> containerd[988]: time="MON DD HH:MM:SS.ssssssZ" level=info msg="StopPodSandbox for \"<container ID>\""
MON DD HH:MM:SS <node name> containerd[988]: time="MON DD HH:MM:SS.ssssssZ" level=error msg="StopPodSandbox for \"<container ID>\" failed" error="rpc error: code = DeadlineExceeded desc = failed to stop container \"<container ID>\": an error occurs during waiting for container \"<container ID>\" to be killed: wait container \"<container ID>\": context deadline exceeded"
vSphere Supervisor
vSphere Kubernetes Release (VKR) v1.30.1 or v1.29.4
Containerd v1.6.31
本事象は、containerd における Exit プローブと Exec プローブの間で発生するレースコンディションが原因です。
参考情報:Containerd v1.6.29 にて導入された以下の Issue および Pull Request をご参照ください。
https://github.com/containerd/containerd/issues/10589
https://github.com/containerd/containerd/pull/9927
containerd 上ではコンテナが Running 状態として表示されますが、実際には当該ノード上に該当するプロセスは存在しません。
本問題は、containerd v1.6.31 を使用している以下の vSphere Kubernetes Releases(VKR)で確認されています:
本問題は Containerd v1.6.36 にて修正されています: https://github.com/containerd/containerd/pull/10676
Containerd v1.6.36 以降を使用している VKR では、本問題は発生しません。
該当するワークロードクラスターを、より新しい VKR バージョンへアップグレードしてください。
VKR に含まれる containerd のバージョンについては、以下の VKR リリースノートをご参照ください:
影響を受けているノード上で containerd を直接再起動することで、ノード上のすべてのコンテナ状態が正しく更新されます:
systemctl restart containerd