マルチテナント ロギングを設定する


このページでは、Google Kubernetes Engine(GKE)クラスタのマルチテナント ロギングを構成する方法について説明します。

一般的に、複数のチームが 1 つの GKE クラスタを共有します。クラスタを共有すると、サービス ディスカバリが容易になり、セキュリティも簡素化されるなどの多くの利点が得られます。つまり、クラスタ管理者が管理するクラスタの数が少なくなります。ただし、個々のアプリケーション チームは、多くの場合それぞれ別々のプロジェクトを持っています。メインの GKE クラスタを持つ一方で Namespace が別々となるこの構造は、マルチテナンシーと呼ばれます。アプリケーション チームのプロジェクトはテナントと呼ばれます。

GKE クラスタ管理者は、Google Cloud を使用することで、クラスタのログがメインの GKE プロジェクト内に残り、テナントログがテナント プロジェクトに配布されるシステムを作成できます。この方法でログを構成するには、ログルーターを使用します。ログルーターを使用すると、Google Cloud プロジェクト内でのログのフローと、サポートされている宛先へのログのルーティングを制御できます。

テナント固有のログを作成するには、クラスタ管理者がシンクを作成して、ログエントリを各テナントのプロジェクトに転送します。各テナント プロジェクトで、個々のチームがログの保存方法と使用方法を制御できます。たとえば、ログベースの指標とログベースのアラートを構成することで、ログをモニタリングできます。

メインの GKE プロジェクトの _Default シンクに除外フィルタを含めることをおすすめします。除外フィルタを使用すると、メインの GKE プロジェクトとテナント プロジェクトの両方でテナントログが取り込まれなくなります。

前提条件

マルチテナント ロギングを構成する

マルチテナント ロギングの構成には、Google Cloud CLI または Google Cloud コンソールを使用できます。

gcloud

GKE クラスタにマルチテナント ロギングを構成する手順は次のとおりです。

  1. 次の環境変数を設定します。

    export TENANT_NAMESPACE="TENANT_NAMESPACE"
    export MAIN_PROJECT="MAIN_PROJECT_ID"
    export TENANT_PROJECT="TENANT_PROJECT_ID"
    

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

    • TENANT_NAMESPACE: テナント プロジェクトの名前空間の名前
    • MAIN_PROJECT_ID: メイン プロジェクトのプロジェクト ID
    • TENANT_PROJECT_ID: テナント プロジェクトのプロジェクト ID
  2. マルチテナント クラスタに名前空間を作成します。

    kubectl create namespace $TENANT_NAMESPACE
    
  3. メインの GKE プロジェクトにログシンクを作成します。

    gcloud logging sinks create gke-$TENANT_NAMESPACE-sink \
    logging.googleapis.com/projects/$TENANT_PROJECT \
        --project=$MAIN_PROJECT \
        --log-filter=resource.labels.namespace_name="$TENANT_NAMESPACE" \
        --description="Log sink to $TENANT_PROJECT for $TENANT_NAMESPACE namespace"
    

    このコマンドは、$TENANT_NAMESPACE 名前空間に関連するすべてのログをテナント プロジェクトに送信するログシンクを作成します。

    必要に応じて、より制限の厳しい --log-filter を使用してください。たとえば、クラスタとテナントが同じ名前空間である場合は、クラスタ フィルタを追加します。

    これらのフィールドの詳細については、gcloud logging sinks create API ドキュメントをご覧ください。

  4. メイン プロジェクトのシンクから書き込み ID を取得して、環境変数に割り当てます。

    export SERVICE_ACCOUNT=$(gcloud logging sinks describe gke-$TENANT_NAMESPACE-sink \
        --project=$MAIN_PROJECT \
        --format='value(writerIdentity)')
    
  5. シンクで使用するサービス アカウントにログ書き込みlogging.bucketWriter)ロールを付与します。次のコマンドは、テナント プロジェクトへのログの書き込み権限をメイン プロジェクトに付与します。

     gcloud projects add-iam-policy-binding $TENANT_PROJECT \
         --member=$SERVICE_ACCOUNT --role='roles/logging.logWriter' \
         --condition="expression=resource.name.endsWith(\"projects/$TENANT_PROJECT\"),title=Log writer for $TENANT_NAMESPACE,description=Grants Logs Writer role to service account $SERVICE_ACCOUNT used by gke-$TENANT_NAMESPACE-sink"
    

    これらのフィールドの詳細については、gcloud projects add-iam-policy-binding API ドキュメントをご覧ください。

  6. 必要に応じて、メイン プロジェクトの _Default バケットにログをルーティングするシンクの除外フィルタを作成します。_Default バケットで除外フィルタを作成しない場合、ルーティングされたログはメイン プロジェクトの _Default バケットとテナントログ バケットの両方に表示されます。除外フィルタの作成手順は次のとおりです。

    gcloud logging sinks update _Default --project=$MAIN_PROJECT \
        --add-exclusion="name=gke-$TENANT_NAMESPACE-default-exclusion,description=\"Exclusion filter on the _Default bucket for $TENANT_NAMESPACE\",filter=resource.labels.namespace_name=\"$TENANT_NAMESPACE\""
    

    これらのフィールドの詳細については、gcloud logging sinks update API ドキュメントをご覧ください。

