Fehlerbehebung

Connect-Agent-Logs erfassen

Der Connect-Agent ist ein Deployment (gke-connect-agent), das Cluster mit Google verbindet. Es wird normalerweise in Ihrem Cluster im gke-connect-Namespace installiert. Das Erfassen von Logs von diesem Connect-Agent kann für die Fehlerbehebung nützlich sein.

Sie können die Logs des Agents mit folgendem Befehl abrufen:

for ns in $(kubectl get ns -o jsonpath={.items..metadata.name} -l hub.gke.io/project); do
  echo "======= Logs $ns ======="
  kubectl logs -n $ns -l app=gke-connect-agent
done

So rufen Sie Informationen zu jedem Connect-Agent ab, der in Ihren Projektclustern ausgeführt wird:

kubectl describe deployment --all-namespaces -l app=gke-connect-agent

Eine erfolgreiche Verbindung sollte Einträge wie im folgenden Beispiel haben:

2019/02/16 17:28:43.312056 dialer.go:244: dialer: dial: connected to gkeconnect.googleapis.com:443
2019/02/16 17:28:43.312279 tunnel.go:234: serve: opening egress stream...
2019/02/16 17:28:43.312439 tunnel.go:248: serve: registering endpoint="442223602236", shard="88d2bca5-f40a-11e8-983e-42010a8000b2" {"Params":{"GkeConnect":{"endpoint_class":1,"metadata":{"Metadata":{"Default":{"manifest_version":"234227867"}}}}}} ...
2019/02/16 17:28:43.312656 tunnel.go:259: serve: serving requests...

tls: oversized record Fehler

Symptom

Ein Fehler wie der folgende kann auftreten:

... dialer: dial: connection to gkeconnect.googleapis.com:443 failed after
388.080605ms: serve: egress call failed: rpc error: code = Unauthenticated
desc = transport: oauth2: cannot fetch token: Post
https://oauth2.googleapis.com/token: proxyconnect tcp: tls: oversized record
received with length 20527
Mögliche Ursachen

Das bedeutet, dass der Connect-Agent versucht, über HTTPS eine Verbindung mit einem HTTP-Proxy herzustellen. Der Connect-Agent unterstützt nur CONNECT-basierte HTTP-Proxys.

Lösung

Sie müssen Ihre Proxy-Umgebungsvariablen so neu konfigurieren:

http_proxy=http://[PROXY_URL]:[PROXY_PORT]
https_proxy=http://[PROXY_URL]:[PROXY_PORT]

oauth2: cannot fetch token Fehler

Symptom

Ein Fehler wie der folgende kann auftreten:

...  dialer: dial: connection to gkeconnect.googleapis.com:443 failed
after 388.080605ms: serve: egress call failed: rpc error: code =
Unauthenticated desc = transport: oauth2: cannot fetch token: Post
https://oauth2.googleapis.com/token: read tcp 192.168.1.40:5570->1.1.1.1:80
read: connection reset by peer
Mögliche Ursachen:

Dies kann bedeuten, dass der Upstream-HTTP-Proxy die Verbindung zurücksetzt, höchstwahrscheinlich, weil diese bestimmte URL von Ihrem HTTP-Proxy nicht zugelassen wird. Im obigen Beispiel ist 1.1.1.1:80 die HTTP-Proxyadresse.

Lösung

Achten Sie darauf, dass Ihre HTTP-Proxy-allowlist die folgenden URLs/Domains enthält:

gkeconnect.googleapis.com
oauth2.googleapis.com/token
www.googleapis.com/oauth2/v1/certs

PermissionDenied Fehler

Symptom

Ein Fehler wie der folgende kann auftreten:

tunnel.go:250: serve: recv error: rpc error: code = PermissionDenied
desc = The caller does not have permission
dialer.go:210: dialer: dial: connection to gkeconnect.googleapis.com:443
failed after 335.153278ms: serve: receive request failed: rpc error:
code = PermissionDenied desc = The caller does not have permission
dialer.go:150: dialer: connection done: serve: receive request failed:
rpc error: code = PermissionDenied desc = The caller does not have permission
dialer.go:228: dialer: backoff: 1m14.1376766s
Mögliche Ursachen

