フリートのログを表示する

このページでは、フリートのログを有効にして表示する方法について説明します。フリート ロギングでは、複数のログを集約してスコープを設定するため、1 つの統合ビューでアプリケーションの健全性を分析できます。このページは、次のような方を対象としています。

  • フリート ロギングを有効にしてすべての Namespace のログを表示する必要があるプラットフォーム管理者。
  • アクセス権のある特定の Namespace のログを表示する必要があるサービス オペレーター。

概要

フリートログでは、フリートレベル全体または特定のチームスコープでログを表示できます。スコープは、チームごとにフリートログやその他のリソースのサブセットを定義できる、チーム管理機能です。各スコープは、1 つ以上のフリート メンバー クラスタに関連付けられます。スコープについて詳しくは、フリートのチームを管理するをご覧ください。

次の 2 種類のフリートログを表示できます。

  • デフォルトログ: 次のリソースタイプを持つ特定のフリート スコープに属さないすべての Kubernetes ログ(監査ログを除く)。

    • k8s_container
    • k8s_pod
    • k8s_node
    • k8s_cluster
    • k8s_control_plane_components
  • フリート スコープのログ: 複数のフリートレベルの Namespace を持つ特定のフリート スコープにデプロイされたチームが所有するアプリケーションのコンテナと Pod のログ。

フリート スコープのログの表示は任意です。チーム管理を設定しない場合でも、フリート ロギングを使用してデフォルトログを表示できます。

ログは、アクセス制御用のさまざまなビューを使用して、フリート ホスト プロジェクト内の異なるログバケットにルーティングできます。ログバケットのデフォルトの保持期間は 30 日です。必要に応じて、この期間を構成できます。

フリートに複数のプロジェクトのクラスタが含まれているログ ルーティングでは、次の 2 つのモードがサポートされています(プロジェクト間の登録)。

  • MOVE: すべてのログがフリート ホスト プロジェクトに移動されます。 フリート内のクラスタが別のプロジェクトに属している場合、それらのログは元の Google Cloud プロジェクトに保持されません

  • COPY: すべてのログがフリート ホスト プロジェクトに送信されます。フリート内のクラスタが別のプロジェクトに属している場合、それらのログは元の Google Cloud プロジェクトにも保持されます。

始める前に

  1. すでに手動で Cloud Logging のバケットシンクを作成し、除外フィルタを設定している場合は、これらのオブジェクトに割り当てた名前がフリート ロギングの命名制限と競合していないことを確認します。名前が競合している場合は、続行する前にサポートにお問い合わせください。

  2. ログを表示するクラスタが、選択したフリートに登録されていることを確認します。

  3. Google Cloud CLI をまだインストールしていない場合は、インストール手順に従ってインストールします。フリートログを表示するには、バージョン 424.0.0 以降が必要です。

  4. フリート ホスト プロジェクトで、Anthos API を含む必要なすべての API が有効になっていることを確認します。

    gcloud services enable --project=FLEET_HOST_PROJECT_ID  \
    gkehub.googleapis.com \
    container.googleapis.com \
    connectgateway.googleapis.com \
    cloudresourcemanager.googleapis.com \
    iam.googleapis.com \
    anthos.googleapis.com
    

    ここで

    • FLEET_HOST_PROJECT_ID は、フリート ホスト プロジェクトのプロジェクト ID に置き換えます。この値の確認方法をご覧ください。

スコープ、Namespace、ワークロードを準備する

フリート スコープのログを表示するには、ログ収集のワークロードを準備することに加えて、フリート スコープとフリートの Namespace を作成する必要があります。

続行する前に、次のコマンドを実行して Google Cloud CLI のデフォルト プロジェクトを設定します。

gcloud config set project FLEET_HOST_PROJECT_ID

スコープと Namespace を作成する

スコープレベルでログを表示しようとしていて、スコープをまだ設定していない場合は、フリートのチームを管理するの手順に沿ってスコープを作成し、スコープにクラスタを追加して、フリートの Namespace を設定します。

ワークロードを準備する

アプリケーションからのログデータを表示するには、前の手順で構成したフリートの Namespace にクラスタ内のワークロードをデプロイする必要があります。この手順は、デフォルトログ、フリート スコープのログ、またはその両方を表示する場合に適用できます。ワークロードを構成する例を次に示します。

  apiVersion: v1
  kind: Pod
  metadata:
    name: fleet-example-pod
    namespace: NAMESPACE_NAME
  spec:
    containers:
    - name: count
      image: ubuntu:14.04
      args: [bash, -c,
           'for ((i = 0; ; i++)); do echo "$i: $(date)"; sleep 1; done']