コンソール

GKE にマルチテナント ロギングを実装する手順は次のとおりです。

  1. メイン プロジェクトにログシンクを作成します。

    1. Google Cloud コンソールのプロジェクト選択ツールを使用して、メインの GKE プロジェクトを選択します。
    2. Google Cloud コンソールで、[ログルーター] ページに移動します。

      [ログルーター] に移動

      検索バーを使用してこのページを検索する場合は、小見出しが「Logging」の結果を選択します。

    3. [ログルーター] ページで、[シンクの作成] をクリックします。
    4. シンクの名前説明を入力し、[次へ] をクリックします。
    5. [シンクサービスの選択] メニューで [他のプロジェクト] を選択します。
    6. [シンクのエクスポート先] フィールドに、次の宛先を追加します。

      logging.googleapis.com/projects/TENANT_PROJECT_ID
      

      TENANT_PROJECT_ID は、テナント プロジェクトのプロジェクト ID に置き換えます。

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

    8. [包含フィルタの作成] で、次のフィルタを追加します。

      resource.labels.namespace_name="TENANT_NAMESPACE"
      

      TENANT_NAMESPACE は、テナント プロジェクトの名前空間の名前に置き換えます。

      より限定的な包含フィルタを使用する必要がある場合もあります。たとえば、クラスタとテナントに同じ名前空間がある場合、特定のクラスタのログエントリのみを含める句を追加することを検討してください。

    9. [シンクを作成] をクリックします。新しいシンクが [ログルーター シンク] のリストに表示されます。

  2. シンクの書き込み ID をクリップボードにコピーします。

    1. [ログルーター] ページで、ログシンクを見つけます。
    2. そのシンクの [その他] をクリックし、[シンクの詳細を表示する] を選択します。
    3. [シンクの詳細] ペインで、[書き込み ID] フィールドを見つけて、値をクリップボードにコピーします。コピーした値から serviceAccount: を削除します。
  3. テナント プロジェクトで、メイン プロジェクトのシンクで使用されるサービス アカウントにログ書き込みroles/logging.logWriter)ロールを付与します。メイン プロジェクトがテナント プロジェクトにログを書き込むには、この権限が必要です。

    1. Google Cloud コンソールの [IAM] ページに移動します。

      [IAM] に移動

      検索バーを使用してこのページを検索する場合は、小見出しが [IAM と管理者] である結果を選択します。

    2. [アクセス権を付与] をクリックします。
    3. [新しいプリンシパル] フィールドに、シンクのサービス アカウントを追加します。
    4. [ロールを選択] プルダウンから [ロギング] を選択し、[ログ書き込み] を選択します。
    5. [保存] をクリックします。
  4. 必要に応じて、メイン プロジェクトの _Default バケットに除外フィルタを作成して、テナント プロジェクトに転送されたログがメイン プロジェクトの _Default ログバケットに書き込まれないようにします。

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

      [ログルーター] に移動

      検索バーを使用してこのページを検索する場合は、小見出しが「Logging」の結果を選択します。

    2. _Default バケットの隣にあるその他の操作アイコン をクリックし、[シンクを編集] を選択します。
    3. [シンクに含めないログの選択] セクションで、[除外設定を追加] をクリックします。
    4. フィルタ名を入力します。
    5. [除外フィルタの作成] ボックスに、次の内容を追加します。

      resource.labels.namespace_name="TENANT_NAMESPACE"
      
    6. [シンクを更新] をクリックします。

テナントログを確認する

TENANT_NAMESPACE を使用するワークロードの使用を開始すると、テナント プロジェクトがテナント固有のログを受信していることを確認できます。

  1. Google Cloud コンソールのプロジェクト選択ツールを使用して、テナント プロジェクトを選択します。
  2. Google Cloud コンソールで、[ログ エクスプローラ] ページに移動します。

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

    検索バーを使用してこのページを検索する場合は、小見出しが「Logging」の結果を選択します。

  3. [query-editor] フィールドで、次のクエリを実行します。

    resource.labels.namespace_name="TENANT_NAMESPACE"
    

    [クエリ結果] ペインに、メイン プロジェクトから転送されたテナント固有のログが表示されます。