Dies bedeutet möglicherweise, dass Sie die erforderliche Rolle der Identitäts- und Zugriffsverwaltung (IAM) nicht an das Google Cloud-Dienstkonto gebunden haben, das Sie erstellt haben, um den Connect-Agent für die Verbindung mit Google zu autorisieren. Das Google Cloud-Dienstkonto erfordert die IAM-Rolle gkehub.connect

Dies kann auch auftreten, wenn Sie das Google Cloud-Dienstkonto mit demselben Namen löschen und neu erstellen. Sie müssen in diesem Fall auch die IAM-Rollenbindung löschen und neu erstellen. Weitere Informationen finden Sie unter Dienstkonten löschen und neu erstellen.

Lösung

Binden Sie die gkehub.connect-Rolle an Ihr Dienstkonto. Die Rolle gkehub.admin hat nicht die erforderlichen Berechtigungen für die Verbindung und ist nicht für die Verwendung durch Dienstkonten vorgesehen.

Für ein Projekt mit dem Namen my-project und ein Google Cloud-Dienstkonto namens gkeconnect@my-project.iam.gserviceaccount.com, führen Sie den folgenden Befehl aus, um die Rolle an das Dienstkonto zu binden:

gcloud projects add-iam-policy-binding my-project --member \
serviceAccount:gkeconnect@my-project.iam.gserviceaccount.com \
--role "roles/gkehub.connect"

Sie können die Dienstkontoberechtigungen, die auf ein Google Cloud-Dienstkonto angewendet wurden, aufrufen und überprüfen, indem Sie die Ausgabe des folgenden Befehls prüfen. Danach sollten Sie sehen, dass role: roles/gkehub.connect an das verknüpfte Google- Cloud-Dienstkonto.

gcloud projects get-iam-policy my-project

Fehler beim Binden der IAM-Rolle an das Google Cloud-Dienstkonto

Symptom

Ein Fehler wie der folgende kann auftreten:

ERROR: (gcloud.projects.add-iam-policy-binding) PERMISSION_DENIED:
Service Management API has not been used in project [PROJECT_ID] before or it
is disabled. Enable it by visiting
https://console.developers.google.com/apis/api/servicemanagement.googleapis.com/overview?project=[PROJECT_ID]
then retry. If you enabled this API recently, wait a few minutes for the
action to propagate to our systems and retry.
Mögliche Ursachen

Möglicherweise haben Sie nicht die IAM-Berechtigungen zum Ausführen des Befehls gcloud projects add-iam-policy-binding.

Lösung

Sie benötigen die Berechtigung resourcemanager.projects.setIamPolicy. Wenn Sie die Rollen Project IAM Admin, Owner oder Editor haben, sollten Sie den Befehl ausführen können. Wenn Sie durch eine interne Sicherheitsrichtlinie den Befehl nicht ausführen können, wenden Sie sich an Ihren Administrator.

Fehler aufgrund eines ungültigen Dienstkontoschlüssels

Symptom

Ein Fehler wie der folgende kann auftreten:

2020/05/08 01:22:21.435104 environment.go:214: Got ExternalID 3770f509-b89b-48c4-96e0-860bb70b3a58 from namespace kube-system.
2020/05/08 01:22:21.437976 environment.go:485: Using GCP Service Account key
2020/05/08 01:22:21.438140 gkeconnect_agent.go:50: error creating kubernetes connect agent: failed to get tunnel config: unexpected end of JSON input
Mögliche Ursachen

Diese Logs weisen darauf hin, dass dem Connect-Agent während der Installation ein ungültiger Dienstkontoschlüssel bereitgestellt wurde.

Lösung

Erstellen Sie eine neue JSON-Datei mit Anmeldedaten für das Dienstkonto und führen Sie die Schritte zum Registrieren eines Clusters aus, um den Connect-Agent neu zu installieren.

Fehler aus abgelaufenem Dienstkontoschlüssel

Symptom

Ein Fehler wie der folgende kann auftreten:

2020/05/08 01:22:21.435104 dialer.go:277: dialer: dial: connection to gkeconnect.googleapis.com:443 failed after 37.901608ms:
serve: egress call failed: rpc error: code = Unauthenticated desc = transport: oauth2: cannot fetch token: 400 Bad Request
Response: {"error":"invalid_grant","error_description":"Invalid JWT Signature."}
Mögliche Ursachen

