Risolvi i problemi di connessione dei cluster

Questa pagina descrive come risolvere gli errori comuni che potresti riscontrare durante la registrazione dei cluster in un parco risorse o la connessione a cluster esterni a Google Cloud utilizzando la console Google Cloud, Google Cloud CLI o kubectl tramite il gateway di connessione.

I cluster e i cluster on-premise su altri cloud pubblici dipendono dall'agente Connect per stabilire e mantenere una connessione tra il cluster e il progetto Google Cloud e per gestire le richieste Kubernetes. Se vengono visualizzati errori come "Agente non raggiungibile" oppure "Impossibile connettersi al piano di controllo del cluster" questo potrebbe indicare un problema con l'agente Connect.

Raccolta dei log dell'agente Connect in corso...

Quando registri un cluster all'esterno di Google Cloud, questo utilizza l'agente Connect per gestire la comunicazione tra il cluster e il progetto host del parco risorse. L'agente Connect è un deployment, gke-connect-agent, tipicamente installato nel cluster nello spazio dei nomi gke-connect. Raccolta di log da questo agente Connect in corso... può essere utile per la risoluzione dei problemi di registrazione e connessione.

Puoi recuperare i log dell'agente eseguendo questo comando (regola il conteggio delle righe, se necessario):

kubectl logs -n gke-connect -l app=gke-connect-agent --tail=-1

per ottenere informazioni su ogni agente Connect in esecuzione nel tuo progetto. cluster:

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

Una connessione riuscita dovrebbe avere voci simili all'esempio seguente:

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...

Raccolta dei log di GKE Identity Service

