GKE でのロギングのトラブルシューティング


このページでは、GKE のロギング関連の問題を調査して解決する方法について説明します。

さらにサポートが必要な場合は、Cloud カスタマーケアにお問い合わせください。

Cloud Logging にクラスタログがない

プロジェクトでロギングが有効になっていることを確認する

  1. 有効なサービスを一覧表示します。

    gcloud services list --enabled --filter="NAME=logging.googleapis.com"
    

    次の出力は、プロジェクトでロギングが有効になっていることを示しています。

    NAME                    TITLE
    logging.googleapis.com  Cloud Logging API
    

    省略可: ログビューアのログを調べて、API を無効にしたユーザーと API を無効にした日時を確認します。

    protoPayload.methodName="google.api.serviceusage.v1.ServiceUsage.DisableService"
    protoPayload.response.services="logging.googleapis.com"
    
  2. ロギングが無効になっている場合は、ロギングを有効にします。

    gcloud services enable logging.googleapis.com
    

クラスタでロギングが有効になっていることを確認する

  1. クラスタを一覧表示します。

    gcloud container clusters list \
        --project=PROJECT_ID \
        '--format=value(name,loggingConfig.componentConfig.enableComponents)' \
        --sort-by=name | column -t
    

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

    • PROJECT_ID: Google Cloud プロジェクト ID。

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

    cluster-1              SYSTEM_COMPONENTS
    cluster-2              SYSTEM_COMPONENTS;WORKLOADS
    cluster-3
    

    クラスタの値が空の場合、ロギングは無効です。たとえば、この出力の cluster-3 ではロギングが無効になっています。

  2. NONE に設定されている場合は、クラスタログを有効にします。

    gcloud container clusters update CLUSTER_NAME  \
        --logging=SYSTEM,WORKLOAD \
        --location=COMPUTE_LOCATION
    

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

ノードプール内のノードに Cloud Logging のアクセス スコープが設定されていることを確認する

ノードが Cloud Logging にログを書き込むには、次のいずれかのスコープが必要です。

  • https://www.googleapis.com/auth/logging.write
  • https://www.googleapis.com/auth/cloud-platform
  • https://www.googleapis.com/auth/logging.admin
  1. クラスタ内の各ノードプールで構成されているスコープを確認します。

    gcloud container node-pools list --cluster=CLUSTER_NAME \
        --format="table(name,config.oauthScopes)" \
        --location COMPUTE_LOCATION
    

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

    古いノードプールから新しく作成されたノードプールにワークロードを移行し、進捗状況をモニタリングします。

  2. 新しいノードプールを作成して正しいロギング スコープを構成します。

    gcloud container node-pools create NODE_POOL_NAME \
        --cluster=CLUSTER_NAME \
        --location=COMPUTE_LOCATION \
        --scopes="gke-default"
    

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

ノードプールのサービス アカウントに適切な IAM 権限を含むロールがあることを確認する

サービス アカウントには、ログを作成するための権限 logging.logEntries.create を含むロールが必要です。

  1. 各ノードプールのサービス アカウントを見つけます。

    gcloud container node-pools list \
        --cluster=CLUSTER_NAME \
        --format="table(name,config.serviceAccount)" \
        --location=COMPUTE_LOCATION
    

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

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

    NAME          SERVICE_ACCOUNT
    default-pool  gke-cluster-sa@developer.gserviceaccount.com
    

    ノードプールがデフォルトの Compute Engine サービス アカウントを使用している場合、次のコマンドを使用して詳細を表示できます。ノードプールには、最小限の権限のみが付与されているカスタム サービス アカウントを使用することをおすすめします。デフォルトの Compute Engine サービス アカウントには、クラスタの実行に必要な最小権限以上の権限が含まれています。

    gcloud compute project-info describe --format="table(defaultServiceAccount)"
    
  2. IAM ロールに十分な権限があることを確認します。

    特定のサービス アカウントに付与されているロールに含まれる権限を確認します。

    gcloud projects get-iam-policy PROJECT_ID \
        --flatten="bindings[]" \
        --filter="bindings.members=serviceAccount:SERVICE_ACCOUNT" \
        --format="table[box](bindings.role)"
    
  3. サービス アカウントに、logging.logEntries.create 権限を含むロールを付与します。事前定義ロールを使用するか、カスタムロールを作成できます。

