このページでは、Google Kubernetes Engine(GKE)でデプロイされたワークロードのエラーを解決する方法について説明します。
アプリケーションのトラブルシューティングに関する一般的なアドバイスについては、Kubernetes のドキュメントでアプリケーションのトラブルシューティングをご覧ください。
すべてのエラー: Pod のステータスを確認する
ワークロードの Pod に問題がある場合、Kubernetes は Pod のステータスをエラー メッセージとともに更新します。これらのエラーを確認するには、 Google Cloud コンソールまたは kubectl コマンドライン ツールを使用して Pod のステータスを確認します。
コンソール
次の手順を行います。
Google Cloud コンソールで、[ワークロード] ページに移動します。
調査するワークロードを選択します。[概要] タブにワークロードのステータスが表示されます。
[マネージド Pod] セクションで、エラー ステータス メッセージをクリックします。
kubectl
クラスタで実行しているすべての Pod を表示するには、次のコマンドを実行します。
kubectl get pods
出力は次のようになります。
NAME READY STATUS RESTARTS AGE
POD_NAME 0/1 CrashLoopBackOff 23 8d
発生する可能性のあるエラーは Status 列に示されます。
特定の Pod に関する詳細情報を取得するには、次のコマンドを実行します。
kubectl describe pod POD_NAME
POD_NAME を調査する Pod の名前に置き換えます。
出力の Events フィールドに、エラーの詳細が表示されます。
詳細については、コンテナログを表示します。
kubectl logs POD_NAME
これらのログは、コンテナ内のコマンドまたはコードが Pod のクラッシュの原因であるかどうかを特定する際に役立ちます。
エラーを特定したら、次のセクションに進み、問題を解決してください。
エラー: CrashLoopBackOff
ステータスが CrashLoopBackOff の場合、特定のエラーがあるわけではなく、コンテナが再起動後に繰り返しクラッシュしていることを示します。
詳細については、CrashLoopBackOff イベントのトラブルシューティングをご覧ください。
エラー: ImagePullBackOff と ErrImagePull
ステータスが ImagePullBackOff または ErrImagePull の場合、コンテナが使用するイメージをイメージ レジストリから読み込めないことを示します。
これらのステータスのトラブルシューティングのガイダンスについては、イメージの pull のトラブルシューティングをご覧ください。
エラー: OutOfPods
ステータスが OutOfPods の場合、ノードが Pod の最大容量に達しているため、ノードで Pod を実行できないことを示します。
現象
Pod のイベントに次のようなメッセージが表示されることがあります。
Node didn't have enough resource: pods, requested: 1, used: 32, capacity: 32
原因
このエラーは、容量がすでに上限に達しているノードに Pod をスケジュールするリクエストがある場合に発生します。この状況は、ノードの起動時によく発生します。たとえば、独自の Pod 容量を必要とする kube-proxy コンポーネントのような静的 Pod の存在を kubelet エージェントが報告する前に、kube-scheduler コンポーネントが Pod を新しいノードに割り当てる場合などです。
解決策
この問題を解決するには、次のいずれかの解決策を試してください。
ノードあたりの Pod の最大数を増やす。ノードが常に Pod の上限に達している場合は、ノードプールの
--max-pods-per-node設定の値を大きくします。Pod の数を増やすと、リソース需要の増加に対応するために、より大きなノードが必要になることがあります。クラスタ オートスケーラーとノード自動プロビジョニングを有効にする。Pod の容量が頻繁に不足する場合は、クラスタ オートスケーラーとノード自動プロビジョニングを有効にすると、クラスタでワークロードの需要を満たすために十分なノードを確保できます。
自動スケーリング プロファイルを変更する。クラスタ オートスケーラーをすでに使用している場合は、自動スケーリング プロファイルを
optimize-utilizationプロファイルではなくbalancedプロファイルに変更してみてください。optimize-utilizationプロファイルは、使用率が最も高いノードに Pod を配置しようとするため、OutOfPodsエラーが発生する可能性が高くなります。
エラー: Pod unschedulable
ステータスが PodUnschedulable の場合、リソースが不足しているか、なんらかの構成エラーのために Pod をスケジュールできないことを示します。
コントロール プレーンの指標を構成している場合は、スケジューラの指標と API サーバーの指標でエラーの詳細を確認できます。
スケジュール不可の Pod のインタラクティブ ハンドブックを使用する
Google Cloud コンソールのインタラクティブ ハンドブックを使用して、PodUnschedulable エラーをトラブルシューティングできます。
スケジュール不可の Pod のインタラクティブ ハンドブックに移動します。
[クラスタ] プルダウン リストで、トラブルシューティングするクラスタを選択します。クラスタが見つからない場合は、(フィルタ)フィールドにクラスタの名前を入力します。
[Namespace] プルダウン リストで、トラブルシューティングする Namespace を選択します。Namespace が見つからない場合は、(フィルタ)フィールドに Namespace を入力します。
原因を特定するには、ハンドブックの各セクションを確認します。
- CPU とメモリの調査
- ノードあたりの最大 Pod 数の調査
- オートスケーラーの動作の調査
- その他の障害モードの調査
- 変更イベントの相関
省略可: 今後
PodUnschedulableエラーが発生した場合に通知を受け取るには、[今後の対応のヒント] セクションで [アラートを作成する] を選択します。
エラー: Insufficient resources
PodUnschedulable ステータスは、Pod のリクエストを満たすのに十分な CPU、メモリ、その他のリソースがない場合に発生することがあります。
現象
CPU、メモリ、またはその他のリソースが不足していることを示すエラーが発生する場合があります。例: No nodes are available that match all of the predicates:
Insufficient cpu (2)。このメッセージは、2 つのノードで、Pod のリクエストを満たせる十分な CPU がないことを示します。
原因
Pod のリソース リクエストが有効なノードプールの単一ノードの上限を超えた場合、GKE は Pod をスケジュールしません。また、新しいノードを追加するためのスケールアップもトリガーしません。
クラスタは kube-system Namespace でシステム コンテナを実行します。システム コンテナもクラスタ リソースを使用します。
解決策
次の解決策を試してください。
spec: containers: resources: requestsフィールドに小さい値を指定して、Pod のリソース リクエストを調整します。デフォルトの CPU リクエストは 100m、または CPU の 10%(あるいは 1 コア)です。Pod のリクエストを満たすのに十分なリソースを持つノードを含む新しいノードプールを作成します。
ノード自動プロビジョニングを有効にすると、GKE はスケジュールされていない Pod が実行可能なノードを含むノードプールを自動的に作成できます。
エラー: MatchNodeSelector
MatchNodeSelector エラーは、Pod のラベルセレクタに一致するノードがないことを示します。
現象
Pod のステータスまたはイベントに MatchNodeSelector エラーが表示されます。
原因
Pod マニフェストの nodeSelector フィールドで指定されたラベルが、クラスタ内のどのノードにも存在しない。
解決策
このエラーを解決するには、Pod の nodeSelector フィールドに指定されたラベルが、クラスタ内の少なくとも 1 つのノードのラベルと一致していることを確認します。
Pod の
spec: nodeSelectorフィールドを調べて、Pod が探しているラベル要件を特定します。ラベルが Pod の要件と一致するかどうかを確認するには、クラスタ内のノードに割り当てられている実際のラベルを表示します。
kubectl get nodes --show-labelsこの Pod を実行するノードがある場合は、必要なラベルを付けます。
kubectl label nodes NODE_NAME LABEL_KEY=LABEL_VALUE次のように置き換えます。
NODE_NAME: ラベルを追加するノード。LABEL_KEY: ラベルのキー。LABEL_VALUE: ラベルの値。
詳細については、Kubernetes ドキュメントのノードに Pod を割り当てるをご覧ください。
エラー: PodToleratesNodeTaints
PodToleratesNodeTaints エラーは、Pod に既存の node taint に対応する toleration がないため、Pod をノードにスケジュールできないことを示します。
現象
Pod のステータスまたはイベントに PodToleratesNodeTaints エラーが表示されます。
原因
Pod に既存のノード taint に対応する toleration がないため、Pod をノードにスケジュールできません。
解決策
ノードの taint を確認します。
kubectl describe nodes NODE_NAME出力で、Key-Value ペアとスケジューリング効果が一覧表示されている
Taintsフィールドを確認します。リストに表示された効果がNoScheduleの場合、一致する toleration がない限り、そのノードに Pod をスケジュールできません。ノードから taint を削除します。たとえば、
NoScheduletaint を削除するには、次のコマンドを実行します。kubectl taint nodes NODE_NAME key:NoSchedule-
エラー: PodFitsHostPorts
PodFitsHostPorts エラーは、ノードがすでに占有されているポートを使用しようとしていることを意味します。
現象
Pod のステータスに PodFitsHostPorts エラーが表示される。
原因
Pod が、ターゲット ノード上の別の Pod またはプロセスですでに使用されているホストポートをリクエストしている。
解決策
この問題を解決するには、Kubernetes のベスト プラクティスに沿って、hostPort 設定ではなく NodePort Service を使用することを検討してください。
ホストポートを使用する必要がある場合は、Pod のマニフェストを調べて、同じノード上のすべての Pod に hostPort 設定に一意の値が定義されていることを確認します。
エラー: Does not have minimum availability
このエラーは、ノードに十分なリソースがあるものの、スケジューリングに使用できない場合に発生することがあります。
現象
Does not have minimum availabilityエラーが表示される。ノードのステータスは
SchedulingDisabledまたはCordonedになります。
原因
ノードの閉鎖ステータスにより、新しい Pod がそのノードでスケジュールされなくなります。
解決策
Pod のスケジューリングにノードを再び使用できるようにするには、ノードの閉鎖を解除します。
コンソール
次の手順を行います。
Google Cloud コンソールで [Google Kubernetes Engine] ページに移動します。
調査するクラスタを選択します。[ノード] タブに、ノードとそのステータスが表示されます。
ノードでスケジューリングを可能にするには、次の操作を行います。
リストで、調査するノードをクリックします。
[ノードの詳細] セクションで、[閉鎖解除] をクリックします。
kubectl
ノードのステータスを取得するには、次のコマンドを実行します。
kubectl get nodes
ノードでスケジューリングを可能にするには、次のコマンドを実行します。
kubectl uncordon NODE_NAME
エラー: Maximum Pods per node limit reached
Too many pods エラーは、ターゲット ノードが構成済みの Pod の最大容量に達しているため、Pod をスケジュールできないことを示します。
現象
- Pod が
Unschedulable状態で停止している。 Too many podsというフレーズを含むメッセージが表示されます。
原因
クラスタ内のすべてのノードがノードあたりの最大 Pod 数の上限に達している。
解決策
この問題を解決するには、次の操作を行います。
Google Cloud コンソールで GKE クラスタの詳細に移動し、[ノード] タブで
Maximum pods per node構成を確認します。ノードのリストを取得します。
kubectl get nodesノードごとに、そのノードで実行されている Pod の数を確認します。
kubectl get pods -o wide | grep NODE_NAME | wc -l上限に達している場合は、新しいノードプールを追加するか、既存のノードプールにノードを追加します。
問題: クラスタ オートスケーラーが有効な状態でノードプールの最大サイズに達した
この問題は、ノードプールがクラスタ オートスケーラーで構成された最大サイズに達した場合に発生します。
現象
GKE は、このノードプールでスケジュールされている Pod のスケールアップをトリガーしません。代わりに、Pod は Pending 状態のままになります。
原因
ノードプールがクラスタ オートスケーラーの構成に従って最大サイズに達した。
解決策
クラスタ オートスケーラーの構成を変更して、ノードプールの最大サイズを増やします。
問題: クラスタ オートスケーラーが無効な状態でノードプールの最大サイズに達した
この問題は、ノードプールが最大サイズに達し、クラスタ オートスケーラーが無効になっている場合に発生します。
現象
GKE はノードプールで Pod をスケジュールできません。
原因
ノードプールが最大ノード数に達し、クラスタ オートスケーラーが無効になっている。
解決策
この問題を解決するには、次のいずれかの解決策を試してください。
- ノードプールのサイズを大きくする。
- クラスタ オートスケーラーを有効にして、クラスタのサイズを自動的に変更します。
エラー: Unbound PersistentVolumeClaims
Unbound PersistentVolumeClaims エラーは、Pod がバインドされていない PersistentVolumeClaim を参照していることを示します。
現象
Pod のステータスまたはイベントに Unbound PersistentVolumeClaims エラーが表示されます。
原因
このエラーは、次のいずれかの理由で発生する可能性があります。
- PersistentVolume のプロビジョニングに失敗しました。
- PersistentVolume と PersistentVolumeClaim とのバインディングを手動で事前プロビジョニングする際に構成エラーが発生しました。
解決策
PersistentVolumeClaim のイベントを取得して、プロビジョニングが失敗したかどうかを確認します。
kubectl describe pvc STATEFULSET_NAME-PVC_NAME-0次のように置き換えます。
STATEFULSET_NAME: StatefulSet オブジェクトの名前。PVC_NAME: PersistentVolumeClaim オブジェクトの名前。
ボリュームの事前プロビジョニングをもう一度試してください。
エラー: Insufficient quota
GKE が Pod をスケジュールするためにクラスタをスケールアップしようとしたときに、割り当ての制約が発生すると、スケールアップは失敗します。
現象
Pod のイベントに scale.up.error.quota.exceeded エラー メッセージが表示されます。
原因
クラスタをスケールアップすると、プロジェクトの使用可能な割り当てを超過します。
解決策
GKE がクラスタをスケールアップするのに十分な Compute Engine 割り当てがプロジェクトにあることを確認します。詳細については、ScaleUp エラーをご覧ください。
問題: 非推奨の API
マニフェストでサポートが終了した API を使用すると、ワークロードのデプロイが妨げられる可能性があります。
現象
非推奨の API の使用が原因で、ワークロードのデプロイまたは実行に失敗する。
原因
マニフェストで、クラスタのマイナー バージョンで削除された非推奨の API を使用している。
解決策
非推奨の API を使用していないことを確認します。サポートされている API を使用するようにマニフェストを更新します。詳細については、機能と API の非推奨をご覧ください。
エラー: リクエストされた Pod ポートに空きポートがない
Pod をホストポートにバインドすると、GKE が Pod をスケジュールできる場所が制限されます。これは、各 hostIP アドレス、hostPort 設定、protocol 値の組み合わせが一意である必要があるためです。
現象
次のようなエラーが表示されます。
0/1 nodes are available: 1 node(s) didn't have free ports for the requested pod ports. preemption: 0/1 nodes are available: 1 No preemption victims found for incoming pod.
原因
同じノード上の複数の Pod が、hostPort フィールドで定義された同じ値を指定しています。
解決策
この問題を解決するには、次のいずれかの解決策を試してください。
- Kubernetes のベスト プラクティスに沿って、ホストポートではなく
NodePortService を使用します。 - ホストポートを使用する必要がある場合は、Pod のマニフェストを調べて、同じノード上のすべての Pod に
hostPortフィールドに一意の値が定義されていることを確認します。
問題: Pod でのアプリケーションとプローブの障害
この問題は、HTTPS を使用してサーバーと通信するアプリケーションを実行するときに発生します。
現象
これらのアプリケーションの障害は次のようになります。
- Pod が起動せず、コンテナが終了コード
137でクラッシュする。 Liveness プローブまたは readiness プローブが失敗し、次のようなエラー メッセージが表示されます。
probeResult="failure" output="Get "https://example.com/healthy": EOF"Pod は想定どおりに実行されますが、アプリケーション ログに接続エラーが表示されます。
原因
Kubernetes バージョン 1.30 以降では、次の TLS 暗号スイートを無効にする Golang バージョンを使用します。
TLS_RSA_WITH_AES_128_GCM_SHA256TLS_RSA_WITH_AES_256_GCM_SHA384TLS_RSA_WITH_AES_128_CBC_SHATLS_RSA_WITH_AES_256_CBC_SHATLS_RSA_WITH_3DES_EDE_CBC_SHA
解決策
TLS 1.2 以降のサポートされている暗号スイートを使用します。
次のステップ
このドキュメントで問題を解決できない場合は、サポートを受けるで、次のトピックに関するアドバイスなど、詳細なヘルプをご覧ください。
- Cloud カスタマーケアに問い合わせて、サポートケースを登録する。
- StackOverflow で質問する、
google-kubernetes-engineタグを使用して類似の問題を検索するなどして、コミュニティからサポートを受ける。#kubernetes-engineSlack チャネルに参加して、コミュニティ サポートを利用することもできます。 - 公開バグトラッカーを使用して、問題の報告や機能リクエストの登録を行う。