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"
    

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

ログの書き込みに関する権限の問題を特定して修正する

GKE は、ノードに接続されている IAM サービス アカウントを使用して、ロギングやモニタリングなどのシステムタスクを実行します。少なくとも、これらのノード サービス アカウントには、プロジェクトに対する Kubernetes Engine デフォルト ノード サービス アカウントroles/container.defaultNodeServiceAccount)ロールが必要です。デフォルトでは、GKE はプロジェクトで自動的に作成される Compute Engine のデフォルトのサービス アカウントをノード サービス アカウントとして使用します。

組織で iam.automaticIamGrantsForDefaultServiceAccounts 組織のポリシー制約が適用されている場合、プロジェクトのデフォルトの Compute Engine サービス アカウントに GKE に必要な権限が自動的に付与されないことがあります。

  • 問題を特定するには、クラスタのシステム ロギング ワークロードで 401 エラーを確認します。

    [[ $(kubectl logs -l k8s-app=fluentbit-gke -n kube-system -c fluentbit-gke | grep -cw "Received 401") -gt 0 ]] && echo "true" || echo "false"
    

    出力が true の場合、システム ワークロードで 401 エラーが発生しています。これは、権限がないことを示します。出力が false の場合は、残りの手順をスキップして、別のトラブルシューティングの手順を試します。

  1. ノードが使用するサービス アカウントの名前を確認します。

    console

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

      Kubernetes クラスタに移動

    2. クラスタリストで、検査するクラスタの名前をクリックします。
    3. クラスタの運用モードに応じて、次のいずれかを行います。
      • Autopilot モードのクラスタの場合は、[セキュリティ] セクションで [サービス アカウント] フィールドを見つけます。
      • Standard モード クラスタの場合は、次の操作を行います。
        1. [ノード] タブをクリックします。
        2. [ノードプール] テーブルで、ノードプールの名前をクリックします。[ノードプールの詳細] ページが開きます。
        3. [セキュリティ] セクションで、[サービス アカウント] フィールドを見つけます。

    [サービス アカウント] フィールドの値が default の場合、ノードは Compute Engine のデフォルトのサービス アカウントを使用します。このフィールドの値が default でない場合、ノードはカスタム サービス アカウントを使用します。カスタム サービス アカウントに必要なロールを付与するには、最小権限の IAM サービス アカウントを使用するをご覧ください。

    gcloud

    Autopilot モードのクラスタの場合は、次のコマンドを実行します。

    gcloud container clusters describe CLUSTER_NAME \
        --location=LOCATION \
        --flatten=autoscaling.autoprovisioningNodePoolDefaults.serviceAccount

    Standard モードのクラスタの場合は、次のコマンドを実行します。

    gcloud container clusters describe CLUSTER_NAME \
        --location=LOCATION \
        --format="table(nodePools.name,nodePools.config.serviceAccount)"

    出力が default の場合、ノードは Compute Engine のデフォルトのサービス アカウントを使用します。出力が default でない場合、ノードはカスタム サービス アカウントを使用しています。必要なロールをカスタム サービス アカウントに付与するには、最小権限の IAM サービス アカウントを使用するをご覧ください。

  2. Compute Engine のデフォルト サービス アカウントに roles/container.defaultNodeServiceAccount ロールを付与する手順は次のとおりです。

    console

    1. [ようこそ] ページに移動します。

      [ようこそ] に移動

    2. [プロジェクト番号] フィールドで、 [クリップボードにコピー] をクリックします。
    3. [IAM] ページに移動します。

      [IAM] に移動

    4. [ アクセスを許可] をクリックします。
    5. [新しいプリンシパル] フィールドに次の値を指定します。
      PROJECT_NUMBER-compute@developer.gserviceaccount.com
      PROJECT_NUMBER は、コピーしたプロジェクト番号に置き換えます。
    6. [ロールを選択] メニューで、[Kubernetes Engine のデフォルト ノード サービス アカウント] ロールを選択します。
    7. [保存] をクリックします。

    gcloud

    1. Google Cloud プロジェクト番号を確認します。
      gcloud projects describe PROJECT_ID \
          --format="value(projectNumber)"

      PROJECT_ID を実際のプロジェクト ID に置き換えます。

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

      12345678901
      
    2. Compute Engine のデフォルト サービス アカウントに roles/container.defaultNodeServiceAccount ロールを付与します。
      gcloud projects add-iam-policy-binding PROJECT_ID \
          --member="serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
          --role="roles/container.defaultNodeServiceAccount"

      PROJECT_NUMBER は、前の手順で取得したプロジェクト番号に置き換えます。

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. gcpdiag runbook gke/logs \
        --parameter project_id=PROJECT_ID \
        --parameter name=GKE_NAME \
        --parameter location=LOCATION
  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 カスタマーケアにお問い合わせください。