Fehlerbehebung beim Logging in GKE


Auf dieser Seite erfahren Sie, wie Sie Probleme mit GKE-Logging untersuchen und beheben.

Wenn Sie weitere Unterstützung benötigen, wenden Sie sich an den Cloud Customer Care.

Fehlende Cluster-Logs in Cloud Logging

Prüfen, ob das Logging im Projekt aktiviert ist

  1. Aktivierte Dienste auflisten:

    gcloud services list --enabled --filter="NAME=logging.googleapis.com"
    

    Die folgende Ausgabe zeigt an, dass das Logging für das Projekt aktiviert ist:

    NAME                    TITLE
    logging.googleapis.com  Cloud Logging API
    

    Optional: Prüfen Sie die Logs in der Loganzeige, um festzustellen, wer die API deaktiviert hat und wann sie deaktiviert wurde:

    protoPayload.methodName="google.api.serviceusage.v1.ServiceUsage.DisableService"
    protoPayload.response.services="logging.googleapis.com"
    
  2. Wenn das Logging deaktiviert ist, aktivieren Sie das Logging:

    gcloud services enable logging.googleapis.com
    

Prüfen, ob das Logging für den Cluster aktiviert ist

  1. Listen Sie die Cluster auf:

    gcloud container clusters list \
        --project=PROJECT_ID \
        '--format=value(name,loggingConfig.componentConfig.enableComponents)' \
        --sort-by=name | column -t
    

    Ersetzen Sie Folgendes:

    • PROJECT_ID: Ihre Google Cloud Projekt-ID.

    Die Ausgabe sieht in etwa so aus:

    cluster-1              SYSTEM_COMPONENTS
    cluster-2              SYSTEM_COMPONENTS;WORKLOADS
    cluster-3
    

    Wenn der Wert für Ihren Cluster leer ist, ist das Logging deaktiviert. Beispiel: In dieser Ausgabe ist fürcluster-3 das Logging deaktiviert.

  2. Aktivieren Sie das Cluster-Logging, wenn Sie auf NONE gesetzt sind:

    gcloud container clusters update CLUSTER_NAME  \
        --logging=SYSTEM,WORKLOAD \
        --location=COMPUTE_LOCATION
    

    Dabei gilt:

Prüfen, ob Knoten in den Knotenpools den Cloud Logging-Zugriffsbereich haben

Einer der folgenden Bereiche ist erforderlich, damit Knoten Logs in Cloud Logging schreiben können:

  • https://www.googleapis.com/auth/logging.write
  • https://www.googleapis.com/auth/cloud-platform
  • https://www.googleapis.com/auth/logging.admin
  1. Prüfen Sie die Bereiche, die in jedem Knotenpool im Cluster konfiguriert sind:

    gcloud container node-pools list --cluster=CLUSTER_NAME \
        --format="table(name,config.oauthScopes)" \
        --location COMPUTE_LOCATION
    

    Dabei gilt:

    Migrieren Sie Ihre Arbeitslasten vom alten Knotenpool zum neu erstellten Knotenpool und überwachen Sie den Fortschritt.

  2. Erstellen Sie neue Knotenpools mit dem richtigen Logging-Bereich:

    gcloud container node-pools create NODE_POOL_NAME \
        --cluster=CLUSTER_NAME \
        --location=COMPUTE_LOCATION \
        --scopes="gke-default"
    

    Dabei gilt:

Cluster mit Knotendienstkonten identifizieren, denen wichtige Berechtigungen fehlen

Um Cluster mit Knotendienstkonten zu identifizieren, für die wichtige Berechtigungen fehlen, verwenden Sie die GKE-Empfehlungen vom NODE_SA_MISSING_PERMISSIONS-Empfehlungsuntertyp:

  • Google Cloud Console verwenden. Rufen Sie die Seite Kubernetes-Cluster auf und prüfen Sie in der Spalte Benachrichtigungen für bestimmte Cluster, ob die Empfehlung Wichtige Berechtigungen gewähren angezeigt wird.
  • Verwenden Sie die gcloud CLI oder die Recommender API und geben Sie den Untertyp NODE_SA_MISSING_PERMISSIONS für den Recommender an.

    Führen Sie den folgenden Befehl aus, um Empfehlungen abzufragen:

    gcloud recommender recommendations list \
        --recommender=google.container.DiagnosisRecommender \
        --location LOCATION \
        --project PROJECT_ID \
        --format yaml \
        --filter="recommenderSubtype:NODE_SA_MISSING_PERMISSIONS"
    

Es kann bis zu 24 Stunden dauern, bis die Empfehlung angezeigt wird. Eine ausführliche Anleitung finden Sie unter Statistiken und Empfehlungen ansehen.

