GKE のトラブルシューティングの概要


このページでは、Google Kubernetes Engine(GKE)の基本的なトラブルシューティング方法について説明します。このページは、Kubernetes と GKE を初めて使用するユーザーで、効果的なトラブルシューティング方法を学習したい方を対象としています。

このページでは、GKE の問題のモニタリング、診断、解決に使用する次のツールと手法の概要について説明します。

基本的な概念を理解する

Kubernetes と GKE を初めて使用する場合は、トラブルシューティングを開始する前に、クラスタ アーキテクチャや Pod とノードの関係などのコアコンセプトを理解することが不可欠です。詳細については、GKE の学習を開始するをご覧ください。

また、GKE のどの部分のメンテナンスをお客様が担当し、どの部分を Google Cloud が担当するのかを理解することも重要です。詳細については、GKE の共有責任をご覧ください。

Google Cloud コンソールでクラスタとワークロードの健全性を確認する

Google Cloud コンソールは、クラスタとワークロードの健全性をすばやく確認できるため、トラブルシューティングの出発点として最適です。クラスタの健全性は、ノードやネットワーキングなどの基盤となる GKE インフラストラクチャの健全性を参照します。一方、ワークロードの健全性は、クラスタで実行されているアプリのステータスとパフォーマンスを参照します。

以降のセクションでは、クラスタページとワークロード ページについて説明します。アプリの健全性を完全に把握するために、 Google Cloud コンソールでは強力なロギングツールとモニタリング ツールにもアクセスできます。これにより、過去の障害の根本原因を調査し、将来の障害を未然に防ぐことができます。これらのツールの詳細については、Cloud Logging で履歴分析を行うCloud Monitoring で事前対応型モニタリングを行うをご覧ください。

クラスタに関する問題を見つける

[Kubernetes クラスタ] ページには、クラスタの健全性の概要が表示されます。クラスタの問題を特定するには、このページから始めます。

このページをトラブルシューティングに活用する方法の例をいくつかご紹介します。

  • クラスタの健全性、アップグレード戦略、費用の最適化を改善するためのアドバイスについては、[推奨事項を表示] をクリックします。
  • 異常なクラスタを特定するには、[ステータス] 列を確認します。緑色のチェックマークが付いていないクラスタには注意が必要です。
  • 潜在的な問題を確認するには、[通知] 列を確認します。通知メッセージをクリックすると、詳細が表示されます。

特定のクラスタを調査する

クラスタで問題が見つかったら、クラスタの [詳細] ページで詳細情報を確認します。この情報は、クラスタのトラブルシューティングや構成の把握に役立ちます。

クラスタの [詳細] ページに移動する手順は次のとおりです。

  1. [Kubernetes クラスタ] ページに移動します。

    Kubernetes クラスタに移動

  2. [名前] 列を確認し、調査するクラスタの名前をクリックします。

クラスタの [詳細] ページを使用してクラスタのトラブルシューティングを行う方法の例を次に示します。

  • 一般的なヘルスチェックの場合は、次のオプションをお試しください。

    • クラスタレベルのダッシュボードを表示するには、[オブザーバビリティ] タブに移動します。デフォルトでは、クラスタを作成すると、GKE は Cloud Monitoring を有効にします。Cloud Monitoring が有効になっている場合、GKE はこのページのダッシュボードを自動的に設定します。トラブルシューティングに最も役立つビューをいくつかご紹介します。

      • 概要: クラスタの健全性、リソース使用率、主要なイベントの概要を表示します。このダッシュボードを使用すると、クラスタの全体的な状態をすばやく評価し、潜在的な問題を特定できます。
      • トラフィック指標: ノードベースのネットワーク指標を表示して、Kubernetes ワークロード間のトラフィックに関する分析情報を取得します。
      • ワークロードの状態: Deployment、Pod、コンテナの状態を表示します。障害が発生しているインスタンスまたは異常なインスタンスを特定し、リソース制約を検出します。
      • コントロール プレーン: コントロール プレーンの健全性とパフォーマンスを表示します。このダッシュボードでは、kube-apiserveretcd などのコンポーネントの主要な指標をモニタリングし、パフォーマンスのボトルネックを特定して、コンポーネントの障害を検出できます。

    • 最近のアプリエラーを表示するには、[アプリのエラー] タブに移動します。このタブの情報は、発生回数、エラーが最初に発生した日時、最後に発生した日時を表示することで、エラーの優先順位付けと解決に役立ちます。

      エラーをさらに調査するには、エラー メッセージをクリックして、関連するログへのリンクを含む詳細なエラーレポートを表示します。

  • 最近のアップグレードや変更後に問題のトラブルシューティングを行う場合は、クラスタの [詳細] タブの [クラスタの基本] セクションを確認します。[バージョン] フィールドに表示されているバージョンが想定どおりであることを確認します。詳細を調べるには、[アップグレード] セクションで [アップグレード履歴を表示] をクリックします。

  • Standard クラスタを使用しているときに、Pod が Pending 状態のままになった場合や、ノードが過負荷になっている疑いがある場合は、[ノード] タブを確認します。GKE がノードを管理するため、Autopilot クラスタでは [ノード] タブは使用できません。

    • [ノードプール] セクションで、自動スケーリングが正しく構成され、マシンタイプがワークロードに適していることを確認します。
    • [ノード] セクションで、ステータスが Ready 以外のノードを探します。NotReady ステータスは、リソースの圧迫や kubelet の問題など、ノード自体に問題があることを示します(kubelet は、各ノードで実行されてコンテナを管理するエージェントです)。

