Kubernetes CrashLoopBackOffの修正:トラブルシューティングガイド

intermediate☸️ Kubernetes2026-03-16| Kubernetesクラスター(全バージョン、例:v1.20+)、Docker/containerdランタイム、ノードのLinux OS。

Error Message

CrashLoopBackOff

TL;DR: CrashLoopBackOffの迅速な修正

CrashLoopBackOffに遭遇しましたか?これは、コンテナのエントリーポイントコマンドの失敗、アプリケーションの起動直後のクラッシュ、または重要な依存関係の欠如など、いくつかの一般的な問題に起因することがよくあります。最初に確認すべき点は次のとおりです。

  • ログを確認する: kubectl logs <pod-name> -c <container-name> を使用して、何が起きているかを確認します。
  • Podを記述する: kubectl describe pod <pod-name> を実行します。EventsおよびLast Stateセクションに細心の注意を払ってください。
  • 以前のコンテナの状態を確認する: kubectl logs <pod-name> -p を使用して、最後にクラッシュしたインスタンスのログを取得します。
  • マニフェストを調査する: DeploymentまたはPodのYAMLで、不正なコマンド、引数、または不足しているボリュームがないか確認します。

CrashLoopBackOffの理解

KubernetesのCrashLoopBackOffステータスは、Pod内のコンテナが苛立たしいサイクルに陥っていることを意味します。コンテナは繰り返し起動しようとしますが、クラッシュし、Kubernetesは再起動を試みる前に毎回より長く待機します。これはKubernetesのバグではなく、明確な症状です。根本的な何かがコンテナまたはその設定が稼働し続けるのを妨げています。

Kubernetesは回復力のために設計されています。コンテナがクラッシュすると、自動的に再起動を試みます。クラッシュが続く場合、Kubernetesはバックオフ遅延を導入します。これにより、継続的な失敗した再起動試行によるリソースの枯渇を防ぎます。この遅延は、1秒、2秒、4秒、8秒といったように指数関数的に増加し、最大値に達するまで続きます。Podの根本的な問題が解決されるまで、このサイクルは続きます。

詳細な根本原因と修正アプローチ

1. コンテナコマンドまたは引数の誤り

CrashLoopBackOffの背後にある頻繁な原因は、コンテナに定義されている誤ったコマンドまたは引数です。これはしばしば単純なタイプミスや設定ミスに起因します。DockerfileのENTRYPOINT/CMD命令、またはKubernetes Podマニフェスト内のcommand/argsフィールドを確認してください。

診断方法:

  • Podイベントを確認する:

kubectl describe pod

    `Events`セクションで特定のメッセージを探します。これらには「Liveness probe failed」や「failed with exit code X」といった表示が含まれる場合があります。
  - **コンテナログを検査する(クラッシュした場合でも):**
    ```bash
kubectl logs <your-pod-name> --previous

ここで`--previous`フラグが非常に重要です。これは、コンテナの最後に終了したインスタンスからログを取得します。出力に「command not found」や構文エラーなどのエラーが見つかることがあります。

修正方法:

  • PodのYAML設定を注意深く確認してください。commandおよびargsフィールドが特定のコンテナイメージに対して正しいことを確認します。
  • Dockerfileで定義されているENTRYPOINTおよびCMDを確認します。
  • アプリケーションが特定の引数を必要とする場合、それらが期待どおりに正確に渡されていることを確認します。

2. 起動時のアプリケーションエラー

アプリケーションが起動直後にクラッシュすることがあります。これは、内部エラー、未処理の例外、または見つけられない依存関係に起因する可能性があります。これは純粋にアプリケーションのコードまたは内部依存関係の問題です。

診断方法:

  • コンテナログが主な調査ツールです:

kubectl logs --previous

    これらのログは、アプリケーションの起動失敗時に生成されたスタックトレースまたは特定のエラーメッセージをほぼ確実に明らかにします。
  - **実行中のコンテナにexecで入る(可能であれば、またはデバッグコンテナを使用):** コンテナが短期間稼働し続ける場合、または同じイメージを使用して一時的なデバッグコンテナを起動できる場合:
    ```bash
kubectl exec -it <your-pod-name> -- /bin/bash
# その後、アプリケーションのエントリーポイントコマンドを手動で実行してエラーを再現してみてください。

修正方法:

  • ログに基づいて、アプリケーションコードをデバッグします。起動エラー、データベース接続の問題、または適切な初期化を妨げる不足している環境変数を修正することに焦点を当てます。
  • 必要なすべての設定ファイルが存在し、正しくフォーマットされていることを再確認します。

3. 依存関係または設定ファイルの不足

コンテナ内のアプリケーションが、起動時に利用できない、または正しく設定されていないファイル、データベース、あるいは外部サービスにアクセスしようとしている可能性があります。

診断方法:

  • 再度ログを確認する: --previousログは非常に貴重です。通常、「No such file or directory」のような不足しているファイル、失敗した接続、または未初期化の変数が示されます。
  • Kubernetesボリュームを確認する: アプリケーションがマウントされたボリューム(ConfigMaps、Secrets、PersistentVolumesなど)に依存している場合、それらが正しくマウントされていることを確認します。また、ファイルまたはデータが期待されるパスに存在することも確認します。これには、以下を実行します。

