Nehmen Sie an der Umfrage "State of DevOps" 2021 teil und gestalten Sie die Zukunft des Softwarebetriebs.

Mehrmandantenfähiges Logging in GKE

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 Logs Router von Cloud Logging. Mit Logs Router können Sie den Logfluss in Ihrem Google Cloud-Projekt und den Logfluss zu anderen Google Cloud-Projekten steuern.

Zum Erstellen von mandantenspezifischen Logs legt der Clusteradministrator eine Senke für den Export von Logeinträgen in einen Log-Bucket an, der im Projekt des Mandanten erstellt wird. Sie können optional auch eine Ausschlussregel anlegen, um zu verhindern, dass Mandantenlogs im Haupt-GKE-Projekt gespeichert werden.

Das folgende Diagramm bietet eine Übersicht über eine mehrmandantenfähige Logging-Architektur mit Log-Buckets:

Mehrmandantenfähige GKE-Architektur

Zu der Architektur gehören:

  1. Ein Log-Bucket, der in jedem Mandantenprojekt erstellt wird.
  2. Eine Logsenke, die für jeden Mandanten-Namespace erstellt wird.
  3. Ein Dienstkonto, das automatisch für jede Logsenke erstellt wird.
  4. Ausschlussregeln (optional), die verhindern, dass Logs im Haupt-GKE-Projekt dupliziert werden.

In den folgenden Abschnitten wird gezeigt, wie Sie eine solche Architektur erstellen.

Vorbereitung

Mehrmandantenfähiges Logging konfigurieren

Sie können das Logging für mehrere Mandanten mit dem gcloud-Befehlszeilentool oder der Google Cloud Console konfigurieren.

