Kubernetes and Cloud Native Associate 無料問題 2 / 10 ・ 分野1: Kubernetes Fundamentals
restartPolicy を指定していない Pod で、コンテナが終了コード 0 で正常に終わった。このコンテナはどうなるか。
- 正常終了なので再起動されず、Pod の phase は Succeeded になる
- 既定の Always が適用され、kubelet がコンテナを再起動する
- 既定は OnFailure なので、終了コードが 0 ならコンテナは止まったままになる
- Pod ごと削除され、コントローラが新しい Pod を作り直す
正解と解説を見る
正解: B
正解の理由
Pod のライフサイクルのページは、Pod の spec の restartPolicy は Always・OnFailure・Never のいずれかで、既定値は Always だと書いている。Always は、終了の仕方にかかわらずコンテナが終わるたびに自動で再起動する。したがって正常終了(終了コード 0)でも、kubelet がコンテナを再起動する。
違う選択肢
「正常終了なので再起動されず、Pod の phase は Succeeded になる」… 正常終了で再起動しないのは OnFailure か Never のときである。指定が無ければ既定の Always になり、再起動される。
「既定は OnFailure なので、終了コードが 0 ならコンテナは止まったままになる」… restartPolicy の既定値は Always である。OnFailure は、エラー(0 以外の終了コード)で終わったときにだけ再起動する設定である。
「Pod ごと削除され、コントローラが新しい Pod を作り直す」… Pod の中のコンテナが終わった場合、Kubernetes はその特定のコンテナの再起動を試みる。Pod を消して作り直すのは、ノードの故障のように回復できない失敗のときである。
押さえどころ
Always は Deployment などの常駐するアプリ向け、OnFailure と Never は Job のように完了させる処理向けである。再起動が続くと待ち時間が指数的に延び、kubectl では CrashLoopBackOff と表示される。