Cloud Logging の API 書き込み割り当ての上限に達していないことを確認する

Cloud Logging の API 書き込み割り当ての上限に達していないことを確認します。

  1. Google Cloud コンソールで [割り当て] ページに移動します。

    [割り当て] に移動

  2. テーブルを「Cloud Logging API」でフィルタリングします。

  3. どの割り当ての上限にも達していないことを確認します。

gcpdiag を使用して GKE のロギングの問題をデバッグする

GKE クラスタからログが取得されない場合や、不完全なログが取得される場合は、gcpdiag ツールを使用してトラブルシューティングを行います。

gcpdiag はオープンソース ツールです。正式にサポートされている Google Cloud プロダクトではありません。gcpdiag ツールを使用すると、Google Cloud プロジェクトの問題を特定して修正できます。詳細については、GitHub の gcpdiag プロジェクトをご覧ください。

GKE クラスタのログが欠落しているか不完全な場合は、適切なロギング機能に不可欠な次のコア構成に焦点を当てて、考えられる原因を調査します。

  • プロジェクト レベルのロギング: GKE クラスタが格納されている Google Cloud プロジェクトで Cloud Logging API が有効になっていることを確認します。
  • クラスタレベルのロギング: GKE クラスタの構成内でロギングが明示的に有効になっていることを確認します。
  • ノードプールの権限: クラスタのノードプール内のノードで「Cloud Logging 書き込み」スコープが有効になっていることを確認します。有効になっていれば、ログデータが送信されます。
  • サービス アカウントの権限: ノードプールで使用されるサービス アカウントに、Cloud Logging の操作に必要な IAM 権限があることを確認します。通常は roles/logging.logWriter ロールが必要です。
  • Cloud Logging API の書き込み割り当て: 指定された期間内に Cloud Logging API の書き込み割り当てが超過していないことを確認します。

Google Cloud コンソール

  1. 次のコマンドを入力してコピーします。
  2. GOOGLE_AUTH_TOKEN=GOOGLE_AUTH_TOKEN \
      gcpdiag runbook gke/logs \
        --parameter project_id=PROJECT_ID \
        --parameter name=GKE_NAME \
        --parameter location=LOCATION \
        --auto --reason=REASON
  3. Google Cloud コンソールを開き、Cloud Shell をアクティブにします。
  4. Cloud コンソールを開く
  5. コピーしたコマンドを貼り付けます。
  6. gcpdiag コマンドを実行します。gcpdiag Docker イメージがダウンロードされ、診断チェックが実行されます。必要に応じて、出力の指示に沿って、失敗したチェックを修正します。

Docker

Docker コンテナで gcpdiag を起動するラッパーを使用して gcpdiag を実行できます。Docker または Podman がインストールされている必要があります。

  1. ローカル ワークステーションで次のコマンドをコピーして実行します。
    curl https://gcpdiag.dev/gcpdiag.sh >gcpdiag && chmod +x gcpdiag
  2. gcpdiag コマンドを実行します。
    ./gcpdiag runbook gke/logs \
        --parameter project_id=PROJECT_ID \
        --parameter name=GKE_NAME \
        --parameter location=LOCATION

このランブックで使用可能なパラメータを表示します。

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

  • PROJECT_ID: リソースを含むプロジェクトの ID。
  • GKE_NAME: GKE クラスタの名前。
  • LOCATION: GKE クラスタのゾーンまたはリージョン。

有用なフラグ:

gcpdiag ツールのフラグの一覧と説明については、gcpdiag の使用手順をご覧ください。

次のステップ

さらにサポートが必要な場合は、Cloud カスタマーケアにお問い合わせください。