ワークロードの問題を検出する

特定のアプリ(デプロイの失敗など)に問題があると思われる場合は、 Google Cloud コンソールの [ワークロード] ページに移動します。このページには、クラスタ内で実行されているすべてのアプリが一覧表示されます。

このページをトラブルシューティングに活用する方法の例をいくつかご紹介します。

  • 異常なワークロードを特定するには、[ステータス] 列を確認します。緑色のチェックマークが付いていないワークロードは、注意が必要です。
  • アプリが応答しない場合は、[Pods] 列を確認します。たとえば、ステータスが 1/3 の場合、3 つのアプリレプリカのうち 1 つしか実行されておらず、問題があることを示します。

特定のワークロードを調査する

概要から問題のあるワークロードを特定したら、ワークロードの [詳細] ページを調べて根本原因の切り分けを開始します。

ワークロードの [詳細] ページに移動する手順は次のとおりです。

  1. [ワークロード] ページに移動します。

    [ワークロード] に移動

  2. [名前] 列を表示し、調査するワークロードの名前をクリックします。

ワークロードの [詳細] ページを使用してワークロードのトラブルシューティングを行う方法の例を次に示します。

  • ワークロードの構成を確認するには、ワークロードの [概要] タブと [詳細] タブを使用します。この情報を使用すると、正しいコンテナ イメージタグがデプロイされたかどうかなどのイベントの確認や、ワークロードのリソース リクエストと上限を確認できます。

  • クラッシュしている特定の Pod の名前を確認するには、[マネージド Pod] セクションに移動します。この情報は kubectl コマンドで必要になることがあります。このセクションには、ワークロードによって制御されるすべての Pod とそのステータスが一覧表示されます。ワークロードの最近の変更履歴を確認するには、[変更履歴] タブに移動します。新しいデプロイ後にパフォーマンスの問題が発生した場合は、このセクションを使用して、アクティブなリビジョンを特定します。これにより、現在のリビジョンの構成と以前のリビジョンの構成を比較して、問題の原因を特定できます。このタブが表示されない場合、ワークロードはリビジョンを使用しないタイプであるか、まだ更新されていないかのいずれかです。

  • Deployment が失敗したと思われる場合は、[イベント] タブに移動します。このページには Kubernetes レベルのイベントが表示されるため、多くの場合、最も価値のある情報源となります。

  • アプリのログを確認するには、[ログ] タブをクリックします。このページでは、クラスタ内で何が起こっているかを把握できます。問題の診断に役立つエラー メッセージとスタック トレースについては、こちらをご覧ください。

  • デプロイされた内容を正確に確認するには、[YAML] タブを表示します。このページには、クラスタに存在するワークロードのライブ YAML マニフェストが表示されます。この情報は、ソース管理されたマニフェストとの不一致を見つけるのに役立ちます。単一の Pod の YAML マニフェストを表示している場合、このタブには Pod のステータスも表示されます。これにより、Pod レベルの障害に関する分析情報を確認できます。

kubectl コマンドライン ツールを使用してクラスタの状態を調査する

Google Cloud コンソールは問題の有無を把握するのに役立ちますが、kubectl コマンドライン ツールは問題の原因を特定するのに不可欠です。Kubernetes コントロール プレーンと直接通信することで、kubectl コマンドライン ツールを使用して、GKE 環境のトラブルシューティングに必要な詳細情報を収集できます。

以降のセクションでは、GKE のトラブルシューティングの強力な出発点となる重要なコマンドについて説明します。

始める前に

開始する前に、次のタスクを実行します。

  • kubectl をインストールします
  • クラスタと通信するように kubectl コマンドライン ツールを構成します。

    gcloud container clusters get-credentials CLUSTER_NAME \
        --location=LOCATION
    

    次のように置き換えます。

    • CLUSTER_NAME: クラスタの名前。
    • LOCATION: クラスタのコントロール プレーンの Compute Engine のロケーション。リージョン クラスタの場合はリージョン、ゾーンクラスタの場合はゾーンを指定します。
  • 権限を確認します。kubectl コマンドを実行するために必要な権限があるかどうかを確認するには、kubectl auth can-i コマンドを使用します。たとえば、kubectl get nodes を実行する権限があるかどうかを確認するには、kubectl auth can-i get nodes コマンドを実行します。

    必要な権限がある場合、コマンドは yes を返します。それ以外の場合、コマンドは no を返します。

    kubectl コマンドを実行する権限がない場合は、次のようなエラー メッセージが表示されることがあります。

    Error from server (Forbidden): pods "POD_NAME" is forbidden: User
    "USERNAME@DOMAIN.com" cannot list resource "pods" in API group "" in the
    namespace "default"
    

    必要な権限がない場合は、クラスタ管理者に必要なロールの割り当てを依頼してください。