リソースをデプロイした後、なんらかの理由でフリートの Namespace の作成に失敗した場合、エラーが表示されることがあります。この場合は、次のコマンドを実行して Namespace を再度作成し、ワークロードのデプロイ コマンドを再実行します。

  kubectl create namespace NAMESPACE_NAME
  

フリート ロギングを有効にする

このセクションでは、フリート ロギング機能を有効にして、チームにログを表示するアクセス権を付与する方法について説明します。

gcloud

  • Google Cloud CLI を使用してフリート ロギングを有効にするには、JSON または YAML ファイルで機能の構成フィールドを指定します。JSON 形式のフリート ロギングの構成例を次に示します。

    {
      "loggingConfig": {
          "defaultConfig": {
              "mode": "COPY"
          },
          "fleetScopeLogsConfig": {
              "mode": "MOVE"
          }
      }
    }
    

この機能に構成できるすべてのフィールドを表示するには、API リファレンスをご覧ください。

COPY モードまたは MOVE モードで defaultConfig フィールドまたは fleetScopeLogsConfig フィールドを有効にすると、前述の例に示すように、接頭辞 fleet-o11y- を付けてログシンクが作成されます。このログシンクは Google Cloud プロジェクトの下に作成され、クラスタ プロジェクトからフリートホスト プロジェクトにターゲットログをルーティングします。

fleetScopeLogsConfig が有効になっている場合、フリート ホスト プロジェクトの global リージョンfleet-o11y-scope-$SCOPE_NAME という名前のログバケットが作成されます(存在しない場合)。バケットのリージョンは変更できません。

この例では、デフォルトログはフリート ホスト プロジェクトに送信され、元の Google Cloud プロジェクトに保持されます。一方、フリート スコープのログはフリート ホスト プロジェクトに送信され、Google Cloud プロジェクトに保持されません。

  • 選択した構成を JSON ファイルに追加し、フリートを更新します。

    gcloud container fleet fleetobservability update \
            --logging-config=JSON_FILE
    

JSON_FILE は実際のファイル名に置き換えます。

Terraform

  • フリート オブザーバビリティ機能はデフォルトで有効になっています。初めて Terraform を使用してフリートのオブザーバビリティ機能を管理する場合は、次のコマンドを実行して、Terraform に機能をインポートします。
terraform import google_gke_hub_feature.feature projects/FLEET_HOST_PROJECT_ID/locations/global/features/fleetobservability

たとえば、Terraform 構成に次のブロックを追加できます。

  resource "google_gke_hub_feature" "feature" {
    name = "fleetobservability"
    location = "global"
    spec {
      fleetobservability {
        logging_config {
          default_config {
            mode = "COPY"
          }
          fleet_scope_logs_config {
            mode = "MOVE"
          }
        }
      }
    }
  }

COPY モードまたは MOVE モードで default_config フィールドまたは fleet_scope_logs_config フィールドを有効にすると、前述の例に示すように、接頭辞 fleet-o11y- を付けてログシンクが作成されます。このログシンクは Google Cloud プロジェクトの下に作成され、クラスタ プロジェクトからフリートホスト プロジェクトにターゲットログをルーティングします。

fleet_scope_logs_config が有効になっている場合、フリート ホスト プロジェクトに fleet-o11y-scope-$SCOPE_NAME という名前のログバケットが作成されます(存在しない場合)。

この例では、デフォルトログはフリート ホスト プロジェクトに送信され、元の Google Cloud プロジェクトに保持されます。一方、フリート スコープのログはフリート ホスト プロジェクトに送信され、Google Cloud プロジェクトに保持されません。

機能仕様が更新されていることを確認します。

   gcloud container fleet fleetobservability describe
  

出力には、次の例のように、構成で更新された fleetobservability 仕様が表示されます。

createTime: '2022-09-30T16:05:02.222568564Z'
membershipStates:
  projects/123456/locations/us-central1/memberships/cluster-1:
    state:
      code: OK
      description: Fleet monitoring enabled.
      updateTime: '2023-04-03T20:22:51.436047872Z'
name:
projects/123456/locations/global/features/fleetobservability
resourceState:
  state: ACTIVE
