Mehrmandantenfähiges Logging einrichten


Auf dieser Seite wird gezeigt, wie Sie das mehrmandantenfähige Logging für Google Kubernetes Engine-Cluster (GKE) konfigurieren.

Häufig verwenden mehrere Teams einen einzelnen GKE-Cluster. Die gemeinsame Nutzung eines Clusters bietet verschiedene Vorteile, darunter eine einfachere Diensterkennung und eine vereinfachte Sicherheit. Sie bedeutet auch, dass Clusteradministratoren weniger Cluster verwalten müssen. Die einzelnen Anwendungsteams haben jedoch oft eigene gesonderte Projekte. Eine solche Struktur mit einem Haupt-GKE-Cluster, aber mit separaten Namespaces für jedes Anwendungsteam wird als Mehrmandantenfähigkeit bezeichnet. Das einzelne Projekt eines Anwendungsteams wird Mandant genannt.

Mit Google Cloud können GKE-Clusteradministratoren ein System erstellen, in dem Logs für den Cluster im Haupt-GKE-Projekt verbleiben und Mandantenlogs an die Mandantenprojekte verteilt werden. Um Ihre Logs so zu konfigurieren, verwenden Sie Log Router. Mit dem Log Router können Sie den Logfluss in Ihrem Google Cloud-Projekt und die Weiterleitung von Logs an unterstützte Ziele steuern.

Zum Erstellen von mandantenspezifischen Logs legt der Clusteradministrator eine Senke für die Weiterleitung von Logeinträgen an das Projekt jedes Mandanten an. In jedem Mandantenprojekt können einzelne Teams steuern, wie die Logs gespeichert und verwendet werden. Dazu gehört beispielsweise das Monitoring der Logs durch Konfiguration logbasierter Messwerte und logbasierter Benachrichtigungen.

Wir empfehlen, dass _Default-Senken in Haupt-GKE-Projekten einen Ausschlussfilter enthalten. Der Ausschlussfilter verhindert, dass Mandantenlogs sowohl im Haupt-GKE-Projekt als auch im Mandantenprojekt aufgenommen werden.

Vorbereitung

Mehrmandantenfähiges Logging konfigurieren

Sie können das mehrmandantenfähige Logging mit der Google Cloud CLI oder der Google Cloud Console konfigurieren.

gcloud

Zum Konfigurieren des mehrmandantenfähigen Loggings für GKE-Cluster führen Sie die folgenden Schritte aus:

  1. Legen Sie die folgenden Umgebungsvariablen fest:

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

    Dabei gilt:

    • TENANT_NAMESPACE: ist der Name des Mandanten-Projekt-Namespace
    • MAIN_PROJECT_ID: ist die Projekt-ID Ihres Hauptprojekts
    • TENANT_PROJECT_ID: ist die Projekt-ID Ihres Mandantenprojekts
  2. Erstellen Sie in Ihrem Mehrmandantencluster einen Namespace:

    kubectl create namespace $TENANT_NAMESPACE
    
  3. Erstellen Sie eine Logsenke im Haupt-GKE-Projekt:

    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"
    

    Mit diesem Befehl wird eine Logsenke erstellt, die alle Logs, die sich auf den Namespace $TENANT_NAMESPACE beziehen, an das Mandantenprojekt sendet.

    Möglicherweise müssen Sie einen restriktiveren --log-filter verwenden. Wenn z. B. Cluster und Mandanten denselben Namespace haben, fügen Sie einen Clusterfilter hinzu.

    Weitere Informationen zu diesen Feldern finden Sie in der API-Dokumentation zu gcloud logging sinks create.

  4. Rufen Sie die Identität des Autors aus der Senke im Hauptprojekt ab und weisen Sie sie einer Umgebungsvariable zu.

    export SERVICE_ACCOUNT=$(gcloud logging sinks describe gke-$TENANT_NAMESPACE-sink \
        --project=$MAIN_PROJECT \
        --format='value(writerIdentity)')
    
  5. Weisen Sie dem von der Senke verwendeten Dienstkonto die Rolle Logautor (logging.bucketWriter) zu. Der folgende Befehl gewährt dem Hauptprojekt Berechtigungen zum Schreiben von Logs in das Mandantenprojekt:

     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"
    

    Weitere Informationen zu diesen Feldern finden Sie in der API-Dokumentation zu gcloud projects add-iam-policy-binding.

  6. Erstellen Sie optional einen Ausschlussfilter für die Senke, der Logs an den Bucket _Default des Hauptprojekts weiterleitet. Wenn Sie keinen Ausschlussfilter für den Bucket _Default erstellen, werden die weitergeleiteten Logs sowohl im Bucket _Default des Hauptprojekts als auch im Mandanten-Log-Bucket angezeigt. So erstellen Sie einen Ausschlussfilter:

    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\""
    

    Weitere Informationen zu diesen Feldern finden Sie in der API-Dokumentation zu gcloud logging sinks update.