実行中の概要を確認する

kubectl get コマンドを使用すると、クラスタで発生していることの全体像を把握できます。次のコマンドを使用して、最も重要なクラスタ コンポーネントであるノードと Pod のステータスを確認します。

  1. ノードが正常かどうかを確認するには、すべてのノードとそのステータスの詳細を表示します。

    kubectl get nodes
    

    出力は次のようになります。

    NAME                                        STATUS   ROLES    AGE     VERSION
    
    gke-cs-cluster-default-pool-8b8a777f-224a   Ready    <none>   4d23h   v1.32.3-gke.1785003
    gke-cs-cluster-default-pool-8b8a777f-egb2   Ready    <none>   4d22h   v1.32.3-gke.1785003
    gke-cs-cluster-default-pool-8b8a777f-p5bn   Ready    <none>   4d22h   v1.32.3-gke.1785003
    

    Ready 以外のステータスは、追加の調査が必要です。

  2. Pod が正常かどうかを確認するには、すべての Pod とそのステータスの詳細を表示します。

    kubectl get pods --all-namespaces
    

    出力は次のようになります。

    NAMESPACE   NAME       READY   STATUS      RESTARTS   AGE
    kube-system netd-6nbsq 3/3     Running     0          4d23h
    kube-system netd-g7tpl 3/3     Running     0          4d23h
    

    Running 以外のステータスは、追加の調査が必要です。一般的なステータスは次のとおりです。

    • Running: 正常に実行されている状態。
    • Pending: Pod はノードでスケジュールされるのを待機している状態です。
    • CrashLoopBackOff: アプリが起動してエラーで終了し、Kubernetes によって再起動されるため、Pod 内のコンテナがループ内で繰り返しクラッシュしています。
    • ImagePullBackOff: Pod がコンテナ イメージを pull できません。

上記のコマンドは、kubectl get コマンドの使用方法の 2 つの例にすぎません。このコマンドを使用して、さまざまなタイプの Kubernetes リソースの詳細を確認することもできます。確認できるリソースの完全なリストについては、Kubernetes ドキュメントの kubectl get をご覧ください。

特定のリソースの詳細

問題を特定したら、詳細情報を取得する必要があります。問題の例としては、ステータスが Running ではない Pod があります。詳細を取得するには、kubectl describe コマンドを使用します。

たとえば、特定の Pod の説明を取得するには、次のコマンドを実行します。

kubectl describe pod POD_NAME -n NAMESPACE_NAME

次のように置き換えます。

  • POD_NAME: 問題が発生している Pod の名前。
  • NAMESPACE_NAME: Pod が存在する Namespace。Namespace がわからない場合は、kubectl get pods コマンドの出力から Namespace 列を確認します。

kubectl describe コマンドの出力には、リソースに関する詳細情報が含まれます。Pod のトラブルシューティングを行う際に確認すると役立つセクションを以下に示します。

  • Status: Pod の現在のステータス。
  • Conditions: Pod の全体的な健全性と readiness。
  • Restart Count: Pod 内のコンテナが再起動した回数。数値が高い場合は注意が必要です。
  • Events: この Pod に発生した重要なことのログ(ノードへのスケジュール、コンテナ イメージの pull、エラーの発生など)。Events セクションには、Pod が失敗した理由を直接示す情報が記載されていることがよくあります。

kubectl get コマンドと同様に、kubectl describe コマンドを使用して、複数のタイプのリソースの詳細を確認できます。確認できるリソースの完全なリストについては、Kubernetes ドキュメントの kubectl describe をご覧ください。

Cloud Logging で履歴分析を行う

kubectl コマンドライン ツールは Kubernetes オブジェクトのライブ状態を検査するうえで非常に重要ですが、そのビューは現在の瞬間に限定されることがよくあります。問題の根本原因を把握するには、時間の経過とともに何が起こったかを調査する必要があります。履歴コンテキストが必要な場合は、Cloud Logging を使用します。

Cloud Logging は、GKE クラスタ、コンテナ化されたアプリ、その他の Google Cloud サービスからログを集約します。

トラブルシューティングの主なログタイプについて