Diese Logs zeigen an, dass der Connect-Agent Connect mit einem problematischen Dienstkontoschlüssel gewählt hat, der vom Google-Authentifizierungsdienst nicht akzeptiert wird. Die Schlüsseldatei des Dienstkontos ist möglicherweise beschädigt oder der Schlüssel ist abgelaufen.

Wie Sie prüfen, ob der Schlüssel abgelaufen ist, können Sie in der Google Cloud Console auf der Detailseite eines Dienstkontos ermitteln. In einigen Fällen hat Ihr Projekt oder Ihre Organisation eine spezielle Richtlinie, für die ein Dienstkonto standardmäßig nur eine kurze Lebensdauer hat.

Lösung

Erstellen Sie eine neue JSON-Datei mit Anmeldedaten für das Dienstkonto und führen Sie die Schritte zum Registrieren eines Clusters aus, um den Connect-Agent neu zu installieren.

Fehler aufgrund verzerrter Systemuhr

Symptom

Ein Fehler wie der folgende kann auftreten:

acceptCall: failed to parse token in req [rpc_id=1]: Token used before issued [rpc_id=1]
Mögliche Ursachen

Die Lognachricht gibt normalerweise an, dass der Cluster eine Zeitverzerrung aufweist. Das vom Cluster ausgestellte Token hat einen abweichenden Zeitstempel, daher wird das Token abgelehnt.

Lösung

Prüfen Sie, ob die Uhr nicht richtig synchronisiert wird. Sie können den date-Befehl auf Ihrem Cluster ausführen und ihn mit der Standardzeit vergleichen. Normalerweise tritt das Problem innerhalb weniger Sekunden auf. Um dieses Problem zu beheben, müssen Sie die Clusteruhr noch einmal synchronisieren.

Arbeitslasten werden in der Cloud Console nicht angezeigt

Symptome

In den Connect-Agent-Logs tritt möglicherweise folgende Fehler auf:

