インフラ作業支援ラボInfra Support Lab ← ガイド一覧← 戻る

KubernetesでCrashLoopBackOffになる原因と確認手順|ログ・OOMKilled

CrashLoopBackOffはコンテナの再起動が繰り返し失敗しているときの表示です。直前の失敗ログと終了理由を先に記録して、OOM・アプリ設定・probeを切り分けます。

この記事の目的

CrashLoopBackOffという結果ではなく、コンテナプロセスが終了した原因と再起動の仕組みを調べます。

最初にやること

kubectl describe podでLast StateとEventsを確認し、kubectl logs --previousで前回終了ログを取得します。

注意:ログを保存する前にPod削除やrollout restartを繰り返すと、調査に必要な情報が失われる場合があります。app・APP・POD_NAME・CONTAINER_NAMEは例です。context・namespace・権限を実環境で確認してください。

1. CrashLoopBackOffは原因名ではない

CrashLoopBackOffはコンテナの失敗・再起動を繰り返す際の待機状態です。Podのphaseとは異なり、アプリ設定・権限・プロセス終了、probe失敗、メモリ不足など複数の原因があり得ます。

2. describeと前回ログ

kubectl config current-context kubectl get pods -n app kubectl describe pod POD_NAME -n app kubectl logs POD_NAME -n app -c CONTAINER_NAME --previous --tail=150 kubectl logs POD_NAME -n app -c CONTAINER_NAME --tail=150

複数コンテナの場合は-cで対象を指定します。前回コンテナのログが保持されていなければ、--previousが失敗しても正常とは限りません。

3. 終了理由を分類する

表示・状況確認すること
OOMKilledメモリlimits、実際の使用量、Node資源、直前のエラーログ
Exit Code 1等アプリ起動設定・引数・環境変数・Secretsの参照
Exit Code 137SIGKILL等。OOMKilledやNode状態と組み合わせて判断
Liveness probe failed起動後の生存確認、port・path・timeout・閾値
Startup probe failed起動時間・初期化処理とprobeの猶予設定
注意:readiness probeの失敗だけでコンテナが再起動されるわけではありません。liveness・startupと役割が違います。

4. PodとDeploymentの設定を見る

kubectl get pod POD_NAME -n app -o yaml kubectl get deployments -n app kubectl get events -n app --sort-by=.metadata.creationTimestamp

PodがDeploymentで管理されているなら、更新履歴とPodのテンプレートを確認します。describeのEventsは保持期間や集約に制限があります。Secretsの中身を公開チケットへ貼らないでください。

5. 終了理由別の対処と切り戻し条件

想定例(実機結果ではありません):EventsにBack-off restarting failed containerと出ても、これは再起動待機を示すだけです。Last State、終了コード、直前ログ、probe失敗イベントと変更履歴から原因を判断します。

# 参照のみ:直前の終了理由とイベント kubectl describe pod POD_NAME -n app kubectl logs POD_NAME -n app -c CONTAINER_NAME --previous --tail=150 kubectl get deployment APP -n app -o yaml kubectl get events -n app --sort-by=.metadata.creationTimestamp
確認結果次の具体的な対応
OOMKilled / 終了コード137メモリlimit、Node割当量、監視値、直前ログを突合。137だけではOOMと断定しない。リーク・一時負荷・設定不備を特定後、管理元で適切なリソース変更やアプリ修正を計画
終了コード1、Errorと設定読込エラーコンテナの起動引数、必須環境変数、ConfigMap/Secret参照キー、アプリ権限、外部依存先を確認。ログに秘密を貼らず、管理元の設定を修正
Liveness probe failed実際のlisten port、path、応答時間と閾値を比較。アプリ障害なのかprobe定義不一致なのか切り分け、監視を単に無効化しない
Startup probe failed初期化処理の所要時間・失敗ログを調査。原因が遅延なら起動猶予設定、アプリの異常ならアプリ側の修正を検討
Readiness probe failedのみReadyではない原因を確認。readiness失敗だけでは再起動しないため、別の終了理由・liveness/startupも調査

変更前の条件:Deploymentの管理元、対象context・Namespace、変更前revision、停止影響・レプリカ数、依存サービスを確保し、変更承認後に修正します。原因が直近のPodテンプレート変更ならDeploymentの更新・切り戻しで旧revisionの利用可否とデータ互換性を確認してください。SecretやDB変更はrollout undoでは戻りません。

復旧判定:新PodがReady、同条件で再起動が続かず、アプリのログ・Health・業務通信が正常であることを確認。解決しない場合はNode状態・kubelet/コンテナランタイムの管理者調査へ、発生時刻とEvents・変更差分を引き継ぎます。Kubernetes公式 — 各probeの役割。

6. その場しのぎの再起動を避ける

危険:原因が不明なままkubectl delete podやkubectl rollout restartを繰り返さないでください。再起動してもアプリ設定やprobeの問題が残れば再発します。

変更が必要ならDeploymentの安全な更新と切り戻しで変更管理・確認手順を参照します。

7. 復旧後の確認

kubectl get pods -n app -o wide kubectl describe pod POD_NAME -n app kubectl logs POD_NAME -n app -c CONTAINER_NAME --tail=100

再起動回数、Ready、アプリのヘルスチェックと通信を確認します。Pod名が変わった場合は対象を新しいPodに切り替えます。

公式・一次資料

関連手順を確認する

参照操作・変更操作・削除操作を区別し、作業前後に対象と正常性を記録します。

関連ガイドへ