Cloud Logging は、トラブルシューティングに役立つさまざまな種類の GKE ログを自動的に収集します。

  • ノードとランタイムのログ(kubeletcontainerd: 基盤となるノードサービスからのログ。kubelet はノード上のすべての Pod のライフサイクルを管理するため、コンテナの起動、メモリ不足(OOM)イベント、プローブの失敗、ボリュームのマウントエラーなどの問題のトラブルシューティングには、そのログが不可欠です。これらのログは、NotReady ステータスのノードなど、ノードレベルの問題の診断にも不可欠です。

    containerd はイメージの pull など、コンテナのライフサイクルを管理するため、そのログは kubelet がコンテナを起動する前に発生した問題のトラブルシューティングに不可欠です。containerd ログは、コンテナ ランタイムの特定のアクティビティと潜在的なエラーを記録するため、GKE でノードレベルの問題を診断するのに役立ちます。

  • アプリログ(stdoutstderr: コンテナ化されたプロセスからの標準出力ストリームとエラー ストリーム。これらのログは、クラッシュ、エラー、予期しない動作などのアプリ固有の問題をデバッグするうえで不可欠です。

  • 監査ログ: クラスタで「誰が、どこで、いつ、何をしたのか」を把握できます。これらは、Kubernetes API サーバーに対して行われた管理アクションと API 呼び出しを追跡します。これは、構成の変更や不正アクセスによって発生した問題を診断するのに役立ちます。

一般的なトラブルシューティングのシナリオ

問題を特定したら、これらのログに対してクエリを実行して、何が起こったのかを確認できます。作業を開始するにあたって、ログを確認すると、次のような問題の解決に役立ちます。

  • ノードのステータスが NotReady の場合は、ノードログを確認します。kubelet ログと containerd ログには、ネットワークの問題やリソースの制約など、根本原因が示されていることがよくあります。
  • 新しいノードのプロビジョニングとクラスタへの参加に失敗した場合は、ノードのシリアルポート ログを確認します。これらのログは、ノードのロギング エージェントが完全にアクティブになる前の、アーリーブートと kubelet の起動アクティビティをキャプチャします。
  • 過去に Pod の起動に失敗した場合は、その Pod のアプリログを調べて、クラッシュがないか確認します。ログが空の場合や、Pod をスケジュールできない場合は、関連するイベントの監査ログ、またはターゲット ノードのノードログで、リソースの圧迫やイメージの pull エラーの手がかりを探します。
  • 重要な Deployment が削除されたが、その理由が不明な場合は、管理アクティビティ監査ログに対してクエリを実行します。これらのログは、削除 API 呼び出しを発行したユーザーまたはサービス アカウントを特定するのに役立ち、調査の明確な出発点となります。

ログへのアクセス方法

ログ エクスプローラを使用して、 Google Cloud コンソールで GKE ログのクエリ、表示、分析を行います。ログ エクスプローラには、問題の分離に役立つ強力なフィルタリング オプションが用意されています。

ログ エクスプローラにアクセスして使用する手順は次のとおりです。

  1. Google Cloud コンソールで、[ログ エクスプローラ] ページに移動します。

    [ログ エクスプローラ] に移動

  2. クエリペインにクエリを入力します。Logging のクエリ言語を使用して、ターゲット クエリを記述します。始めるにあたって、以下に、一般的なフィルタをいくつかご紹介します。

    フィルタの種類 説明 値の例
    resource.type Kubernetes リソースのタイプ。 k8s_clusterk8s_nodek8s_podk8s_container
    log_id リソースからのログストリーム。 stdoutstderr
    resource.labels.RESOURCE_TYPE.name 特定の名を持つリソースをフィルタします。
    は、RESOURCE_TYPE をクエリを実行するリソースの名前に置き換えます。例: namespacepod など。
    example-namespace-nameexample-pod-name
    severity ログの重大度レベル。 DEFAULTINFOWARNINGERRORCRITICAL
    jsonPayload.message=~ ログメッセージ内のテキストの正規表現検索。 scale.down.error.failed.to.delete.node.min.size.reached

    たとえば、特定の Pod のトラブルシューティングを行う場合は、そのエラーログを分離することがあります。その Pod の重大度が ERROR のログのみを表示するには、次のクエリを使用します。

    resource.type="k8s_container"
    resource.labels.pod_name="POD_NAME"
    resource.labels.namespace_name="NAMESPACE_NAME"
    severity=ERROR
    

    次のように置き換えます。

    • POD_NAME: 問題が発生している Pod の名前。
    • NAMESPACE_NAME: Pod が存在する Namespace。Namespace がわからない場合は、kubectl get pods コマンドの出力から Namespace 列を確認します。

    他の例については、Google Cloud Observability ドキュメントの Kubernetes 関連のクエリをご覧ください。

  3. [クエリを実行] をクリックします。

  4. JSON ペイロード、メタデータ、タイムスタンプなどの完全なログメッセージを表示するには、ログエントリをクリックします。

GKE ログの詳細については、GKE ログについてをご覧ください。

Cloud Monitoring を使用して事前対応型のモニタリングを行う

問題が発生した後、ログを確認することはトラブルシューティングの重要なステップです。ただし、真に復元力のあるシステムには、停止を引き起こす前に問題を特定する事前対応型のアプローチも必要です。

将来の問題を事前に特定し、主要業績評価指標を長期にわたって追跡するには、Cloud Monitoring を使用します。Cloud Monitoring には、ダッシュボード、指標、アラート機能が用意されています。これらのツールは、エラー率の上昇、レイテンシの増加、リソース制約を特定するのに役立ちます。これにより、ユーザーに影響が及ぶ前に対応できます。

有用な指標を確認する

GKE は、一連の指標を Cloud Monitoring に自動的に送信します。以降のセクションでは、トラブルシューティングに最も重要な指標をいくつか示します。

GKE 指標の完全なリストについては、GKE システム指標をご覧ください。

コンテナのパフォーマンスと健全性指標

特定のアプリに問題があると思われる場合は、これらの指標から始めます。これらの指標は、コンテナが頻繁に再起動しているか、メモリ不足になっているか、CPU 制限によってスロットリングされているかなど、アプリの健全性をモニタリングするのに役立ちます。

指標 説明 トラブルシューティングの重要性
kubernetes.io/container/cpu/limit_utilization インスタンスで現在使用されている CPU 上限の割合。コンテナが CPU 上限を超えることが許可されている場合があるため、この値が 1 より大きくなることがあります。 CPU スロットリングを識別します。値が大きいと、パフォーマンスが低下する可能性があります。
kubernetes.io/container/memory/limit_utilization インスタンスで現在使用されているメモリ上限の割合。この値は 1 を超えることはできません。 メモリ不足(OOM)エラーのリスクをモニタリングします。
kubernetes.io/container/memory/used_bytes コンテナが実際に使用したメモリ(バイト単位)。 メモリ使用量を追跡して、メモリリークの可能性や OOM エラーのリスクを特定します。
kubernetes.io/container/memory/page_fault_count メジャーとマイナーのタイプ別に分類したページ フォールトの数の数。 メモリ負荷が高いことを示します。メジャー ページフォルトは、メモリ上限に達していなくても、メモリがディスクから読み取られている(スワッピング)ことを意味します。
kubernetes.io/container/restart_count コンテナが再起動した回数。 再起動の回数が多い、または増加している場合、アプリのクラッシュ、構成ミス、リソースの枯渇などの潜在的な問題をハイライト表示します。
kubernetes.io/container/ephemeral_storage/used_bytes ローカル エフェメラル ストレージの使用量(バイト単位)。 一時ディスクの使用量をモニタリングし、エフェメラル ストレージの容量不足による Pod の強制排除を防ぎます。
kubernetes.io/container/cpu/request_utilization インスタンスでリクエストされ、現在使用されている CPU の割合。使用量がリクエストを超える可能性があるため、この値が 1 より大きくなることがあります。 CPU リクエストのプロビジョニングが過剰または過少になっていることを特定し、リソース割り当ての最適化に役立ちます。
kubernetes.io/container/memory/request_utilization インスタンスでリクエストされ、現在使用されているメモリの割合。使用量がリクエストを超える可能性があるため、この値が 1 より大きくなることがあります。 メモリ リクエストの過剰または過小なプロビジョニングを特定し、スケジューリングを改善して OOM エラーを防止します。

ノードのパフォーマンスと健全性指標

基盤となる GKE インフラストラクチャの問題を診断する必要がある場合は、これらの指標を確認します。これらの指標は、ノードの全体的な健全性と容量を把握するうえで重要です。ノードが異常な状態か、負荷がかかっているか、新しい Pod をスケジュールするのに十分なメモリがあるかどうかを調査するのに役立ちます。

指標 説明 トラブルシューティングの重要性
kubernetes.io/node/cpu/allocatable_utilization インスタンスで現在使用されている割り当て可能な CPU の割合。 Pod の使用量の合計がノードの使用可能な CPU リソースに負荷をかけているかどうかを示します。
kubernetes.io/node/memory/allocatable_utilization インスタンスで割り当て可能であり、現在使用されているメモリの割合。使用量が割り当て可能なメモリのバイト数を超えることはないため、この値が 1 を超えることはできません。 特に値が高い場合、新しい Pod のスケジュール設定や既存の Pod を動作させるためのメモリが不足していることを示します。
kubernetes.io/node/status_condition(ベータ版) ノードのステータス条件フィールドのノードの条件。 ReadyMemoryPressureDiskPressure などのノードの健全性状態を報告します。
kubernetes.io/node/ephemeral_storage/used_bytes ノードにより使用されるローカル エフェメラル ストレージのバイト数。 エフェメラル ストレージの使用量が多い場合に警告を発行することで、Pod の起動エラーや強制排除を回避できます。
kubernetes.io/node/ephemeral_storage/inodes_free ローカル エフェメラル ストレージ上のインデックス ノード(i ノード)の空き数。 空き i ノードの数をモニタリングします。ディスク容量が使用可能であっても、i ノードが不足するとオペレーションが停止する可能性があります。
kubernetes.io/node/interruption_count(ベータ版) 中断は、お客様がインフラストラクチャを制御している間にインフラストラクチャがシステムによって強制排除されることです。この指標は、タイプと理由別の現在の中断数です。 システムの強制排除が原因でノードが予期せず消える可能性がある理由について説明します。

Pod のパフォーマンスと健全性指標

これらの指標は、ネットワーキングやストレージなど、Pod と環境のインタラクションに関連する問題のトラブルシューティングに役立ちます。これらの指標は、起動が遅い Pod の診断、ネットワーク接続性の問題の調査、ストレージの事前管理によってボリュームの満杯による書き込みエラーの防止を行う必要がある場合に使用します。

指標 説明 トラブルシューティングの重要性
kubernetes.io/pod/network/received_bytes_count ネットワーク経由でポッドにより受信された累積バイト数。 アプリやネットワークの問題を示す可能性がある異常なネットワーク アクティビティ(高または低)を特定します。
kubernetes.io/pod/network/policy_event_count(ベータ版) データプレーンで確認されたネットワーク ポリシー イベント数の変化。 ネットワーク ポリシーが原因で発生した接続性の問題を特定します。
kubernetes.io/pod/volume/utilization インスタンスにより現在使用されているボリュームの割合。使用量が使用可能なボリューム容量の合計を超えることはないため、この値が 1 を超えることはありません。 使用率が高い(1 に近づいている)と書き込みエラーが発生する可能性がある場合に警告を発し、ボリューム スペースのプロアクティブな管理を可能にします。
kubernetes.io/pod/latencies/pod_first_ready(ベータ版) イメージの pull を含む、Pod のエンドツーエンドの起動レイテンシ(Pod Created から Ready まで)。 起動が遅い Pod を診断します。

Metrics Explorer で指標を可視化する

GKE 環境の状態を可視化するには、Metrics Explorer で指標に基づいてグラフを作成します。

Metrics Explorer を使用する手順は次のとおりです。

  1. Google Cloud コンソールで、[Metrics Explorer] ページに移動します。

    Metrics Explorer に移動

  2. [指標] フィールドで、検査する指標を選択または入力します。

  3. 結果を表示し、経時的な傾向を確認します。

たとえば、特定の Namespace の Pod のメモリ使用量を調査するには、次の操作を行います。

  1. [指標を選択] リストで、指標 kubernetes.io/container/memory/used_bytes を選択し、[適用] をクリックします。
  2. [フィルタを追加] をクリックし、[namespace_name] を選択します。
  3. [] リストで、調査する Namespace を選択します。
  4. [集計] フィールドで、[合計] > [pod_name] を選択し、[OK] をクリックします。この設定では、Pod ごとに個別の時系列線が表示されます。
  5. [グラフを保存] をクリックします。

結果のグラフには、各 Pod のメモリ使用量の推移が表示されます。これにより、メモリ消費量が異常に多い Pod や急増している Pod を視覚的に特定できます。

Metrics Explorer では、表示する指標を柔軟に構築できます。Metrics Explorer の詳細オプションの詳細については、Cloud Monitoring ドキュメントの Metrics Explorer でグラフを作成するをご覧ください。

問題の事前検出に関するアラートを作成する

問題が発生した場合や、指標が特定のしきい値を超えた場合に通知を受け取るには、Cloud Monitoring でアラート ポリシーを設定します。

たとえば、コンテナの CPU 上限が 5 分間 80% を超えたときに通知するアラート ポリシーを設定するには、次の操作を行います。

  1. Google Cloud コンソールで、[アラート] ページに移動します。

    アラートに移動

  2. [ポリシーを作成] をクリックします。

  3. [指標を選択] ボックスで CPU limit utilization をフィルタし、次の指標を選択します。kubernetes.io/container/cpu/limit_utilization

  4. [適用] をクリックします。

  5. [フィルタを追加] フィールドは空白のままにします。この設定では、クラスタがしきい値を超えるとアラートがトリガーされます。

  6. [データの変換] セクションで、次のようにします。

    1. [ローリング ウィンドウ] リストで、[1 分] を選択します。この設定は、 Google Cloud が 1 分ごとに平均値を計算することを意味します。
    2. [ローリング ウィンドウ関数] リストで、[平均] を選択します。

      これらの設定はどちらも、各コンテナの CPU 上限使用率を毎分平均します。

  7. [次へ] をクリックします。

  8. [アラートを構成する] セクションで、次の操作を行います。

    1. [条件タイプ] で [しきい値] を選択します。
    2. [Alert trigger] で [任意の時系列の違反] を選択します。
    3. [しきい値の位置] で [しきい値より上] を選択します。
    4. [しきい値] に「0.8」と入力します。この値は、モニタリングする 80% のしきい値を表します。
    5. [詳細オプション] をクリックします。
    6. [再テスト ウィンドウ] リストで、[5 分] を選択します。この設定は、CPU 使用率が 5 分間継続して 80% を超えた場合にのみアラートがトリガーされることを意味します。これにより、短いスパイクによる誤報が減少します。
    7. [条件名] フィールドに、条件にわかりやすい名前を付けます。
    8. [次へ] をクリックします。
  9. [通知を構成してアラートを確定する] セクションで、次の操作を行います。

    1. [通知チャンネル] リストで、アラートを受信するチャンネルを選択します。チャンネルがない場合は、[通知チャンネルを管理] をクリックして作成します。
    2. [アラート ポリシーの名前を付ける] フィールドに、わかりやすい名前を入力します。
    3. 他のフィールドはデフォルト値のままにしておきます。
    4. [次へ] をクリックします。
  10. ポリシーを確認し、問題がなければ [ポリシーを作成] をクリックします。

アラートを作成するその他の方法については、Cloud Monitoring ドキュメントのアラートの概要をご覧ください。

Gemini Cloud Assist で診断を迅速化する

前述のセクションで説明したツールを使用しても、問題の原因がすぐに明らかにならないことがあります。複雑なケースの調査には時間がかかり、高度な専門知識が必要です。このようなシナリオでは、Gemini Cloud Assist が役立ちます。隠れたパターンやサーフェス異常を自動的に検出し、概要を提供して、考えられる原因を迅速に特定するのに役立ちます。

Gemini Cloud Assist にアクセスする

Gemini Cloud Assist にアクセスする手順は次のとおりです。

  1. Google Cloud コンソールで、任意のページに移動します。
  2. Google Cloud コンソールのツールバーで、sparkGemini Cloud Assist チャットを開始または終了します」をクリックします。

    [Cloud Assist] パネルが開きます。表示されているプロンプトの例をクリックするか、[プロンプトを入力] フィールドにプロンプトを入力します。

プロンプトの例を調査する

Gemini Cloud Assist がどのように役立つかを確認するために、プロンプトの例をいくつか示します。

テーマ シナリオ サンプル プロンプト Gemini Cloud Assist の活用方法
わかりにくいエラー メッセージ Pod のステータスが CrashLoopBackoff ですが、エラー メッセージがわかりにくい。 GKE Pod エラー panic: runtime error: invalid memory address or nil pointer dereference はどういう意味ですか?一般的な原因は何ですか? Gemini Cloud Assist はメッセージを分析し、わかりやすい言葉で説明します。考えられる原因と解決策も提示します。
パフォーマンスの問題 チームは、GKE で実行されているアプリのレイテンシが高いことに気づきました。 prod GKE クラスタの api-gateway サービスでレイテンシが高くなっています。最初に確認すべき指標は何ですか?また、この問題の一般的な GKE 関連の原因をいくつか教えてください。 Gemini Cloud Assist は、調査する主要な指標を提案、潜在的な問題(リソース制約やネットワークの輻輳など)を調査して、さらなる調査のためのツールと手法を推奨します。
ノードに関する問題 GKE ノードが NotReady のステータスで停止している。 GKE ノード(node-xyz)の一つが NotReady ステータスを示しています。この問題をトラブルシューティングするための一般的な手順を教えてください。 Gemini Cloud Assist は、ノードの自動修復などのコンセプトを説明し、関連する kubectl コマンドを提案する、段階的な調査計画を提供します。
GKE について 特定の GKE 機能やベスト プラクティスの実装方法がわからない。 GKE クラスタを保護するためのベスト プラクティスは何ですか?詳細を確認する方法はありますか? Gemini Cloud Assist は、GKE のベスト プラクティスを明確に説明します。[関連コンテンツを表示] をクリックすると、公式ドキュメントへのリンクが表示されます。

詳しくは、次のリソースをご覧ください。

Gemini Cloud Assist Investigations を使用する

Gemini Cloud Assist は、インタラクティブなチャットに加えて、Gemini Cloud Assist Investigations を通じて、より自動化された詳細な分析を実行できます。この機能は、ログ エクスプローラなどのワークフローに直接統合されており、強力な根本原因分析ツールです。

エラーまたは特定のリソースから調査を開始すると、Gemini Cloud Assist はログ、構成、指標を分析します。このデータを使用して、考えられる根本原因に関するランク付けされた観測結果と仮説を生成し、推奨される次のステップを提供します。これらの結果を Google Cloud サポートケースに転送して、問題の迅速な解決に役立つ貴重なコンテキストを提供することもできます。

詳細については、Gemini ドキュメントの Gemini Cloud Assist Investigationsをご覧ください。

すべてをまとめる: トラブルシューティングのシナリオの例

この例では、GKE ツールの組み合わせを使用して、一般的な実際の問題(メモリ不足が原因でコンテナが繰り返しクラッシュする)を診断して理解する方法を示します。

シナリオ

GKE で実行される product-catalog という名前のウェブアプリのオンコール エンジニアです。

調査は、Cloud Monitoring から自動アラートを受信したときに開始されます。

Alert: High memory utilization for container 'product-catalog' in 'prod' cluster.

このアラートは、問題が存在することと、その問題が product-catalog ワークロードに関連していることを示します。

Google Cloud コンソールで問題を確認する

まず、ワークロードの概要を確認して、問題を確認します。

  1. Google Cloud コンソールで、[ワークロード] ページに移動し、product-catalog ワークロードでフィルタします。
  2. [Pods] ステータス列を確認します。正常な 3/3 ではなく、値が 2/3 のように異常な状態を示しています。この値は、アプリの Pod のいずれかのステータスが Ready ではないことを示します。
  3. さらに調査するため、product-catalog ワークロードの名前をクリックして詳細ページに移動します。
  4. 詳細ページで、[マネージド Pod] セクションを表示します。すぐに問題が特定されます。Pod の Restarts 列に、異常に高い数値である 14 が表示されています。

再起動回数が多い場合は、問題によってアプリが不安定になっていることが確認できます。また、コンテナがヘルスチェックに失敗しているか、クラッシュしていることが示唆されます。

kubectl コマンドで理由を確認する

アプリが繰り返し再起動していることがわかったので、その理由を調べる必要があります。この場合は、kubectl describe コマンドが役立ちます。

  1. 不安定な Pod の正確な名前を取得します。

    kubectl get pods -n prod
    

    次のような出力が表示されます。

    NAME                             READY  STATUS            RESTARTS  AGE
    product-catalog-d84857dcf-g7v2x  0/1    CrashLoopBackOff  14        25m
    product-catalog-d84857dcf-lq8m4  1/1    Running           0         2h30m
    product-catalog-d84857dcf-wz9p1  1/1    Running           0         2h30m
    
  2. 不安定な Pod の説明を取得して、イベント履歴の詳細を確認します。

    kubectl describe pod product-catalog-d84857dcf-g7v2x -n prod
    
  3. 出力を確認すると、Last State セクションと Events セクションに手がかりが見つかります。

    Containers:
      product-catalog-api:
        ...
        State:          Waiting
          Reason:       CrashLoopBackOff
        Last State:     Terminated
          Reason:       OOMKilled
          Exit Code:    137
          Started:      Mon, 23 Jun 2025 10:50:15 -0700
          Finished:     Mon, 23 Jun 2025 10:54:58 -0700
        Ready:          False
        Restart Count:  14
    ...
    Events:
      Type     Reason     Age                           From                Message
      ----     ------     ----                          ----                -------
      Normal   Scheduled  25m                           default-scheduler   Successfully assigned prod/product-catalog-d84857dcf-g7v2x to gke-cs-cluster-default-pool-8b8a777f-224a
      Normal   Pulled     8m (x14 over 25m)             kubelet             Container image "us-central1-docker.pkg.dev/my-project/product-catalog/api:v1.2" already present on machine
      Normal   Created    8m (x14 over 25m)             kubelet             Created container product-catalog-api
      Normal   Started    8m (x14 over 25m)             kubelet             Started container product-catalog-api
      Warning  BackOff    3m (x68 over 22m)             kubelet             Back-off restarting failed container
    

    出力には、次の 2 つの重要な手がかりが表示されます。

    • まず、Last State セクションには、コンテナが Reason: OOMKilled で終了したことが示されています。これは、メモリ不足になったことを示しています。この理由は Exit Code: 137 によって確認できます。これはメモリ消費量が多すぎるために強制終了されたプロセスの標準的な Linux 終了コードです。
    • 次に、Events セクションにはメッセージ Back-off restarting failed container を含む Warning: BackOff イベントが表示されます。このメッセージは、コンテナが失敗ループに陥っていることを確認するものです。これは、先ほど確認した CrashLoopBackOff ステータスの直接の原因です。

指標を使用して動作を可視化する

kubectl describe コマンドは発生したことを示しますが、Cloud Monitoring では環境の動作を時系列で確認できます。

  1. Google Cloud コンソールで、[Metrics Explorer] に移動します。
  2. container/memory/used_bytes 指標を選択します。
  3. 出力を特定のクラスタ、Namespace、Pod 名にフィルタします。

グラフには、メモリ使用量が着実に増加し、コンテナが OOM で強制終了して再起動すると、急激にゼロに低下するという明確なパターンが示されています。この視覚的な証拠は、メモリリークまたはメモリ上限の不足のいずれかを示しています。

ログで根本原因を見つける

これで、コンテナのメモリが不足していることはわかりましたが、その原因はまだ特定できていません。根本原因を特定するには、ログ エクスプローラを使用します。

  1. Google Cloud コンソールで、[ログ エクスプローラ] に移動します。
  2. クエリを作成して、最後のクラッシュの直前の特定のコンテナのログをフィルタします(kubectl describe コマンドの出力で確認できます)。

    resource.type="k8s_container"
    resource.labels.cluster_name="example-cluster"
    resource.labels.namespace_name="prod"
    resource.labels.pod_name="product-catalog-d84857dcf-g7v2x"
    timestamp >= "2025-06-23T17:50:00Z"
    timestamp < "2025-06-23T17:55:00Z"
    
  3. ログには、クラッシュの直前にメッセージの繰り返しパターンが見られます。

    {
      "message": "Processing large image file product-image-large.jpg",
      "severity": "INFO"
    },
    {
      "message": "WARN: Memory cache size now at 248MB, nearing limit.",
      "severity": "WARNING"
    }
    

これらのログエントリは、アプリが大きな画像ファイルをメモリに完全に読み込んで処理しようとしており、最終的にコンテナのメモリ上限に達したことを示しています。

検出結果

これらのツールを併用することで、問題の全体像を把握できます。

  • モニタリング アラートで問題が発生したことが通知されました。
  • Google Cloud コンソールには、問題がユーザーに影響している(再起動)ことが示されています。
  • kubectl コマンドで、再起動の正確な理由(OOMKilled)を特定しました。
  • Metrics Explorer に、メモリリークのパターンが時系列で表示されています。
  • ログ エクスプローラで、メモリの問題の原因となっている特定の動作が明らかになりました。

これで、ソリューションを実装する準備が整いました。アプリコードを最適化して大きなファイルをより効率的に処理するか、短期的な修正として、ワークロードの YAML マニフェストでコンテナのメモリ上限(具体的には spec.containers.resources.limits.memory 値)を引き上げることができます。

次のステップ