gcloud

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

  1. Variabeln festlegen:

    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 den Log-Bucket im Mandantenprojekt:

    gcloud logging buckets create gke-$TENANT_NAMESPACE-log-bucket \
        --project=$TENANT_PROJECT \
        --location=global \
        --description="Log bucket for $TENANT_NAMESPACE namespace from $MAIN_PROJECT"
    

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

  4. Erstellen Sie eine Logsenke im Haupt-GKE-Projekt:

    gcloud logging sinks create gke-$TENANT_NAMESPACE-sink \
    logging.googleapis.com/projects/$TENANT_PROJECT/locations/global/buckets/gke-$TENANT_NAMESPACE-log-bucket \
        --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 den Log-Bucket sendet, den Sie im vorherigen Schritt erstellt haben.

    Es kann vorkommen, dass Sie einen restriktiveren --log-filter verwenden müssen. Wenn z. B. Cluster und Mandanten denselben Namespace haben, können Sie einen Clusterfilter hinzufügen.

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

  5. Rufen Sie das Dienstkonto aus der Senke im Hauptprojekt ab und weisen Sie es einer Variablen zu. Sie benötigen dieses Dienstkonto, um im nächsten Schritt Berechtigungen zu erteilen.

    export SERVICE_ACCOUNT=$(gcloud logging sinks describe gke-$TENANT_NAMESPACE-sink \
        --project=$MAIN_PROJECT \
        --format='value(writerIdentity)')
    
  6. Weisen Sie dem von der Senke verwendeten Dienstkonto die Rolle logging.bucketWriter zu. Das Hauptprojekt benötigt diese Berechtigung zum Schreiben in den Bucket im Mandantenprojekt.

     gcloud projects add-iam-policy-binding $TENANT_PROJECT \
         --member=$SERVICE_ACCOUNT --role='roles/logging.bucketWriter' \
         --condition="expression=resource.name.endsWith(\"locations/global/buckets/gke-$TENANT_NAMESPACE-log-bucket\"),title=Log bucket writer for $TENANT_NAMESPACE,description=Grants logging.bucketWriter 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.

  7. Erstellen Sie optional eine Ausschlussregel im Bucket _Default. Damit wird verhindert, dass die Mandantenlogs auch in den Haupt-Bucket geschrieben werden. Wenn Sie diesen Befehl nicht ausführen, sind im _Default-Bucket des Hauptprojekts und im Mandanten-Bucket doppelte Logs vorhanden.

    gcloud logging sinks update _Default --project=$MAIN_PROJECT \
        --add-exclusion="name=gke-$TENANT_NAMESPACE-default-exclusion,description=\"Exclusion rule 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 im Mandantenprojekt einen Log-Bucket:

    1. Rufen Sie das Menü Logspeicher auf:

      Zum "Logspeicher"

    2. Klicken Sie oben auf der Seite auf das Drop-down-Menü des Projekts und wählen Sie das Mandantenprojekt aus.

    3. Klicken Sie auf Log-Bucket erstellen.

    4. Geben Sie unter Name einen Namen und unter Beschreibung eine Beschreibung für den Bucket ein.

    5. Wählen Sie im Drop-down Log-Bucket-Region auswählen eine Region aus.

    6. Klicken Sie auf Bucket erstellen. Der neue Bucket wird in der Liste Log-Bucket angezeigt.

  2. Erstellen Sie die Logsenke im Haupt-GKE-Projekt:

    1. Klicken Sie oben auf der Seite auf das Drop-down-Menü des Projekts und wählen Sie das Haupt-GKE-Projekt aus.
    2. Wählen Sie im linken Menü Logs Router aus. Sie werden dann zur Seite „Logs Router“ weitergeleitet.
    3. Klicken Sie auf Senke erstellen. Das Fenster Select sink wird angezeigt.
    4. Wählen Sie im Fenster Select sink die Option Cloud Logging aus.
    5. Geben Sie unter Name einen Namen und danach eine Beschreibung für die Senke ein und klicken Sie auf Weiter.
    6. Wählen Sie im Drop-down-Menü Select sink service die Option Anderes Projekt aus.
    7. Fügen Sie im Feld Sink destination das folgende Ziel hinzu: logging.googleapis.com/projects/MAIN_PROJECT_ID/locations/LOG_BUCKET_REGION/buckets/BUCKET_NAME

      Dabei gilt:

      • MAIN_PROJECT_ID: ist die Projekt-ID Ihres Hauptprojekts
      • LOG_BUCKET_REGION: ist die Region, in der Sie den Log-Bucket erstellt haben
      • BUCKET_NAME: ist der Name des Log-Buckets, den Sie im vorherigen Abschnitt erstellt haben
    8. Klicken Sie auf Next (Weiter).

    9. Fügen Sie unter Einbeziehungsfilter erstellen den Filter resource.labels.namespace_name="TENANT_NAMESPACE" hinzu. Ersetzen Sie TENANT_NAMESPACE durch den Namen des Namespace Ihres Mandantenprojekts.

      Gelegentlich müssen Sie einen restriktiveren „Einschließen“-Filter verwenden. Wenn z. B. Cluster und Mandanten denselben Namespace haben, können Sie einen Clusterfilter hinzufügen.

    10. Klicken Sie auf Senke erstellen. Die neue Senke wird in der Liste Logs Routing-Senken angezeigt.

  3. Rufen Sie das Dienstkonto aus der Senke im Hauptprojekt ab. Sie benötigen dieses Dienstkonto, um im nächsten Schritt Berechtigungen zu erteilen.

    1. Ermitteln Sie auf der Seite „Logs Router“ die Logsenke des Hauptprojekts.
    2. Klicken Sie neben dieser Senke auf Weiter und wählen Sie Senkendetails ansehen aus.
    3. Kopieren Sie den Wert neben Writer Identity: serviceAccount:.
  4. Weisen Sie dem Dienstkonto, das von der Senke des Mandanten verwendet wird, die Rolle Log-Bucket-Autor zu. Das Hauptprojekt benötigt diese Berechtigung zum Schreiben in den Bucket im Mandantenprojekt.

    1. Rufen Sie in der Cloud Console die Seite IAM auf.

      Seite „IAM“

    2. Klicken Sie auf Hinzufügen.

    3. Fügen Sie im Feld Neue Mitglieder das Dienstkonto der Senke hinzu.

    4. Wählen Sie im Drop-down-Menü Rolle auswählen die Option Logging und anschließend Log-Bucket-Autor aus.

    5. Klicken Sie auf Speichern.

  5. Erstellen Sie optional eine Ausschlussregel im Bucket _Default. Damit wird verhindert, dass die Mandantenlogs auch in den Haupt-Bucket geschrieben werden. Wenn Sie diesen Befehl nicht ausführen, sind im _Default-Bucket des Hauptprojekts und im Mandanten-Bucket doppelte Logs vorhanden.

    1. Rufen Sie in der Cloud Console die Seite Logs Router auf.

      Zum "Logs Router"

    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 den Wert resource.labels.namespace_name=\"TENANT_NAMESPACE"\ ein.

    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. Rufen Sie im Mandantenprojekt die Seite Loganzeige in der Cloud Console auf.

    Loganzeige aufrufen

  2. Klicken Sie auf Bereich eingrenzen.

  3. Wählen Sie Bereich nach Speicher und dann den Bucket des Mandanten aus.

    gke-TENANT_NAMESPACE-log-bucket
    