spec:
  fleetobservability:
    loggingConfig:
      defaultConfig:
        mode: COPY
      fleetScopeLogsConfig:
        mode: MOVE
state:
  state: {}
updateTime: '2023-04-03T20:38:17.719596966Z'

fleetobservability 仕様に変更を加えると、適用されるまでに数分かかることがあります。

プロジェクト間のロギング権限を設定する

このセクションは、別のプロジェクトのフリートにクラスタを登録する(クロス プロジェクト登録とも呼ばれる)場合にのみ必要です。クラスタ プロジェクトからフリート ホスト プロジェクトにログをルーティングするには、各クラスタ プロジェクトのロギング サービス アカウントに roles/logging.bucketWriter ロールを付与する必要があります。

  1. クラスタ プロジェクトのシンクからサービス アカウントの認証情報を取得するには、次のコマンドを実行します。

    FLEET_HOST_PROJECT_ID=FLEET_HOST_PROJECT_ID
    FLEET_HOST_PROJECT_NUMBER=$(gcloud projects describe "${FLEET_HOST_PROJECT_ID}" --format "value(projectNumber)")
    gcloud logging sinks --project=GKE_PROJECT_ID describe fleet-o11y-${FLEET_HOST_PROJECT_NUMBER}-default
    

    ログシンクが見つからないというエラーが返された場合は、1~2 分後にコマンドを再実行してみてください。次の例に示すように、シンクの説明の writerIdentity フィールドでサービス アカウントを確認できます。

    createTime: '2023-04-06T02:26:54.716195307Z'
    destination:
    logging.googleapis.com/projects/123456/locations/global/buckets/_Default
    filter: xxx
    name: fleet-o11y-default
    updateTime: '2023-04-06T19:03:51.598668462Z'
    writerIdentity:
    serviceAccount:service-123456@gcp-sa-logging.iam.gserviceaccount.com
    
  2. 取得したサービス アカウントに roles/logging.bucketWriter のロールを付与します。

    gcloud projects add-iam-policy-binding FLEET_HOST_PROJECT_ID \
        --member "SERVICE_ACCOUNT" \
        --role "roles/logging.bucketWriter"
    

    ここで

    • SERVICE_ACCOUNT は、前の手順で取得したサービス アカウントの名前です。例:
    gcloud projects add-iam-policy-binding FLEET_HOST_PROJECT_ID \
        --member "serviceAccount:service-123456@gcp-sa-logging.iam.gserviceaccount.com" \
        --role "roles/logging.bucketWriter"
    

チームにログへのアクセス権を付与する

このセクションでは、コンテナログと Pod ログを表示するアクセス権をユーザーに付与する方法について説明します。

  1. フリート プロジェクトの IAM ポリシーを取得し、JSON 形式のローカル ファイルに書き込みます。

    gcloud projects get-iam-policy FLEET_HOST_PROJECT_ID --format json > output.json
    
  2. ユーザー アカウントが、作成したログバケットからデータを表示できる IAM 条件を追加します。コンテナログと Pod ログを表示する例を次に示します。

    {
      "bindings": [
        {
          "members": [
            "user:USER_ACCOUNT_EMAIL"
          ],
          "role": "roles/logging.viewAccessor",
          "condition": {
              "title": "Bucket reader condition example",
              "description": "Grants logging.viewAccessor role to user USER_ACCOUNT_EMAIL for the fleet-o11y-scope-SCOPE_NAME-k8s_container and fleet-o11y-scope-SCOPE_NAME-k8s_pod log view.",
              "expression":
                "resource.name == \"projects/FLEET_HOST_PROJECT_ID/locations/global/buckets/fleet-o11y-scope-SCOPE_NAME/views/fleet-o11y-scope-SCOPE_NAME-k8s_container\" || resource.name == \"projects/FLEET_HOST_PROJECT_ID/locations/global/buckets/fleet-o11y-scope-SCOPE_NAME/views/fleet-o11y-scope-SCOPE_NAME-k8s_pod\""
          }
        }
      ],
    }
    
  3. IAM ポリシーを更新します。

    gcloud projects set-iam-policy FLEET_HOST_PROJECT_ID output.json
    

アクセス権の付与に関するその他のオプションについては、ログビューへのアクセス権の付与をご覧ください。

フリートのログを表示する

プラットフォーム管理者は、すべての Namespace のすべてのログを表示できます。

デフォルトログ