kubectl describe pod

    詳細については、特に`Volumes`および`Mounts`セクションを参照してください。

#### 修正方法:

  - 必要なすべてのConfigMapsとSecretsが作成され、Podマニフェスト内で正しく参照されていることを確認します。
  - ボリュームマウントとコンテナ内の対応するパスが正確であることを確認します。
  - アプリケーションが他のサービスと通信する必要がある場合、ネットワークポリシーとサービス接続を確認します。

### 4. リソース制限の超過 (OOMKilled)
コンテナが定義された`limits`よりも多くのメモリを消費しようとすると、Kubernetesはそれを突然終了させます。これにより、Out-Of-Memory (OOM) エラーが発生します。この終了は直接クラッシュにつながり、`CrashLoopBackOff`状態を引き起こします。

#### 診断方法:

  - **Podイベントを記述する:**
    ```bash
kubectl describe pod <your-pod-name>

`Events`セクション内、またはコンテナの`Last State`の下に`OOMKilled`イベントがないか探します。
  • コンテナステータスを確認する:

kubectl get pod -o yaml

    YAML出力のコンテナのステータス詳細内で`reason: OOMKilled`を探します。

#### 修正方法:

  - PodまたはDeploymentのYAMLで、影響を受けるコンテナの`memory.limits`を増やします。例えば、`256Mi`だった場合、`512Mi`または`1Gi`に増やしてみてください。
  - あるいは、メモリ使用量を減らすようにアプリケーションを最適化します。

### 5. Liveness/Readinessプローブの失敗
PodにLivenessプローブが設定されており、それが継続的に失敗する場合、Kubernetesはコンテナを再起動するというアクションを起こします。この繰り返される再起動サイクルが`CrashLoopBackOff`の原因となります。Readinessプローブは直接再起動をトリガーしませんが、Livenessプローブの失敗は確実にトリガーします。

#### 診断方法:

  - **Podイベントを確認する:**
    ```bash
kubectl describe pod <your-pod-name>

「Liveness probe failed: HTTP GET http://...」や「Liveness probe failed: exec failed: ...」といったイベントが表示され、問題が明確に示されるでしょう。
  • プローブを手動でテストする: HTTPプローブの場合、クラスター内の別のPodからそのエンドポイントにアクセスしてみてください。Execプローブの場合、コマンドを自分で実行してみてください。

修正方法:

  • Livenessプローブの設定を調整します。initialDelaySeconds(例:5秒から15秒に)、periodSecondstimeoutSeconds、またはfailureThresholdを増やすことを検討し、アプリケーションが起動して真に正常な状態になるまで十分な時間を与えます。
  • Livenessプローブが使用するエンドポイントまたはコマンドが実際に正しく機能していることを確認します。期待される成功コード(例:HTTPプローブの場合はHTTP 200、Execプローブの場合は終了コード0)を返す必要があります。
  • アプリケーションの起動に時間がかかる場合、startupProbeの使用を検討してください。これは、LivenessプローブのinitialDelaySecondsを補完、あるいは置き換えることができます。

6. 不正確なImage Pull Secretsまたはイメージ名

ImagePullBackOffはイメージ関連の問題でより一般的なエラーですが、イメージのプル失敗もCrashLoopBackOffにつながる可能性があります。プライベートレジストリの資格情報が間違っている、またはイメージ名にタイプミスがあるなどの理由でイメージをプルできない場合、コンテナは起動すらできません。これにより、コンテナは正常に実行されず、クラッシュにつながります。

診断方法:

  • Podイベントを記述する:

kubectl describe pod

    `Events`セクションで特定のメッセージを探します。これらはイメージのプル失敗、認証問題、または明示的な「Image not found」エラーを示す可能性があります。

#### 修正方法:

  - イメージ名とタグの両方が完全に正しいことを確認します。
  - PodまたはDeployment内で`imagePullSecrets`が適切に設定されていることを確認します。これらは、必要なレジストリ資格情報を含む有効なシークレットを参照する必要があります。

## 検証手順
修正を適用したら、Podがスムーズに実行されていることを確認します。

  - **Podステータスを確認する:**
    ```bash
kubectl get pods

Podは最終的に`Running`ステータスを表示するはずです。`RESTARTS`のカウントは理想的には0のままであるか、アプリケーションがグレースフルシャットダウンを処理する場合は低い期待値である必要があります。
  • Podログを監視する:

kubectl logs -f

    ログを継続的にストリーミングします。これにより、アプリケーションが正常に起動し、新しいエラーなしで動作することを確認できます。
  - **アプリケーションの機能を確認する:** アプリケーションがエンドポイントを公開している場合、直接アクセスして期待どおりに動作していることを確認します。

## 参考文献

  - [Kubernetes Podライフサイクル: コンテナの再起動](https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#container-restarts)
  - [Liveness、Readiness、Startupプローブの設定](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/)
  - [コンテナのコンピューティングリソースの管理](https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/)

Related Error Notes