Bereinigen

Sie können die Objekte, die Sie für das mehrmandantenfähige Logging erstellt haben, mit gcloud oder mit der 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. Wenn Sie im Hauptprojekt eine Ausschlussregel erstellt haben, entfernen Sie diese:

    gcloud logging sinks update _Default \
       --project=$MAIN_PROJECT \
       --remove-exclusions=gke-$TENANT_NAMESPACE-default-exclusion
    
  3. Entfernen Sie die Rolle bucketWriter aus dem Dienstkonto:

    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.bucketWriter' \
        --all
    
  4. Löschen Sie die Logsenke:

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

    gcloud logging buckets delete gke-$TENANT_NAMESPACE-log-bucket \
        --project=$TENANT_PROJECT \
        --location=global
    
  6. Löschen Sie den Namespace:

    kubectl delete namespace $TENANT_NAMESPACE
    

Console

  1. Wenn Sie im Hauptprojekt eine Ausschlussregel erstellt haben, entfernen Sie diese:

    1. Rufen Sie in der Cloud Console die Seite Logs Router auf.

      Zum "Logs Router"

    2. Klicken Sie neben dem Bucket _Default auf Weiter .

    3. Wählen Sie Senke bearbeiten aus.

    4. Klicken Sie neben der von Ihnen erstellten Ausschlussregel auf Löschen.

    5. Klicken Sie auf Senke aktualisieren.

  2. Entfernen Sie im Hauptprojekt das Dienstkonto:

    1. Rufen Sie in der Cloud Console die Seite IAM auf.

      Seite „IAM“

    2. Wählen Sie das Dienstkonto der Senke aus.

    3. Klicken Sie auf Entfernen.

    4. Klicken Sie im Bestätigungsfenster auf Bestätigen.

  3. Löschen Sie im Mandantenprojekt die Logsenke:

    1. Klicken Sie oben auf der Seite auf das Drop-down-Menü des Projekts und wählen Sie das Mandanten-GKE-Projekt aus.
    2. Wählen Sie im Menü „Logging“ die Option Logs Router aus.

      Zum "Logs Router"

    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.

  4. Löschen Sie im Hauptprojekt den Log-Bucket:

    1. Klicken Sie oben auf der Seite auf das Drop-down-Menü des Projekts und wählen Sie das Haupt-GKE-Projekt aus.
    2. Wählen Sie im Menü „Logging“ die Option Logspeicher aus.

      Zum "Logspeicher"

    3. Klicken Sie zum Löschen eines Buckets auf Mehr.

    4. Klicken Sie auf Bucket löschen.

    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.
  • Es gibt eine feste Beschränkung von 50 Ausschlussregeln pro Log-Bucket. Wenn Sie mehr als 50 Mandanten benötigen, muss die Ausschlussregel für den Bucket _Default überarbeitet werden. Alternativ haben Sie folgende Möglichkeiten:

    • Erstellen Sie mit folgendem Befehl eine einzelne Ausschlussregel, die alle Namespaces außerhalb des Systems und alle nicht standardmäßigen Namespaces herausfiltert:

      gcloud logging sinks update _Default \
      --project=$MAIN_PROJECT \
      --add-exclusion="name=gke-all-tenant-default-exclusion,description=\"Exclusion rule 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 Ausschlussregel erstellen.

Nächste Schritte