"https://10.0.10.6:443/api/v1/nodes" YYYY-MM-DDTHH mm:ss.sssZ http.go:86: GET
"https://10.0.10.6:443/api/v1/pods" YYYY-MM-DDTHH mm:ss.sssZ http.go:139:
Response status: "403 Forbidden" YYYY-MM-DDTHH mm:ss.sssZ http.go:139:
Response status: "403 Forbidden"`
Mögliche Ursachen

Diese Logs zeigen an, dass Google Cloud versucht, mit den Anmeldedaten, die Sie bei der Registrierung angegeben haben, auf den Cluster zuzugreifen. 403-Fehler zeigen an, dass die Anmeldedaten nicht die erforderlichen Berechtigungen für den Zugriff auf den Cluster haben.

Lösung

Überprüfen Sie, ob das Token und das Konto, an das es gebunden ist, vorhanden sind, und achten Sie darauf, dass es über die entsprechenden Berechtigungen für den Cluster verfügt.

Kontextfrist überschritten

Symptom

Ein Fehler wie der folgende kann auftreten:

2019/03/06 21:08:43.306625 dialer.go:235: dialer: dial: connecting to gkeconnect.googleapis.com:443...
2019/03/06 21:09:13.306893 dialer.go:240: dialer: dial: unable to connect to gkeconnect.googleapis.com:443: context deadline exceeded
2019/03/06 21:09:13.306943 dialer.go:183: dialer: connection done: context deadline exceeded
Mögliche Ursachen

Dieser Fehler gibt ein Low-Level-TCP-Netzwerkproblem an, bei dem der Connect-Agent nicht mit gkeconnect.googleapis.com kommunizieren kann.

Lösung

Prüfen Sie, ob Pod-Arbeitslasten in diesem Cluster aufgelöst werden können und ausgehende Verbindungen zu gkeconnect.googleapis.com über Port 443 haben.

Verbindung mit Agent unterbrochen

Symptome

In den Connect-Agent-Logs tritt möglicherweise folgende Fehler auf:

2020/10/06 18:02:34.409749 dialer.go:277: dialer: dial: connection to gkeconnect.googleapis.com:443 failed after 8m0.790286282s: serve: receive request failed: rpc error: code = Unavailable desc = transport is closing
2020/10/06 18:02:34.416618 dialer.go:207: dialer: connection done: serve: receive request failed: rpc error: code = Unavailable desc = transport is closing
2020/10/06 18:02:34.416722 dialer.go:295: dialer: backoff: 978.11948ms
2020/10/06 18:02:34.410097 tunnel.go:651: sendResponse: EOF [rpc_id=52]
2020/10/06 18:02:34.420077 tunnel.go:651: sendResponse: EOF [rpc_id=52]
2020/10/06 18:02:34.420204 tunnel.go:670: sendHalfClose: EOF [rpc_id=52]
2020/10/06 18:02:34.401412 tunnel.go:670: sendHalfClose: EOF [rpc_id=53]
Mögliche Ursachen

Die Verbindung mit Connect wird getrennt, wenn Connect Agent nicht genügend Ressourcen hat, z. B. auf kleineren AWS EC2-Instanzen wie t3.medium.

Lösung

Aktivieren Sie T3 unbegrenzt oder verwenden Sie einen Instanztyp mit mehr Ressourcen für Ihre Knotenpools.

Hub kann nicht auf das Projekt zugreifen

Symptome

Bei einigen Hub-Vorgängen (normalerweise Cluster-Registrierung) wird möglicherweise ein Fehler wie der folgende angezeigt:

ERROR: (gcloud.container.hub.memberships.register) failed to initialize Default Feature
"authorizer", the Hub service account may not have access to your project
Mögliche Ursachen

Die Verknüpfung des Standarddienstkontos von Hub mit gcp-sa-gkehub kann versehentlich aufgehoben werden. Der Hub-Dienst-Agent ist eine IAM-Rolle, mit der dem Dienstkonto Berechtigungen zum Verwalten von Clusterressourcen erteilt werden. Wenn Sie diese Rollenbindung aus dem Dienstkonto entfernen, wird die Verknüpfung des Standarddienstkontos mit dem Projekt aufgehoben. Dies kann verhindern, dass Sie Cluster und andere Clustervorgänge registrieren können.

Mit dem gcloud-Tool oder der Cloud Console können Sie prüfen, ob das Dienstkonto aus Ihrem Projekt entfernt wurde. Wenn im Befehl oder im Dashboard unter Ihren Dienstkonten gcp-sa-gkehub nicht angezeigt wird, wurde die Verknüpfung mit dem Dienstkonto aufgehoben.

gcloud

Führen Sie dazu diesen Befehl aus:

gcloud projects get-iam-policy PROJECT_NAME

Dabei ist PROJECT_NAME der Name des Projekts, in dem Sie den Cluster registrieren möchten.

Console

Rufen Sie in der Cloud Console die Seite IAM & Verwaltung auf.

Lösung

Wenn Sie die Rollenbindung des Hub-Dienst-Agents entfernt haben, führen Sie die folgenden Befehle aus, um die Rollenbindung wiederherzustellen:

PROJECT_NUMBER=$(gcloud projects describe PROJECT_NAME --format "value(projectNumber)")
gcloud projects add-iam-policy-binding PROJECT_NAME \
  --member "serviceAccount:service-${PROJECT_NUMBER}@gcp-sa-gkehub.iam.gserviceaccount.com" \
  --role roles/gkehub.serviceAgent

Mit dem folgenden Befehl bestätigen Sie, dass die Rollenbindung erteilt wurde:

gcloud projects get-iam-policy PROJECT_NAME

Wenn der Name des Dienstkontos zusammen mit der Rolle gkehub.serviceAgent angezeigt wird, wurde die Rollenbindung erteilt. Beispiel:

- members:
  - serviceAccount:service-1234567890@gcp-sa-gkehub.iam.gserviceaccount.com
  role: roles/gkehub.serviceAgent

Fehler bei der Registrierung eines GKE-Clusters in einem anderen Projekt als Hub

Symptome

Wenn Sie einen GKE-Cluster von einem anderen Projekt als dem Hub-Projekt registrieren, wird möglicherweise ein Fehler wie der folgende angezeigt:

ERROR: (gcloud.container.hub.memberships.register) hub default service account
does not have access to the GKE cluster project for //container.googleapis.com/v1/projects/my-project/zones/zone-a/clusters/my-cluster
Mögliche Ursachen

Das Hub-Standarddienstkonto hat nicht die erforderlichen Berechtigungen im Projekt des GKE-Clusters.

Lösung

Weisen Sie dem Hub-Standarddienstkonto die erforderlichen Berechtigungen zu, bevor Sie den Cluster registrieren.

Fehler beim Deaktivieren der Hub API

Symptome

Beim Versuch, die Hub-API (gkehub.googleapis.com) zu deaktivieren, tritt möglicherweise ein Fehler wie der folgende auf:

Not ready to deactivate the service on this project; ensure there are no more resources managed by this service.
Mögliche Ursachen

Es sind noch Cluster vorhanden, die in Google Cloud (Mitgliedschaften) oder Umgebungs-Features angemeldet sind. Alle APIs und Funktionen müssen zuerst abgemeldet oder deaktiviert werden, bevor die API deaktiviert werden kann.

  • Zum Aufrufen Ihrer aktuell registrierten Cluster folgen Sie der Anleitung unter Registrierte Cluster aufrufen.

  • So rufen Sie alle aktiven Funktionen der Umgebung auf:

gcloud und cURL

$ curl -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    https://gkehub.googleapis.com/v1alpha1/projects/PROJECT_NAME/locations/global/features

Dabei ist PROJECT_NAME der Name des Projekts, in dem Sie die Hub API deaktivieren möchten.

Cloud Console

Wenn Sie Anthos in Ihrem Projekt aktiviert haben, rufen Sie die Seite Features in der Cloud Console auf. Als AKTIVIERT aufgeführte Funktionen sind aktive Features auf der Umgebung.

Lösung

Zuerst heben Sie die Registrierung von Clustern auf, die weiterhin bei Ihrer Projektumgebung registriert sind. Bevor Sie einige Funktionen deaktivieren können, müssen alle Cluster abgemeldet sein.

Deaktivieren Sie anschließend alle Funktionen auf der Umgebung. Derzeit ist dies nur mit der Hub REST API möglich.

  1. Deaktivieren Sie die Features der Umgebungsebene, die Sie für Ihr Projekt aktiviert haben

    $ gcloud alpha container hub FEATURE_COMMAND disable
    
  2. Funktion zum Autorisieren und Messen von Funktionen deaktivieren, die standardmäßig aktiviert sind.

    $ curl -H "Authorization: Bearer $(gcloud auth print-access-token)" \
        -X "DELETE" \
        https://gkehub.googleapis.com/v1alpha1/projects/PROJECT_NAME/locations/global/features/FEATURE
    

    Dabei ist FEATURE der Name des Features, das deaktiviert werden soll (z. B. authorizer oder metering).

Fehlende Clusterberechtigungen beim Registrieren eines Clusters

Symptom:

Beim Versuch, einen Cluster mit einem Nutzerkonto oder einem Google Cloud-Dienstkonto zu registrieren, wird möglicherweise ein Fehler wie der folgende angezeigt:

ERROR: (gcloud.container.hub.memberships.register) ResponseError: code=403, message=Required "container.clusters.get" permission(s) for "projects/my-project/zones/zone-a/clusters/my-cluster"
Mögliche Ursache:

Das Konto, das versucht, den Cluster zu registrieren, hat nicht die erforderlichecluster-admin Rolle "rollenbasierte Zugriffssteuerung" (Role-based Access Control, RBAC) im Cluster.

Lösung:

Weisen Sie dem Konto die RBAC-Rolle cluster-admin zu, bevor Sie den Cluster registrieren.

Unterstützung anfordern

Gehen Sie so vor, um ein Ticket beim Google Cloud-Support für Connect einzureichen:

  1. Stellen Sie eine Supportanfrage beim Google Cloud-Support.
  2. Speichern Sie die Connect-Logs gemäß der Anleitung unter Connect-Agent-Logs erfassen.
  3. Hängen Sie die Connect-Agent-Logs an Ihren Fall an.