L'ispezione dei log di GKE Identity Service può essere utile in caso di problemi con Google Gruppi o con l'assistenza di terze parti per Connect Gateway. Questo metodo di generazione dei log è applicabile solo ai cluster in deployment Google Distributed Cloud su VMware o bare metal.

  1. Aumenta il livello di dettaglio dei log di GKE Identity Service apportando una modifica alla risorsa personalizzata clientconfig con il seguente comando:

    kubectl edit deployment -n anthos-identity-service
    

    e aggiungendo un flag vmodule sotto il campo containers in questo modo:

    spec:
      containers:
      ...
      - command:
        - --vmodule=cloud/identity/hybrid/charon/*=9
    
  2. Riavvia il pod GKE Identity Service eliminandolo con il comando seguente:

    kubectl delete pods -l k8s-app=ais -n anthos-identity-service
    

    Un pod dovrebbe rialzarsi entro pochi secondi.

  3. Una volta riavviato il pod, esegui il comando originale che restituiva risposta imprevista per compilare i log dei pod di GKE Identity Service con ulteriori dettagli.

  4. Salva l'output di questi log in un file utilizzando il seguente comando:

    kubectl logs -l k8s-app=ais -n anthos-identity-service --tail=-1 > gke_id_service_logs.txt
    

Se nei log dei pod di GKE Identity Service mancano gruppi previsti, verifica che la configurazione del cluster sia corretta. Se si verificano altri problemi relativi al servizio di identità GKE, consulta Risolvere i problemi di accesso degli utenti o Risolvere i problemi di configurazione a livello di parco risorse.

tls: oversized record errori

Sintomo

Potrebbe verificarsi un errore simile al seguente:

... 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
Cause possibili

Ciò può significare che l'agente Connect sta tentando di connettersi tramite HTTPS a un proxy. L'agente Connect supporta solo HTTP basato su CONNECT proxy.

Risoluzione

Devi riconfigurare le variabili di ambiente proxy come segue:

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

oauth2: cannot fetch token errori

Sintomo

Potrebbe verificarsi un errore simile al seguente:

...  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
Cause possibili

Ciò può significare che il proxy HTTP upstream reimposterà la connessione, perché questo particolare URL non è consentito dal tuo proxy HTTP. Nell'esempio: sopra, 1.1.1.1:80 è l'indirizzo del proxy HTTP.

Risoluzione

Verifica che la lista consentita del proxy HTTP includa i seguenti URL/domini:

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

Errori di arresto anomalo e riavvio del pod Connect Agent

Sintomo

Potresti riscontrare il messaggio "Agente non raggiungibile" intermittente nella console Google Cloud per il cluster e/o potresti notare che il pod si è riavviato più volte:

$ kubectl get pods -n gke-connect
NAME                                                READY   STATUS    RESTARTS   AGE
gke-connect-agent-20230706-03-00-6b8f75dd58-dzwmt   1/1     Running   5          99m

Per risolvere i problemi di questo comportamento, descrivi il pod per vedere se il suo ultimo stato era terminata a causa di un errore di memoria insufficiente (OOMKilled).:

  kubectl describe pods/gke-connect-agent-20230706-03-00-6b8f75dd58-dzwmt -n gke-connect
        <some details skipped..>
        Last State:     Terminated
        Reason:       OOMKilled
Cause possibili
Per impostazione predefinita, i pod dell'agente Connect hanno un limite di RAM di 256 MiB. Se il cluster ha molti carichi di lavoro, è possibile che alcune richieste e risposte non possono essere gestiti come previsto.
Risoluzione

Aggiorna il deployment dell'agente Connect e assegnagli un limite di memoria più elevato, ad esempio:

containers:
  name: gke-connect-agent-20230706-03-00
  resources:
    limits:
      memory: 512Mi

PermissionDenied errori

Sintomo

Potrebbe verificarsi un errore simile al seguente:

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
Cause possibili

Ciò può significare che non hai associato il ruolo Identity and Access Management (IAM) richiesto al Account di servizio Google Cloud che hai creato per autorizzare Collega l'agente per connetterti a Google. Il servizio Google Cloud richiede il ruolo IAM gkehub.connect.

Questo può succedere anche se elimini e ricrei Google Cloud un account di servizio con lo stesso nome. Devi anche eliminare e ricreare associazione del ruolo IAM in questo caso. Consulta Eliminare e ricreare gli account di servizio per ulteriori informazioni.

Risoluzione

Associa il ruolo gkehub.connect al tuo account di servizio (tieni presente che Il ruolo gkehub.admin non dispone delle autorizzazioni appropriate per connettersi e non deve essere utilizzato dagli account di servizio).

Ad esempio, per un progetto chiamato my-project e un account Google Cloud all'account di servizio gkeconnect@my-project.iam.gserviceaccount.com, avresti dovuto Esegui questo comando per associare il ruolo all'account di servizio:

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

Puoi visualizzare e verificare che le autorizzazioni dell'account di servizio siano state applicate a un account di servizio Google Cloud esaminando l'output seguente e dovresti vedere l'icona role: roles/gkehub.connect associate all'account di servizio Google Cloud associato.

gcloud projects get-iam-policy my-project

Errore durante l'associazione del ruolo IAM all'account di servizio Google Cloud

Sintomo

Potrebbe verificarsi un errore simile al seguente:

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.
Cause possibili

Potresti non disporre delle autorizzazioni IAM per eseguire il comando gcloud projects add-iam-policy-binding.

Risoluzione

Devi avere l'autorizzazione resourcemanager.projects.setIamPolicy Se hai i ruoli Project IAM Admin, Owner o Editor, dovresti essere in grado di eseguire il comando. Se un criterio di sicurezza interna ti impedisce di eseguendo il comando, rivolgiti all'amministratore.

Errore dovuto a una chiave dell'account di servizio non valida

Sintomo

Potrebbe verificarsi un errore simile al seguente:

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
Cause possibili

Questi log indicano che all'agente Connect è stato fornito un indirizzo non valido chiave dell'account di servizio durante dell'installazione.

Risoluzione

Crea un nuovo elemento File JSON contenente le credenziali degli account di servizio, quindi reinstalla l'agente Connect seguendo i passaggi registrare un cluster.

Errore relativo alla chiave dell'account di servizio scaduta

Sintomo

Potrebbe verificarsi un errore simile al seguente:

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."}
Cause possibili

Questi log indicano che l'agente Connect stava chiamando Connect con un chiave dell'account di servizio non valida. Il file della chiave dell'account di servizio potrebbe contenere errori oppure la chiave potrebbe avere scaduto.

Per verificare se la chiave è scaduta, utilizza la console Google Cloud per elencare le chiavi degli account di servizio e le relative date di scadenza.

Risoluzione

Crea un nuovo elemento File JSON contenente le credenziali degli account di servizio, quindi reinstalla l'agente Connect seguendo i passaggi registrare un cluster.

Errore dovuto all'inclinazione dell'orologio di sistema

Sintomo

Potrebbe verificarsi un errore simile al seguente:

acceptCall: failed to parse token in req [rpc_id=1]: Token used before issued [rpc_id=1]
Cause possibili

Il messaggio di log solitamente indica che esiste un disallineamento dell'orologio nel cluster. Il token emesso dal cluster ha un timestamp non sincronizzato, quindi il token rifiutato.

Risoluzione

Per controllare se l'orologio non è sincronizzato correttamente, puoi eseguire il comando date il tuo cluster e confrontarlo con l'ora standard. Di solito alcuni secondi la deviazione causerà questo problema. Per risolvere il problema, sincronizza nuovamente nell'orologio del cluster.

Impossibile visualizzare i carichi di lavoro nella console Google Cloud

Sintomi

Nei log di Connect Agent potresti notare i seguenti errori:

"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"`
Cause possibili

Questi log indicano che Google Cloud sta tentando di accedere utilizzando le credenziali che hai fornito durante la registrazione. Errori 403 indicare che le credenziali non hanno le autorizzazioni necessarie per accedere nel cluster.

Risoluzione

Verifica che il token e l'account siano associati e che siano le autorizzazioni appropriate sul cluster.

Scadenza contesto superata

Sintomo

Potrebbe verificarsi un errore simile al seguente:

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
Cause possibili

Questo errore indica un problema di rete TCP di basso livello in cui L'agente Connect non può parlare con gkeconnect.googleapis.com.

Risoluzione

Verifica che i carichi di lavoro dei pod all'interno di questo cluster possano essere risolti e che siano in uscita connettività a gkeconnect.googleapis.com sulla porta 443.

La connessione dell'agente non riesce a intermittenza

Sintomi

Nei log di Connect Agent potresti notare i seguenti errori:

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]
Cause possibili

La connessione a Connect si chiude quando l'agente Connect non avere risorse sufficienti, ad esempio su istanze AWS EC2 più piccole come t3.medium.

Risoluzione

Se utilizzi AWS e il tipo di istanza T3, abilita T3 senza limiti o utilizza un tipo di istanza con più risorse per i tuoi pool di nodi.

Il parco risorse non può accedere al progetto

Sintomi

Durante alcune operazioni del parco risorse (di solito la registrazione del cluster), potresti osservare un errore simile al seguente:

ERROR: (gcloud.container.hub.memberships.register) failed to initialize Feature
"authorizer", the fleet service account (service-PROJECT_NUMBER@gcp-sa-gkehub.iam.gserviceaccount.com) may not have access to your project
Cause possibili

L'account di servizio predefinito del parco risorse, gcp-sa-gkehub, potrebbe diventare per errore slegato da un progetto. L'agente di servizio del parco risorse è un ruolo IAM che concede all'account di servizio le autorizzazioni per gestire le risorse del cluster. Se rimuovi questa associazione dei ruoli dall'account di servizio, slegato dal progetto, impedendoti di la registrazione di cluster e altre operazioni cluster.

Puoi verificare se l'account di servizio è stato rimosso dal progetto utilizzando gcloud CLI o la console Google Cloud. Se il comando o Nella dashboard non viene visualizzato gcp-sa-gkehub tra gli account di servizio, l'account di servizio non è più associato.

gcloud

Esegui questo comando:

gcloud projects get-iam-policy PROJECT_NAME

dove PROJECT_NAME è il nome del progetto in cui stai tentando di registrare il cluster.

Console

Visita la sezione IAM e pagina Amministrazione della console Google Cloud.

Risoluzione

Se hai rimosso l'associazione del ruolo di agente di servizio parco risorse, esegui seguenti comandi per ripristinare l'associazione dei ruoli:

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

Per verificare che l'associazione del ruolo sia stata concessa:

gcloud projects get-iam-policy PROJECT_NAME

Se vedi il nome dell'account di servizio insieme a gkehub.serviceAgent l'associazione del ruolo è stata concessa. Ad esempio:

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

Errore durante la registrazione di un cluster GKE da un progetto diverso da quello del parco risorse

Sintomi

Durante la registrazione di un cluster GKE da un progetto diverso dal progetto del parco risorse, potresti osservare un errore simile al seguente in gcloud CLI:

...
message: 'DeployPatch failed'>
detail: 'DeployPatch failed'
...

Può essere verificato nel logging applicando i seguenti filtri:

resource.type="gke_cluster"
resource.labels.cluster_name="my-cluster"
protoPayload.methodName="google.container.v1beta1.ClusterManager.UpdateCluster"
protoPayload.status.code="13"
protoPayload.status.message="Internal error."
severity=ERROR

Cause possibili

L'account di servizio predefinito del parco risorse non dispone delle autorizzazioni necessarie nel progetto del cluster GKE.

Risoluzione

Concedi all'account di servizio predefinito del parco risorse le autorizzazioni necessarie prima di registrare il cluster.

Errore durante la registrazione/l'annullamento della registrazione di un cluster GKE o l'aggiornamento dei dettagli dell'iscrizione al parco risorse per un cluster GKE registrato durante la rotazione delle credenziali

Sintomi

Durante la rotazione delle credenziali del cluster(https://cloud.google.com/kubernetes-engine/docs/how-to/credential-rotation), potresti riscontrare errori se registri/annulli la registrazione di un cluster GKE o se aggiorni l'abbonamento per un cluster GKE registrato.

ERROR: (gcloud.container.hub.memberships.unregister) "code": 13,
"message": "an internal error has occurred"
Cause possibili

Le credenziali del cluster sono in uno stato intermedio in cui il servizio del parco risorse non è in grado di accedervi.

Risoluzione

Completa la rotazione prima di registrare/registrare il cluster o di aggiornare l'appartenenza per un cluster GKE registrato.

Errore durante la disabilitazione dell'API Fleet

Sintomi

Quando provi a disabilitare l'API Fleet (gkehub.googleapis.com), potresti riscontra un errore simile al seguente:

Not ready to deactivate the service on this project; ensure there are no more resources managed by this service.
Cause possibili

Esistono ancora cluster registrati a Google Cloud (abbonamenti) oppure funzionalità a livello di flotta in questo progetto. È necessario annullare la registrazione di tutti gli abbonamenti o di tutte le funzionalità prima che l'API possa essere disabilitata.

  • Per visualizzare i cluster attualmente registrati, segui le istruzioni in Visualizza i membri del parco risorse

  • Per visualizzare tutte le funzionalità attive a livello di parco risorse per il tuo progetto:

gcloud e cURL

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

dove PROJECT_NAME è il nome del progetto in cui stai tentando di disabilitare l'API Fleet.

Console

Se nel tuo progetto è abilitato GKE Enterprise, visita la Pagina Gestore funzionalità nella console Google Cloud. Le funzionalità elencate come ATTIVATE sono attive a livello di parco risorse.

Risoluzione

Innanzitutto, annulla la registrazione di tutti i cluster ancora registrati nel parco risorse del progetto. La registrazione di tutti i cluster deve essere annullata prima della disattivazione di alcune funzionalità.

Dopo aver eseguito questa operazione, disattiva tutte le funzionalità a livello di parco risorse. Al momento, è possibile solo con l'API REST Fleet.

  1. Disabilita le funzionalità a livello di parco risorse che hai abilitato per il tuo progetto

    $ gcloud alpha container hub FEATURE_COMMAND disable
    
  2. Disattiva l'autorizzazione delle funzionalità e la misurazione, che sono abilitate per impostazione predefinita.

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

    dove FEATURE è il nome della funzionalità da disattivare (ad esempio authorizer o metering).

Autorizzazioni del cluster mancanti durante la registrazione di un cluster

Sintomo:

Durante il tentativo di registrare un cluster con un account utente o un account di servizio Google Cloud, potresti ricevere un errore simile al seguente:

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"
Possibile causa:

L'account che sta tentando di registrare il cluster non dispone del ruolo di controllo dell'accesso basato su ruoli (RBAC) richiesto di cluster-admin nel cluster.

Soluzioni

Concedi il ruolo RBAC cluster-admin all'account prima di registrare il cluster.

Errore Failed to check if the user is a cluster-admin: Unable to connect to the server durante la registrazione di un cluster

Sintomo:

Durante il tentativo di registrare un cluster, potresti ricevere un errore simile al seguente:

ERROR: (gcloud.container.hub.memberships.register) Failed to check if the user is a cluster-admin: Unable to connect to the server: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)

Oppure

ERROR: (gcloud.container.hub.memberships.register) Failed to check if the user is a cluster-admin: Unable to connect to the server: dial tcp MASTER_ENDPOINT_IP:443: i/o timeout
Possibile causa:

La macchina su cui esegui il comando gcloud di registrazione non riesce a connettersi all'endpoint esterno del cluster. Questo di solito accade se hai un cluster privato con accesso esterno/IP disabilitato, ma l'indirizzo IP esterno della tua macchina non è incluso nella lista consentita. Tieni presente che la registrazione di un cluster GKE non ha questo requisito dopo gcloud 407.0.0.

Soluzioni

Assicurati che la macchina su cui vuoi eseguire il comando di registrazione gcloud possa accedere al server API del cluster. Se nel cluster non è abilitato l'accesso esterno, invia una richiesta all'assistenza Google Cloud.

Ulteriore assistenza

Puoi inviare un ticket a Google Cloud per GKE Enterprise, eseguendo questi passaggi:

  1. Invia una richiesta all'assistenza Google Cloud.
  2. Segui le istruzioni in Raccolta dei log dell'agente Connect per e salvare i log di Connect.
  3. Se risolvi i problemi di un cluster on-premise utilizzando Google Gruppi o il supporto di terze parti, segui le istruzioni in Raccolta dei log di GKE Identity Service per salvare i log di GKE Identity Service. Assicurati di ripulire i log dei pod nel file salvato, se necessario.
  4. Allega i log pertinenti alla richiesta.