フリートホスト プロジェクトの _Default バケットのすべてのデフォルトログを表示するには、次の URL の変数を入力して、ブラウザにコピーして貼り付けます。

https://console.cloud.google.com/logs/query;query=;storageScope=storage,projects%2FFLEET_HOST_PROJECT_ID%2Flocations%2Fglobal%2Fbuckets%2F_Default%2Fviews%2F_Default?jsmode=O&mods=pan_ng2&project=FLEET_HOST_PROJECT_ID

フリート スコープのコンテナログと Pod ログ

サービス オペレーターは、アクセス権のある Namespace 内のログを表示できます。特定のフリート スコープ内のすべての Namespace 内のログを表示するには、次の手順を完了します。

  1. フリート ホスト プロジェクトを選択して、Google Cloud コンソールの [チーム] セクションに移動します。

    [チーム] に移動

  2. ログを表示するチームスコープをクリックして、[ログ] タブをクリックします。

  3. [コンテナログ] または [Pod ログ] を選択して、ログビューをフィルタリングします。

スコープ内の特定の Namespace のログを表示するには、次のようにします。

  1. [チーム] ページで、チームスコープを選択して、[Namespaces] タブをクリックします。
  2. ログを表示する Namespace をクリックし、[ログ] タブをクリックします。
  3. [コンテナログ] と [Pod ログ] のいずれかを選択して、ログビューをフィルタリングします。

別の方法として、コンテナログを表示するには、次の URL の変数を入力して、ブラウザにコピーして貼り付けます。

https://console.cloud.google.com/logs/query;query=;storageScope=storage,projects%2FFLEET_HOST_PROJECT_ID%2Flocations%2Fglobal%2Fbuckets%2Ffleet-o11y-scope-SCOPE_NAME%2Fviews%2Ffleet-o11y-scope-SCOPE_NAME-k8s_container?jsmode=O&mods=pan_ng2&project=FLEET_HOST_PROJECT_ID

特定のフリート スコープで Pod ログを表示するには、次の URL の変数を入力して、ブラウザにコピーして貼り付けます。

https://console.cloud.google.com/logs/query;query=;storageScope=storage,projects%2FFLEET_HOST_PROJECT_ID%2Flocations%2Fglobal%2Fbuckets%2Ffleet-o11y-scope-SCOPE_NAME%2Fviews%2Ffleet-o11y-scope-SCOPE_NAME-k8s_pod?jsmode=O&mods=pan_ng2&project=FLEET_HOST_PROJECT_ID

ログデータを分析する方法について詳しくは、ログ エクスプローラのインターフェースをご覧ください。

フリート ロギングを無効にする

フリート ロギング機能を無効にするには、次の手順を完了します。

gcloud

  1. 次の構成を disable_logging_config.json という名前のファイルに保存します。

    {
      "loggingConfig": {}
    }
    
  2. fleetobservability 機能仕様を更新します。

    gcloud container fleet fleetobservability update \
            --logging-config=disable_logging_config.json
    

Terraform

Terraform 構成で、ログ ルーティングのすべてのモードを MODE_UNSPECIFIED に更新します。以下に例を示します。

  resource "google_gke_hub_feature" "feature" {
    name = "fleetobservability"
    location = "global"
    spec {
      fleetobservability {
        logging_config {
          default_config {
            mode = "MODE_UNSPECIFIED"
          }
          fleet_scope_logs_config {
            mode = "MODE_UNSPECIFIED"
          }
        }
      }
    }
  }

機能仕様が更新されていることを確認します。

   gcloud container fleet fleetobservability describe
  

出力には、構成で更新された fleetobservability 仕様が表示されます。

  createTime: '2022-09-30T16:05:02.222568564Z'
  membershipStates:
    projects/123456/locations/global/memberships/cluster-1:
      state:
        code: OK
        description: Fleet monitoring enabled.
        updateTime: '2023-04-03T20:22:51.436047872Z'
  name:
  projects/123456/locations/global/features/fleetobservability
  resourceState:
    state: ACTIVE
  spec:
    fleetobservability:
      loggingConfig: {}
  state:
    state: {}
  updateTime: '2023-04-03T20:38:17.719596966Z'
  

fleetobservability 仕様に変更を加えると、適用されるまでに数分かかることがあります。