テナントログを使用する

テナント プロジェクトでは、各チームがログのルーティング、保存、分析方法を管理できます。ログがテナント プロジェクトに転送された後、個々のアプリケーション チームは、Logging バケットなどのサポート対象の宛先にログを転送するか、Pub/Sub を使用してサードパーティの宛先にログを転送できます。ログエントリの転送の詳細については、サポートされている宛先にログを転送するをご覧ください。

個々のアプリケーション チームは、ログの内容またはログから得られる指標に基づいてアラートを設定できます。詳細については、ログのモニタリングをご覧ください。

クリーンアップ

マルチテナント ロギング用に作成したオブジェクトは、gcloud または Google Cloud コンソールで削除できます。

gcloud

マルチテナント ロギング用に作成したオブジェクトを削除するには、次の手順を行います。

  1. 次のコマンドを簡略化する変数を設定します。

    export TENANT_NAMESPACE="TENANT_NAMESPACE"
    export MAIN_PROJECT="MAIN_PROJECT_ID"
    export TENANT_PROJECT="TENANT_PROJECT_ID"
    

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

    • TENANT_NAMESPACE: テナント プロジェクトの名前空間の名前
    • MAIN-PROJECT-ID: メイン プロジェクトのプロジェクト ID
    • TENANT-PROJECT-ID: テナント プロジェクトのプロジェクト ID
  2. テナント プロジェクトのサービス アカウントからログ書き込みroles/logging.logWriter)ロールを削除します。

    export SERVICE_ACCOUNT=$(gcloud logging sinks describe gke-$TENANT_NAMESPACE-sink \
        --project=$MAIN_PROJECT | \
        --format='value(writerIdentity)'
    
    gcloud projects remove-iam-policy-binding $TENANT_PROJECT \
        --member=$SERVICE_ACCOUNT \
        --role='roles/logging.logWriter' \
        --all
    
  3. ログシンクを削除します。

    gcloud logging sinks delete gke-$TENANT_NAMESPACE-sink \
        --project=$MAIN_PROJECT
    
  4. 名前空間を削除します。

    kubectl delete namespace $TENANT_NAMESPACE
    

コンソール

  1. テナント プロジェクトで、サービス アカウントからログ書き込みroles/logging.logWriter)ロールを削除します。

    1. Google Cloud コンソールの [IAM] ページに移動します。

      [IAM] に移動

      検索バーを使用してこのページを検索する場合は、小見出しが [IAM と管理者] である結果を選択します。

    2. 削除するサービス アカウントで [プリンシパルを編集] をクリックします。
    3. [アクセス権の編集] パネルで、ログ書き込みロールの横にある [ロールを削除] をクリックして、[保存] をクリックします。
  2. メイン プロジェクトでログシンク(ベータ版)を削除します。

    1. Google Cloud コンソールのプロジェクト選択ツールを使用して、テナント GKE プロジェクトを選択します。
    2. Google Cloud コンソールで、[ログルーター] ページに移動します。

      [ログルーター] に移動

      検索バーを使用してこのページを検索する場合は、小見出しが「Logging」の結果を選択します。

    3. 削除するシンクのその他の操作アイコン をクリックします。
    4. [シンクを削除] を選択します。
    5. 確認パネルで [削除] をクリックします。

制限事項

マルチテナント ロギングには次の制限事項があります。

  • プロジェクトあたりのログシンク数の割り当ては 200 です。200 を超えるテナントが必要な場合は、サポートケースを作成して、割り当ての増加をリクエストしてください。
  • ログバケットごとの除外フィルタの上限は 50 です。50 個を超えるテナントを設定する必要がある場合は、_Default バケットの除外フィルタのアプローチを変更する必要があります。また、次の方法もあります。

    • 下のコマンドを使用して、システム以外またはデフォルト以外の Namespace をすべて対象外にする単一の除外フィルタを作成する。

      gcloud logging sinks update _Default \
      --project=$MAIN_PROJECT \
      --add-exclusion="name=gke-all-tenant-default-exclusion,description=\"Exclusion filter on the _Default bucket for all tenants\",filter=resource.labels.namespace_name !~ \"kube\" AND resource.labels.namespace_name !~ \"system\ AND resource.labels.namespace_name != \"Default\""
      
    • 除外フィルタを作成しないで、テナント プロジェクトとメイン プロジェクトの間でログを複製する。

次のステップ