Um diese Empfehlung umzusetzen, weisen Sie dem Dienstkonto des Knotens die Rolle roles/container.defaultNodeServiceAccount zu.

Mit diesem Script können Sie alle Knotendienstkonten ermitteln, denen für Cluster im Standardmodus in einem Projekt wichtige Berechtigungen fehlen.

#!/bin/bash

# Set your project ID
project_id=PROJECT_ID
project_number=$(gcloud projects describe "$project_id" --format="value(projectNumber)")
declare -a all_service_accounts
declare -a sa_missing_permissions

# Function to check if a service account has a specific permission
# $1: project_id
# $2: service_account
# $3: permission
service_account_has_permission() {
  local project_id="$1"
  local service_account="$2"
  local permission="$3"

  local roles=$(gcloud projects get-iam-policy "$project_id" \
          --flatten="bindings[].members" \
          --format="table[no-heading](bindings.role)" \
          --filter="bindings.members:\"$service_account\"")

  for role in $roles; do
    if role_has_permission "$role" "$permission"; then
      echo "Yes" # Has permission
      return
    fi
  done

  echo "No" # Does not have permission
}

# Function to check if a role has the specific permission
# $1: role
# $2: permission
role_has_permission() {
  local role="$1"
  local permission="$2"
  gcloud iam roles describe "$role" --format="json" | \
  jq -r ".includedPermissions" | \
  grep -q "$permission"
}


echo "--- 1. List all service accounts in all GKE node pools"
printf "%-60s| %-40s| %-40s| %-10s| %-20s\n" "service_account" "project_id" "cluster_name" "cluster_location" "nodepool_name"
while read cluster; do
  cluster_name=$(echo "$cluster" | awk '{print $1}')
  cluster_location=$(echo "$cluster" | awk '{print $2}')

  while read nodepool; do
    nodepool_name=$(echo "$nodepool" | awk '{print $1}')

    while read nodepool_details; do
      service_account=$(echo "$nodepool_details" | awk '{print $1}')

      if [[ "$service_account" == "default" ]]; then
        service_account="${project_number}-compute@developer.gserviceaccount.com"
      fi
      if [[ -n "$service_account" ]]; then
        printf "%-60s| %-40s| %-40s| %-10s| %-20s\n" $service_account $project_id  $cluster_name $cluster_location $nodepool_name
        all_service_accounts+=( ${service_account} )
      else
        echo "cannot find service account" for node pool "$project_id\t$cluster_name\t$cluster_location\t$nodepool_details"
      fi
    done <<< "$(gcloud container node-pools describe "$nodepool_name" --cluster "$cluster_name" --zone "$cluster_location" --project "$project_id" --format="table[no-heading](config.serviceAccount)")"
  done <<< "$(gcloud container node-pools list --cluster "$cluster_name" --zone "$cluster_location" --project "$project_id" --format="table[no-heading](name)")"
done <<< "$(gcloud container clusters list --project "$project_id" --format="value(name,location)")"

echo "--- 2. Check if service accounts have permissions"
unique_service_accounts=($(echo "${all_service_accounts[@]}" | tr ' ' '\n' | sort -u | tr '\n' ' '))

echo "Service accounts: ${unique_service_accounts[@]}"
printf "%-60s| %-40s| %-40s| %-20s\n" "service_account" "has_logging_permission" "has_monitoring_permission" "has_performance_hpa_metric_write_permission"
for sa in "${unique_service_accounts[@]}"; do
  logging_permission=$(service_account_has_permission "$project_id" "$sa" "logging.logEntries.create")
  monitoring_permission=$(service_account_has_permission "$project_id" "$sa" "monitoring.timeSeries.create")
  performance_hpa_metric_write_permission=$(service_account_has_permission "$project_id" "$sa" "autoscaling.sites.writeMetrics")
  printf "%-60s| %-40s| %-40s| %-20s\n" $sa $logging_permission $monitoring_permission $performance_hpa_metric_write_permission

  if [[ "$logging_permission" == "No" || "$monitoring_permission" == "No" || "$performance_hpa_metric_write_permission" == "No" ]]; then
    sa_missing_permissions+=( ${sa} )
  fi
done

echo "--- 3. List all service accounts that don't have the above permissions"
if [[ "${#sa_missing_permissions[@]}" -gt 0 ]]; then
  printf "Grant roles/container.defaultNodeServiceAccount to the following service accounts: %s\n" "${sa_missing_permissions[@]}"
else
  echo "All service accounts have the above permissions"
fi

Knotendienstkonten identifizieren, denen wichtige Berechtigungen in einem Cluster fehlen