Console

Zum Implementieren des mehrmandantenfähigen Loggings für GKE führen Sie die folgenden Schritte aus:

  1. Erstellen Sie die Logsenke im Hauptprojekt:

    1. Verwenden Sie die Projektauswahl der Google Cloud Console, um das GKE-Hauptprojekt auszuwählen.
    2. Wählen Sie im Navigationsbereich der Google Cloud Console Logging und anschließend Log Router aus:

      Zum Logrouter

    3. Klicken Sie auf der Seite Log Router auf Senke erstellen.
    4. Geben Sie unter Name einen Namen und danach eine Beschreibung für die Senke ein und klicken Sie auf Weiter.
    5. Wählen Sie im Menü Senkendienst auswählen die Option Anderes Projekt aus.
    6. Fügen Sie im Feld Senkenziel das folgende Ziel hinzu:

      logging.googleapis.com/projects/TENANT_PROJECT_ID
      

      Ersetzen Sie dabei TENANT_PROJECT_ID durch die Projekt-ID Ihres Zielprojekts.

    7. Klicken Sie auf Next (Weiter).

    8. Fügen Sie unter Einschlussfilter erstellen den Filter hinzu:

      resource.labels.namespace_name="TENANT_NAMESPACE"
      

      Ersetzen Sie TENANT_NAMESPACE durch den Namen des Namespace Ihres Mandantenprojekts.

      Sie können einen restriktiveren „Einschließen“-Filter verwenden. Wenn Ihr Cluster und der Mandant beispielsweise denselben Namespace haben, sollten Sie eine Klausel hinzufügen, die nur Logeinträge für einen bestimmten Cluster zulässt.

    9. Klicken Sie auf Senke erstellen. Die neue Senke wird in der Liste Log Router-Senken angezeigt.

  2. Kopieren Sie die Identität des Autors der Senke in die Zwischenablage:

    1. Suchen Sie auf der Seite Log Router die Logsenke.
    2. Klicken Sie für diese Senke auf Mehr und wählen Sie Senkendetails ansehen aus.
    3. Suchen Sie im Bereich Senkendetails nach dem Feld Identität des Autors und kopieren Sie den Wert in die Zwischenablage. Lassen Sie serviceAccount: im kopierten Wert weg.
  3. Weisen Sie im Mandantenprojekt dem Dienstkonto, das von der Senke des Hauptprojekts verwendet wird, die Rolle Log-Autor (roles/logging.logWriter) zu. Das Hauptprojekt benötigt diese Berechtigung zum Schreiben von Logs in das Mandantenprojekt.

    1. Wählen Sie im Navigationsbereich der Google Cloud Console IAM aus:

      Rufen Sie IAM auf.

    2. Klicken Sie auf Zugriff erlauben.
    3. Fügen Sie im Feld Neue Hauptkonten das Dienstkonto der Senke hinzu.
    4. Wählen Sie im Drop-down-Menü Rolle auswählen die Option Logging und anschließend Log-Autor aus.
    5. Klicken Sie auf Speichern.
  4. Erstellen Sie optional einen Ausschlussfilter im Bucket _Default des Hauptprojekts, um zu verhindern, dass an ein Mandantenprojekt weitergeleitete Logs in den Log-Bucket _Default im Hauptprojekt geschrieben werden:

    1. Wählen Sie im Navigationsbereich der Google Cloud Console Logging und anschließend Log Router aus:

      Zum Logrouter

    2. Klicken Sie neben dem Bucket _Default auf Weiter und wählen Sie Senke bearbeiten aus.
    3. Klicken Sie im Abschnitt Auswählen zum Filtern aus der Senke auf Ausnahme hinzufügen.
    4. Geben Sie einen Filternamen ein.
    5. Geben Sie im Feld Ausschlussfilter erstellen Folgendes ein:

      resource.labels.namespace_name="TENANT_NAMESPACE"
      
    6. Klicken Sie auf Senke aktualisieren.

Mandantenlogs prüfen