フリート ロギングを無効にすると、ログシンクと除外フィルタがプロジェクトから削除されます。ただし、スコープに作成されたすべてのログバケットと、ログバケットに作成されたログビューは保持されます。フリート ホスト プロジェクトのログバケットを削除するには、バケットを削除するをご覧ください。

ログバケットの保持期間を更新する

ログバケットのデフォルトの保持期間は 30 日です。この期間を更新するには、次のコマンドを実行します。

gcloud logging buckets update fleet-o11y-scope-SCOPE_NAME --location=global --retention-days=RETENTION_DAYS

ここで

  • SCOPE_NAME はフリート スコープの名前です。

  • RETENTION_DAYS は、新しい保持期間の日数です。ログバケットの構成のオプションについては、バケットの管理をご覧ください。

バケットの保持期間を延長した場合、保持ルールはそれ以降に適用され、過去に遡った適用はありません。ログは、該当する保持期間が終了すると復元できなくなります。

API リファレンス

このセクションでは、fleetobservability オブジェクトに追加できるフィールドについて説明します。

fleetobservability

fleetobservability はフリートのオブザーバビリティ構成を定義します。

フィールド 説明 スキーマ 省略可
loggingConfig

フリート全体でフリート ロギング機能を有効にするかどうかを指定します。

指定しない場合、フリート全体でフリート ロギング機能が無効になります。

loggingConfig True

loggingConfig

loggingConfig は、フリート オブザーバビリティにおけるフリート ロギング機能の構成を定義します。

フィールド 説明 スキーマ 省略可
defaultConfig フリートのデフォルトログのログ ルーティング動作を設定します。 routingConfig True
fleetScopeLogsConfig フリート スコープのログのログ ルーティング動作を設定します。 routingConfig True

routingConfig

routingConfig は、フリート ロギング機能におけるログ ルーティング モードの構成を定義します。

フィールド 説明 スキーマ 省略可
モード

指定すると、ログ ルーティングが有効になります。未指定または MODE_UNSPECIFIED にすると、ログ ルーティングが無効になります。

COPY に設定すると、ログは宛先プロジェクトにコピーされます。

MOVE に設定すると、ログは宛先プロジェクトに移動されます。

文字列、MOVE、COPY、MODE_UNSPECIFIED のいずれか True

命名に関する制限事項

フリート オブザーバビリティが有効になっている場合、フリート オブザーバビリティ コントローラは、作成するログ オブジェクトに次の名前を予約します。望ましくないまたは予期しない動作を回避するには、独自のログバケットシンクを作成するとき、および除外フィルタを設定するときに、これらの名前の使用を避けてください。

有効になっている機能 作成するオブジェクト フリート オブザーバビリティで使用される名前
defaultConfig シンク fleet-o11y-FLEET_PROJECT_NUMBER-default
除外フィルタ fleet-o11y-FLEET_PROJECT_NUMBER-default-exclusion。この名前は、クラスタ プロジェクトの _Default シンク用に予約されています。
fleetScopeLogsConfig ログバケット fleet-o11y-scope-SCOPE_NAME
  • バケット内のコンテナログのログビュー
  • fleet-o11y-scope-SCOPE_NAME-k8s_container
  • バケット内の Pod ログのログビュー
  • fleet-o11y-scope-SCOPE_NAME-k8s_pod
    シンク fleet-o11y-FLEET_PROJECT_NUMBER-scope-SCOPE_NAME
    除外フィルタ fleet-o11y-FLEET_PROJECT_NUMBER-scope-exclusion

    トラブルシューティング

    このセクションでは、フリート ロギングに関する問題を解決する方法について説明します。

    シンク構成エラーに関するメール通知

    [ACTION REQUIRED] Cloud Logging sink configuration error in <Your GCP Project> という件名のメールを受信した場合、ログシンクのサービス アカウントにはシンクの宛先にログを書き込む権限がありません。この問題を解決するには、プロジェクト間のロギング権限の手順を行います。

    Cloud Logging UI に不明なエラー メッセージが表示される

    Cloud Logging UI に次のエラーが表示された場合は、URL に入力された project_id 変数と scope 変数が正しいことを再確認します。

    Error: There is an unknown error while executing this operation.
    

    メンバーシップが見つからないエラー

    次のエラーが表示される場合があります。

    ERROR: (gcloud.alpha.container.fleet.memberships.bindings.create) NOT_FOUND: Resource 'parent resource not found for projects/...' was not found
    

    フリートにクラスタを登録していることを確認してください。