GKE verwendet IAM-Dienstkonten, die an Ihre Knoten angehängt sind, um Systemaufgaben wie Logging und Monitoring auszuführen. Diese Knotendienstkonten müssen in Ihrem Projekt mindestens die Rolle Kubernetes Engine Default Node Service Account (roles/container.defaultNodeServiceAccount) haben. Standardmäßig verwendet GKE das Compute Engine-Standarddienstkonto, das automatisch in Ihrem Projekt erstellt wird, als Knotendienstkonto.

Wenn Ihre Organisation die Einschränkung der Organisationsrichtlinie iam.automaticIamGrantsForDefaultServiceAccounts erzwingt, erhält das Standard-Compute Engine-Dienstkonto in Ihrem Projekt möglicherweise nicht automatisch die erforderlichen Berechtigungen für GKE.

  • Prüfen Sie zum Identifizieren des Problems, ob in Ihrem Cluster 401-Fehler in der Systemprotokollierungslast auftreten:

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

    Wenn die Ausgabe true ist, treten bei der Systemauslastung 401-Fehler auf, was auf fehlende Berechtigungen hinweist. Wenn die Ausgabe false ist, überspringen Sie die restlichen Schritte und versuchen Sie es mit einer anderen Fehlerbehebung.

  1. So finden Sie den Namen des Dienstkontos, das Ihre Knoten verwenden:

    Console

    1. Rufen Sie die Seite Kubernetes-Cluster auf:

      Zur Seite "Kubernetes-Cluster"

    2. Klicken Sie in der Clusterliste auf den Namen des Clusters, den Sie prüfen möchten.
    3. Führen Sie je nach Betriebsmodus des Clusters einen der folgenden Schritte aus:
      • Suchen Sie bei Clustern im Autopilot-Modus im Abschnitt Sicherheit nach dem Feld Dienstkonto.
      • Führen Sie für Cluster im Standardmodus die folgenden Schritte aus:
        1. Klicken Sie auf den Tab Knoten.
        2. Klicken Sie in der Tabelle Knotenpools auf den Namen eines Knotenpools. Die Seite Knotenpooldetails wird geöffnet.
        3. Suchen Sie im Abschnitt Sicherheit nach dem Feld Dienstkonto.

    Wenn der Wert im Feld Dienstkonto default ist, verwenden Ihre Knoten das Compute Engine-Standarddienstkonto. Wenn der Wert in diesem Feld default nicht ist, verwenden Ihre Knoten ein benutzerdefiniertes Dienstkonto. Eine Anleitung zum Zuweisen der erforderlichen Rolle zu einem benutzerdefinierten Dienstkonto finden Sie unter IAM-Dienstkonten mit geringsten Berechtigungen verwenden.

    gcloud

    Führen Sie für Cluster im Autopilot-Modus den folgenden Befehl aus:

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

    Führen Sie für Cluster im Standardmodus den folgenden Befehl aus:

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

    Wenn die Ausgabe default ist, verwenden Ihre Knoten das Compute Engine-Standarddienstkonto. Wenn die Ausgabe default nicht ist, verwenden Ihre Knoten ein benutzerdefiniertes Dienstkonto. Eine Anleitung zum Zuweisen der erforderlichen Rolle an ein benutzerdefiniertes Dienstkonto finden Sie unter IAM-Dienstkonten mit geringsten Berechtigungen verwenden.

  2. So weisen Sie dem Compute Engine-Standarddienstkonto die Rolle roles/container.defaultNodeServiceAccount zu:

    Console

    1. Rufen Sie die Begrüßungsseite auf:

      Zur Begrüßungsseite

    2. Klicken Sie im Feld Projektnummer auf In Zwischenablage kopieren.
    3. Rufen Sie die IAM-Seite auf.

      IAM aufrufen

    4. Klicken Sie auf Zugriff erlauben.
    5. Geben Sie im Feld Neue Hauptkonten den folgenden Wert an:
      PROJECT_NUMBER-compute@developer.gserviceaccount.com
      Ersetzen Sie PROJECT_NUMBER durch die kopierte Projektnummer.
    6. Wählen Sie im Menü Rolle auswählen die Rolle Kubernetes Engine Default Node Service Account aus.
    7. Klicken Sie auf Speichern.

    gcloud

    1. So finden Sie Ihre Google Cloud Projektnummer:
      gcloud projects describe PROJECT_ID \
          --format="value(projectNumber)"

      Ersetzen Sie PROJECT_ID durch Ihre Projekt-ID.

      Die Ausgabe sieht in etwa so aus:

      12345678901
      
    2. Weisen Sie dem Compute Engine-Standarddienstkonto die Rolle roles/container.defaultNodeServiceAccount zu:
      gcloud projects add-iam-policy-binding PROJECT_ID \
          --member="serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
          --role="roles/container.defaultNodeServiceAccount"

      Ersetzen Sie PROJECT_NUMBER durch die Projektnummer aus dem vorherigen Schritt.