Nachdem Sie mit der Verwendung von Arbeitslasten begonnen haben, die TENANT_NAMESPACE verwenden, können Sie prüfen, ob das Mandantenprojekt mandantenspezifische Logs empfängt:

  1. Wählen Sie das Mandantenprojekt mithilfe der Projektauswahl der Google Cloud Console aus.
  2. Wählen Sie im Navigationsbereich der Google Cloud Console Logging und anschließend Log-Explorer aus:

    Zum Log-Explorer

  3. Führen Sie im Abfrageeditor im Feld die folgende Abfrage aus:

    resource.labels.namespace_name="TENANT_NAMESPACE"
    

    Im Bereich Abfrageergebnisse sollten mandantenspezifische Logs angezeigt werden, die vom Hauptprojekt weitergeleitet wurden.

Mandantenlogs verwenden

In den Mandantenprojekten kann jedes Team steuern, wie die Logs weitergeleitet, gespeichert und analysiert werden. Nachdem die Logs an die Mandantenprojekte weitergeleitet wurden, können die einzelnen Anwendungsteams ihre Logs mithilfe von Pub/Sub an unterstützte Ziele wie Logging-Buckets oder an Ziele von Drittanbietern weiterleiten. Informationen zum Weiterleiten von Logeinträgen finden Sie unter Logs an unterstützte Ziele weiterleiten.

Einzelne Anwendungsteams können auch Benachrichtigungen basierend auf dem Inhalt der Logs oder auf aus Logs abgeleiteten Messwerten einrichten. Weitere Informationen finden Sie unter Logs überwachen.

Bereinigen

Sie können die Objekte, die Sie für das mehrmandantenfähige Logging erstellt haben, mit gcloud oder mit der Google Cloud Console entfernen.

gcloud

So entfernen Sie die Objekte, die Sie für das mehrmandantenfähige Logging erstellt haben:

  1. Legen Sie Variablen fest, um die folgenden Befehle zu vereinfachen:

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

    Dabei gilt:

    • TENANT_NAMESPACE: ist der Name des Mandanten-Projekt-Namespace
    • MAIN-PROJECT-ID: ist die Projekt-ID Ihres Hauptprojekts
    • TENANT-PROJECT-ID: ist die Projekt-ID Ihres Mandantenprojekts
  2. Entfernen Sie die Rolle Log-Autor (roles/logging.logWriter) aus dem Dienstkonto im Mandantenprojekt:

    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. Löschen Sie die Logsenke:

    gcloud logging sinks delete gke-$TENANT_NAMESPACE-sink \
        --project=$MAIN_PROJECT
    
  4. Löschen Sie den Namespace:

    kubectl delete namespace $TENANT_NAMESPACE
    

Console

  1. Entfernen Sie im Mandantenprojekt die Rolle Logs Writer (roles/logging.logWriter) aus dem Dienstkonto:

    1. Wählen Sie im Navigationsbereich der Google Cloud Console IAM aus:

      Rufen Sie IAM auf.

    2. Klicken Sie für das Dienstkonto, das Sie löschen möchten, auf Hauptkonto bearbeiten.
    3. Klicken Sie im Bereich Bearbeitungszugriff neben der Rolle des Logautors auf Rolle löschen und dann auf Speichern.
  2. Löschen Sie im Hauptprojekt die Logsenke:

    1. Verwenden Sie die Projektauswahl der Google Cloud Console, um das GKE-Projekt des Mandanten auszuwählen.
    2. Wählen Sie im Navigationsbereich der Google Cloud Console Logging und anschließend Log Router aus:

      Zum Logrouter

    3. Klicken Sie zum Löschen einer Senke auf Mehr.
    4. Wählen Sie Senke löschen aus.
    5. Klicken Sie im Bestätigungsfeld auf Löschen.

Beschränkungen

Für das mehrmandantenfähige Logging gelten folgende Beschränkungen:

  • Das Kontingent für die Anzahl der Logsenken pro Projekt beträgt 200. Wenn Sie mehr als 200 Mandanten benötigen, können Sie eine Kontingenterhöhung anfordern. Dafür müssen Sie eine Supportanfrage erstellen.
  • Pro Log-Bucket gilt ein Limit von 50 Ausschlussfiltern. Wenn Sie mehr als 50 Mandanten benötigen, muss die Ausschlussfilter für den Bucket _Default überarbeitet werden. Alternativ könnten Sie Folgendes tun:

    • Erstellen Sie mit folgendem Befehl einen einzelnen Ausschlussfilter, der alle Namespaces außerhalb des Systems und alle nicht standardmäßigen Namespaces ausschließt:

      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\""
      
    • Duplizieren Sie Logs zwischen dem Mandantenprojekt und dem Hauptprojekt, indem Sie keine Ausschlussfilter erstellen.

Nächste Schritte