Kubernetesでは、多くのオブジェクトに Condition があります。 Conditionは、オブジェクトが表す対象の実際の状態の一部を示すマーカーです。 PodにもConditionがあり、KubernetesのPodのConditionは、コントローラー(やトラブルシューティングを行う人)がPodの健全性を理解するための重要な要素です。
Podのフェーズは、Podがライフサイクル上のどこに位置するかを大まかにまとめたものですが、単一の値ですべてを表現することはできません。
例えば、PodがRunningフェーズにあっても、まだトラフィックを処理する準備が整っていない場合があります。
PodのConditionは、Podがスケジュールされたかどうか、コンテナが準備完了かどうか、リサイズが進行中かどうか、taintによってPodが中断されようとしているかなど、Podの状態の複数の側面を独立して追跡することでフェーズを補完します。
Podのステータスには、Podが特定のチェックポイントを通過したかどうかを示すPodConditionの配列が含まれています。
PodCondition配列の各要素には、以下のフィールドがあります:
| フィールド名 | 説明 |
|---|---|
type |
このPodのConditionの名前です。 |
status |
このConditionが適用可能かどうかを示します。可能な値は"True"、"False"、"Unknown"のいずれかです。 |
lastProbeTime |
Pod Conditionが最後に確認されたときのタイムスタンプです。 |
lastTransitionTime |
Podのステータスが最後にあるステータスから別のステータスへ遷移したときのタイムスタンプです。 |
reason |
Conditionの最後の遷移理由を示す、機械可読のアッパーキャメルケースのテキストです。 |
message |
最後のステータス遷移に関する詳細を示す人間向けのメッセージです。 |
observedGeneration |
Conditionが記録された時点のPodの.metadata.generationです。Pod generationを参照してください。 |
Kubernetesは以下のPod Conditionを管理します:
ライフサイクル上のCondition: Podがライフサイクルを進む過程で、おおよそPodScheduled、PodReadyToStartContainers、Initialized、ContainersReady、Readyの順に設定されます。
その他のCondition: 特定の操作やイベントに応じて、DisruptionTarget、PodResizePending、PodResizeInProgressが設定されます。
上記のビルトインのConditionに加えて、PodのReadinessゲートを使用してカスタムのConditionを定義することもできます。
Podがライフサイクルを進むにつれて、kubeletは以下のConditionをおおよそ次の順序で設定します:
PodScheduled: Podがノードにスケジュールされたことを示します。PodReadyToStartContainers: Podのサンドボックスが正常に作成され、ネットワークが構成されたことを示します。
サンドボックスとネットワークは、コンテナランタイムとCNIプラグインによってセットアップされます。Initialized: すべてのInitコンテナが正常に完了したことを示します。
Initコンテナを持たないPodでは、サンドボックスの作成前にTrueに設定されます。ContainersReady: Pod内のすべてのコンテナが準備完了であることを示します。
コンテナのReadinessは、設定されている場合はReadiness Probeによって判定されます。Ready: Podがリクエストを処理でき、一致するすべてのServiceの負荷分散プールに追加されるべきであることを示します。
ReadyでないPodはServiceのエンドポイントから削除されます。Ready ConditionはContainersReadyだけに依存しているわけではありません。
PodがreadinessGatesを指定している場合、PodがReadyになるためには、それらのカスタムConditionもすべてTrueである必要があります。
詳細はPodのReadinessを参照してください。kubectlを使用してPodのConditionを確認できます:
kubectl get pod <pod-name> -o yaml
実行中のPodのstatus.conditionsは次のようになります:
status:
conditions:
- type: PodScheduled
status: "True"
lastProbeTime: null
lastTransitionTime: "2026-03-29T08:52:21Z"
observedGeneration: 1
- type: PodReadyToStartContainers
status: "True"
lastProbeTime: null
lastTransitionTime: "2026-04-11T06:02:16Z"
observedGeneration: 1
- type: Initialized
status: "True"
lastProbeTime: null
lastTransitionTime: "2026-03-29T08:52:21Z"
observedGeneration: 1
- type: ContainersReady
status: "True"
lastProbeTime: null
lastTransitionTime: "2026-04-11T06:02:45Z"
observedGeneration: 1
- type: Ready
status: "True"
lastProbeTime: null
lastTransitionTime: "2026-04-11T06:02:45Z"
observedGeneration: 1
Kubernetes v1.29 [beta](enabled by default)PodHasNetworkという名前でした。Podがノードにスケジュールされた後、kubeletに受け入れられ、必要なストレージボリュームがマウントされる必要があります。
これらのフェーズが完了すると、kubeletは(Container Runtime Interface (CRI)を使用して)コンテナランタイムと連携し、ランタイムサンドボックスをセットアップしてPodのネットワークを構成します。
PodReadyToStartContainersConditionフィーチャーゲートが有効な場合(Kubernetes 1.36ではデフォルトで有効)、PodReadyToStartContainers ConditionがPodのstatus.conditionsフィールドに追加されます。
PodReadyToStartContainers Conditionは、Podにネットワーク構成済みのランタイムサンドボックスがないことをkubeletが検出すると、Falseに設定されます。
これは以下のシナリオで発生します:
ランタイムプラグインによるPodのサンドボックスの作成とネットワーク構成が正常に完了すると、kubeletはPodReadyToStartContainers ConditionをTrueに設定します。
PodReadyToStartContainers ConditionがTrueに設定された後、kubeletはコンテナイメージの取得とコンテナの作成を開始できます。
Initコンテナを持つPodでは、kubeletはInitコンテナが正常に完了した後(これはランタイムプラグインによるサンドボックスの作成とネットワーク構成が成功した後に発生します)、Initialized ConditionをTrueに設定します。
Initコンテナを持たないPodでは、kubeletはサンドボックスの作成とネットワーク構成が開始する前に、Initialized ConditionをTrueに設定します。
以下のConditionは、通常のPodのライフサイクルの進行には含まれません。 これらは特定の操作やイベントに応じて設定されます。
DisruptionによりPodが削除されようとしていることを示すために、専用のPod DisruptionTarget Conditionが追加されます。
このConditionのreasonフィールドは、Podの終了理由として以下のいずれかを示します:
PreemptionBySchedulerDeletionByTaintManagerNoExecuteのtaintにより、Taint Manager(kube-controller-manager内のノードライフサイクルコントローラーの一部)によってPodが削除されようとしています。
taintベースの退避を参照してください。EvictionByEvictionAPIDeletionByPodGCTerminationByKubeletPodのコンテナの制限を超過したことによる退避のようなその他すべてのDisruptionシナリオでは、Disruptionの原因がPod自体にある可能性が高く、リトライしても再発するため、PodはDisruptionTarget Conditionを受け取りません。
DisruptionTarget ConditionがPodに追加されても、そのPodが実際には削除されないことがあります。
このような場合、しばらくすると、PodのDisruptionのConditionはクリアされます。Podのガベージコレクター(PodGC)は、Podをクリーンアップするとともに、Podが非終了フェーズにある場合はそれらをfailedとしてマークします(Podのガベージコレクションも参照してください)。
Job(またはCronJob)を使用する場合、これらのPodのDisruptionのConditionを、JobのPod失敗ポリシーの一部として活用したい場合があります。
詳細については、Disruptionを参照してください。
kubeletは、リサイズリクエストの状態を示すために、PodのステータスのConditionを更新します:
type: PodResizePending: kubeletはリクエストをすぐには許可できません。
messageフィールドにその理由が記載されます。
reason: Infeasible: 要求されたリサイズは現在のノード上では実行不可能です(例えば、ノードが持つリソースより多くを要求した場合)。reason: Deferred: 要求されたリサイズは現時点では不可能ですが、後で実現可能になる可能性があります(例えば、他のPodが削除された場合)。
kubeletはリサイズを再試行します。type: PodResizeInProgress: kubeletはリサイズを受け入れてリソースを割り当てましたが、変更はまだ適用中です。
通常は短時間で完了しますが、リソースの種類やランタイムの挙動によってはさらに時間がかかる場合があります。
実行中に発生したエラーは、messageフィールドに(reason: Errorとともに)報告されます。要求されたリサイズが Deferred となった場合、kubeletは、例えば他のPodが削除されたりスケールダウンされたりしたときなどに、定期的にリサイズを再試行します。
Podのリサイズの詳細については、コンテナに割り当てられたCPUおよびメモリリソースのリサイズを参照してください。
アプリケーションは、Podの.statusに追加のフィードバックやシグナルを注入できます。
これは Enhanced Pod readiness と呼ばれます。
これを使用するには、PodのspecでreadinessGatesを設定し、kubeletがPodのReadinessを評価する際に確認する追加のConditionのリストを指定します。
そして、これらのカスタムConditionを管理するコントローラーを実装またはインストールすると、kubeletはそれをPodがreadyかどうかを判断するための追加情報として使用します。
ReadinessゲートはPodのstatus.conditionフィールドの現在の状態によって決まります。
Kubernetesがstatus.conditionsフィールド内に該当するConditionを見つけられない場合、そのConditionのステータスはデフォルトで"False"になります。
kind: Pod
...
spec:
readinessGates:
- conditionType: "www.example.com/feature-1"
status:
conditions:
- type: Ready # ビルトインのPodCondition
status: "False"
lastProbeTime: null
lastTransitionTime: 2018-01-01T00:00:00Z
- type: "www.example.com/feature-1" # 追加のPodCondition
status: "False"
lastProbeTime: null
lastTransitionTime: 2018-01-01T00:00:00Z
containerStatuses:
- containerID: docker://abcd...
ready: true
...
追加するPodのConditionの名前は、Kubernetesのラベルキーのフォーマットに準拠している必要があります。
Podにこれらのstatus.conditionsを設定するには、アプリケーションやオペレーターは、Podのステータスサブリソースに対してPATCHアクションを使用する必要があります。
kubectl patchを--subresource=statusとともに使用するか、Kubernetesのクライアントライブラリを使用して、PodのReadinessのためにカスタムのPodのConditionを設定するコードを記述できます。
カスタムConditionを使用するPodは、以下の両方が当てはまる場合のみreadyと評価されます。
readinessGatesに指定されたすべてのConditionがTrueである。PodのコンテナがReadyでも、カスタムConditionの少なくとも1つが欠落しているかFalseの場合、kubeletはPodのReady Conditionをreason: ReadinessGatesNotReadyとともにstatus: "False"に設定します。