Prüfen, dass die Cloud Logging Write-API-Kontingente nicht erreicht wurden

Überzeugen Sie sich, dass Sie die API-Write-kontingente für Cloud Logging nicht erreicht haben.

  1. Rufen Sie in der Google Cloud Console die Seite Kontingente auf.

    Kontingente aufrufen

  2. Filtern Sie die Tabelle nach "Cloud Logging API".

  3. Schauen Sie nach, dass Sie keines der Kontingente erreicht haben.

GKE-Logging-Probleme mit gcpdiag beheben

Wenn Sie unvollständige Logs in Ihrem GKE-Cluster fehlen oder diese abrufen, verwenden Sie das gcpdiag-Tool zur Fehlerbehebung.

gcpdiag ist ein Open-Source-Tool. Es ist kein offiziell unterstütztes Google Cloud -Produkt. Mit dem Tool gcpdiag können Sie Probleme mit Google Cloud-Projekten identifizieren und beheben. Weitere Informationen finden Sie im gcpdiag-Projekt auf GitHub.

Wenn Logs aus dem GKE-Cluster fehlen oder unvollständig sind, untersuchen Sie mögliche Ursachen, indem Sie sich auf die folgenden zentralen Konfigurationseinstellungen konzentrieren, die für ordnungsgemäße Logging-Funktionen wichtig sind:

  • Logging auf Projektebene: Sorgt dafür, dass im Google Cloud-Projekt, in dem sich der GKE-Cluster befindet, die Cloud Logging API aktiviert ist.
  • Logging auf Clusterebene: Überprüft, ob das Logging explizit in der Konfiguration des GKE-Clusters aktiviert ist.
  • Knotenpoolberechtigungen: Bestätigt, dass für die Knoten in den Knotenpools des Clusters der Bereich "Cloud Logging-Schreibvorgänge" aktiviert ist, sodass sie Logdaten senden können.
  • Dienstkontoberechtigungen: Prüft, ob das von den Knotenpools verwendete Dienstkonto die erforderlichen IAM-Berechtigungen für die Interaktion mit Cloud Logging hat. Insbesondere ist die Rolle "roles/logging.logWriter" normalerweise erforderlich.
  • Schreibkontingente für die Cloud Logging API: Verifiziert, dass die Schreibkontingente für die Cloud Logging API im angegebenen Zeitraum nicht überschritten wurden.

Google Cloud Console

  1. Führen Sie den folgenden Befehl aus und kopieren Sie ihn.
  2. gcpdiag runbook gke/logs \
        --parameter project_id=PROJECT_ID \
        --parameter name=GKE_NAME \
        --parameter location=LOCATION
  3. Öffnen Sie die Google Cloud Console und aktivieren Sie Cloud Shell.
  4. Cloud Console öffnen
  5. Fügen Sie den kopierten Befehl ein.
  6. Führen Sie den Befehl gcpdiag aus, um das Docker-Image gcpdiag herunterzuladen und dann Diagnoseprüfungen durchzuführen. Folgen Sie gegebenenfalls der Anleitung für die Ausgabe, um fehlgeschlagene Prüfungen zu beheben.

Docker

Sie können gcpdiag mit einem Wrapper ausführen, der gcpdiag in einem Docker-Container startet. Docker oder Podman muss installiert sein.

  1. Kopieren Sie den folgenden Befehl und führen Sie ihn auf Ihrer lokalen Workstation aus.
    curl https://gcpdiag.dev/gcpdiag.sh >gcpdiag && chmod +x gcpdiag
  2. Führen Sie den Befehl gcpdiag aus.
    ./gcpdiag runbook gke/logs \
        --parameter project_id=PROJECT_ID \
        --parameter name=GKE_NAME \
        --parameter location=LOCATION

Verfügbare Parameter für dieses Runbook ansehen

Ersetzen Sie Folgendes:

  • PROJECT_ID: Die ID des Projekts, das die Ressource enthält.
  • GKE_NAME ist der Name des GKE-Clusters.
  • LOCATION: Die Zone oder Region des GKE-Clusters.

Nützliche Flags:

Eine Liste und Beschreibung aller gcpdiag-Tool-Flags finden Sie in der gcpdiag-Nutzungsanleitung.

Nächste Schritte

Wenn Sie weitere Unterstützung benötigen, wenden Sie sich an den Cloud Customer Care.