I problemi con Ingress in Google Kubernetes Engine (GKE) possono impedire al traffico esterno o interno di raggiungere i tuoi servizi.
Utilizza questo documento per trovare soluzioni agli errori relativi alla classe Ingress, alle annotazioni IP statici, alle dimensioni delle chiavi dei certificati e alle interazioni con i livelli di rete.
Queste informazioni sono destinate agli amministratori e agli operatori della piattaforma e agli sviluppatori di applicazioni che eseguono il deployment e gestiscono le applicazioni esposte utilizzando Ingress in GKE. Per maggiori informazioni sui ruoli comuni e sulle attività di esempio a cui facciamo riferimento nei contenuti di Google Cloud , consulta Ruoli utente e attività comuni di GKE.
Annotazione errata per la classe Ingress
Sintomo
Quando crei un Ingress, potresti visualizzare il seguente errore:
Missing one or more resources. If resource creation takes longer than expected, you might have an invalid configuration.
Possibili cause
Quando crei Ingress, potresti aver configurato in modo errato la classe Ingress nel manifest.
Risoluzione
Per specificare una classe Ingress, devi utilizzare l'annotazione kubernetes.io/ingress.class. Non puoi specificare un GKE Ingress utilizzando spec.ingressClassName.
- Per eseguire il deployment di un bilanciatore del carico delle applicazioni interno, utilizza l'annotazione
kubernetes.io/ingress.class: gce-internal. - Per eseguire il deployment di un bilanciatore del carico delle applicazioni esterno, utilizza l'annotazione
kubernetes.io/ingress.class: gce.
Annotazione errata per l'indirizzo IP statico
Sintomo
Quando configuri un Ingress esterno per utilizzare un indirizzo IP statico, potresti visualizzare il seguente errore:
Error syncing to GCP: error running load balancer syncing routine: loadbalancer <Name of load balancer> does not exist: the given static IP name <Static IP> doesn't translate to an existing static IP.
Possibili cause
- Non hai creato un indirizzo IP esterno statico prima di eseguire il deployment di Ingress.
- Non stai utilizzando l'annotazione corretta per il tuo tipo di bilanciatore del carico.
Risoluzione
Se stai configurando un Ingress esterno:
- Prenota un indirizzo IP esterno statico prima di eseguire il deployment dell'ingresso.
- Utilizza l'annotazione
kubernetes.io/ingress.global-static-ip-namenella risorsa Ingress.
Se stai configurando un Ingress interno:
- Prenota un indirizzo IP interno statico regionale prima di eseguire il deployment dell'ingresso.
- Utilizza l'annotazione
kubernetes.io/ingress.regional-static-ip-namenella risorsa Ingress.
L'indirizzo IP statico è già in uso
Sintomo
Potresti visualizzare il seguente errore quando specifichi un indirizzo IP statico per il provisioning della risorsa Ingress interna o esterna:
Error syncing to GCP: error running load balancer syncing
routine: loadbalancer <LB name> does not exist:
googleapi: Error 409: IP_IN_USE_BY_ANOTHER_RESOURCE - IP ''<IP address>'' is already being used by another resource.
Possibili cause
L'indirizzo IP statico è già utilizzato da un'altra risorsa.
Errore durante la disattivazione di HTTP e l'utilizzo di un certificato gestito da Google
Sintomo
Se stai configurando un certificato SSL gestito da Google e disattivando il traffico HTTP sul tuo Ingress, viene visualizzato il seguente errore:
Error syncing to GCP: error running load balancer syncing
routine: loadbalancer <Load Balancer name> does not exist:
googleapi: Error 404: The resource ''projects/<Project>/global/sslPolicies/<Policy name>' was not found, notFound
Possibili cause
Non puoi utilizzare le seguenti annotazioni insieme quando configuri l'ingresso:
networking.gke.io/managed-certificates(per associare il certificato gestito da Google a un Ingress)kubernetes.io/ingress.allow-http: false(per disattivare il traffico HTTP)
Risoluzione
Disattiva il traffico HTTP solo dopo che il bilanciatore del carico delle applicazioni esterno è stato completamente programmato. Puoi aggiornare l'ingresso e aggiungere l'annotazione kubernetes.io/ingress.allow-http: false al manifest.
Manca la subnet solo proxy per un Ingress interno
Sintomo
Quando esegui il deployment di un Ingress per un bilanciatore del carico delle applicazioni interno, potresti visualizzare il seguente errore:
Error syncing to GCP: error running load balancer syncing routine:
loadbalancer <LB name> does not exist: googleapi: Error 400: Invalid value for field 'resource.target': 'https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/<Region>/targetHttpsProxies/<Target proxy>'.
An active proxy-only subnetwork is required in the same region and VPC as
the forwarding rule.
Possibili cause
Non hai creato una subnet solo proxy prima di creare la risorsa Ingress. Per i bilanciatori del carico delle applicazioni interni è necessaria una subnet solo proxy.
Risoluzione
Crea una subnet solo proxy prima di eseguire il deployment dell'ingresso interno.
La chiave del certificato SSL è troppo grande
Sintomo
Se la dimensione della chiave del certificato SSL del bilanciatore del carico è troppo grande, potresti visualizzare il seguente errore:
Error syncing to GCP: error running load balancer syncing routine: loadbalancer gky76k70-load-test-trillian-api-ingress-fliismmb does not exist: Cert creation failures - k8s2-cr-gky76k70-znz6o1pfu3tfrguy-f9be3a4abbe573f7 Error:googleapi: Error 400: The SSL key is too large., sslCertificateKeyTooLarge
Possibili cause
Google Cloud ha un limite di 2048 bit per le chiavi del certificato SSL.
Risoluzione
Riduci le dimensioni della chiave del certificato SSL a 2048 bit o meno.
Errore durante la creazione di una risorsa Ingress nel livello Standard
Sintomo
Se stai eseguendo il deployment di un Ingress in un progetto con il livello di rete predefinito del progetto impostato su Standard, viene visualizzato il seguente messaggio di errore:
Error syncing to GCP: error running load balancer syncing routine: load balancer <LB Name> does not exist: googleapi: Error 400: STANDARD network tier (the project''s default network tier) is not supported: STANDARD network tier is not supported for global forwarding rule., badRequest
Risoluzione
Configura il livello di rete predefinito del progetto su Premium.
Errore "Non trovato" previsto per k8s-ingress-svc-acct-permission-check-probe
Il controller Ingress esegue controlli periodici delle autorizzazioni del account di servizio recuperando una risorsa di test dal tuo progetto Google Cloud . Vedrai questo come
un GET del BackendService globale (inesistente) con il nome
k8s-ingress-svc-acct-permission-check-probe. Poiché questa risorsa normalmente non dovrebbe esistere, la richiesta GET restituirà "non trovata". Questo comportamento è previsto; il controller verifica che la chiamata API non venga rifiutata a causa di problemi di autorizzazione. Se crei un BackendService con lo stesso nome, GET
avrà esito positivo anziché restituire "non trovato".
Errori durante l'utilizzo del bilanciamento del carico nativo del container
Utilizza le seguenti tecniche per verificare la configurazione di rete. Le sezioni seguenti spiegano come risolvere problemi specifici relativi al bilanciamento del carico nativo dei container.
Consulta la documentazione sul bilanciamento del carico per scoprire come elencare i gruppi di endpoint di rete.
Puoi trovare il nome e le zone del NEG corrispondente a un servizio nell'annotazione
neg-statusdel servizio. Recupera la specifica del servizio con:kubectl get svc SVC_NAME -o yamlL'annotazione
metadata:annotations:cloud.google.com/neg-statuselenca il nome del NEG corrispondente del servizio e le zone del NEG.Puoi controllare l'integrità del servizio di backend corrispondente a un NEG con il seguente comando:
gcloud compute backend-services --project PROJECT_NAME \ get-health BACKEND_SERVICE_NAME --globalIl servizio di backend ha lo stesso nome del NEG.
Per stampare i log eventi di un servizio:
kubectl describe svc SERVICE_NAMELa stringa del nome del servizio include il nome e lo spazio dei nomi del servizio GKE corrispondente.
Impossibile creare un cluster con IP alias
- Sintomi
Quando provi a creare un cluster con IP alias, potresti riscontrare il seguente errore:
ResponseError: code=400, message=IP aliases cannot be used with a legacy network.- Possibili cause
Si verifica questo errore se tenti di creare un cluster con IP alias che utilizza anche una rete legacy.
- Risoluzione
Assicurati di non creare un cluster con IP alias e una rete legacy abilitati contemporaneamente. Per ulteriori informazioni sull'utilizzo degli IP alias, consulta Crea un cluster nativo di VPC.
Il traffico non raggiunge gli endpoint
- Sintomi
- Errori 502/503 o connessioni rifiutate.
- Possibili cause
I nuovi endpoint diventano generalmente raggiungibili dopo essere stati collegati al bilanciatore del carico, a condizione che rispondano ai controlli di integrità. Potresti riscontrare errori 502 o connessioni rifiutate se il traffico non riesce a raggiungere gli endpoint.
Gli errori 502 e le connessioni rifiutate possono anche essere causati da un container che non gestisce
SIGTERM. Se un container non gestisce esplicitamenteSIGTERM, termina immediatamente e smette di gestire le richieste. Il bilanciatore del carico continua a inviare il traffico in entrata al container terminato, causando errori.Il bilanciatore del carico nativo del container ha un solo endpoint di backend. Durante un aggiornamento progressivo, il vecchio endpoint viene deprogrammato prima che venga programmato il nuovo endpoint.
I pod di backend vengono sottoposti a deployment in una nuova zona per la prima volta dopo il provisioning di un bilanciatore del carico nativo per i container. L'infrastruttura del bilanciatore del carico viene programmata in una zona quando è presente almeno un endpoint nella zona. Quando viene aggiunto un nuovo endpoint a una zona, l'infrastruttura del bilanciatore del carico viene programmata e causa interruzioni del servizio.
- Risoluzione
Configura i container per gestire
SIGTERMe continuare a rispondere alle richieste durante il periodo di tolleranza per la terminazione (30 secondi per impostazione predefinita). Configura i pod in modo che inizino a non superare i controlli di integrità quando ricevonoSIGTERM. Questo indica al bilanciatore del carico di interrompere l'invio di traffico al pod mentre è in corso la riprogrammazione dell'endpoint.Se la tua applicazione non si arresta normalmente e smette di rispondere alle richieste quando riceve un
SIGTERM, l'hook preStop può essere utilizzato per gestireSIGTERMe continuare a gestire il traffico mentre è in corso la deprogrammazione dell'endpoint.lifecycle: preStop: exec: # if SIGTERM triggers a quick exit; keep serving traffic instead command: ["sleep","60"]Consulta la documentazione sulla terminazione dei pod.
Se il backend del bilanciatore del carico ha una sola istanza, configura la strategia di rollout per evitare di eliminare l'unica istanza prima che la nuova istanza sia completamente programmata. Per i pod delle applicazioni gestiti dal workload
Deployment, questo può essere ottenuto configurando la strategia con il parametromaxUnavailableuguale a0.strategy: rollingUpdate: maxSurge: 1 maxUnavailable: 0Per risolvere i problemi relativi al traffico che non raggiunge gli endpoint, verifica che le regole firewall consentano il traffico TCP in entrata verso gli endpoint negli intervalli
130.211.0.0/22e35.191.0.0/16. Per saperne di più, consulta la sezione Aggiunta di controlli di integrità nella documentazione di Cloud Load Balancing.Visualizza i servizi di backend nel tuo progetto. La stringa del nome del servizio di backend pertinente include il nome e lo spazio dei nomi del servizio GKE corrispondente:
gcloud compute backend-services listRecupera lo stato di integrità del backend dal servizio di backend:
gcloud compute backend-services get-health BACKEND_SERVICE_NAMESe tutti i backend non sono integri, il firewall, Ingress o il servizio potrebbero essere configurati in modo errato.
Se alcuni backend non sono integri per un breve periodo di tempo, la latenza della programmazione di rete potrebbe essere la causa.
Se alcuni backend non vengono visualizzati nell'elenco dei servizi di backend, la causa potrebbe essere la latenza di programmazione. Puoi verificarlo eseguendo questo comando, dove
NEG_NAMEè il nome del servizio di backend. (I NEG e i servizi di backend condividono lo stesso nome):gcloud compute network-endpoint-groups list-network-endpoints NEG_NAMEControlla se tutti gli endpoint previsti si trovano nel NEG.
Se hai selezionato un numero ridotto di backend (ad esempio, 1 pod) da un bilanciatore del carico nativo dei container, valuta la possibilità di aumentare il numero di repliche e distribuire i pod di backend in tutte le zone in cui si estende il cluster GKE. In questo modo, l'infrastruttura del bilanciatore del carico sottostante viene programmata completamente. In caso contrario, valuta la possibilità di limitare i pod di backend a una singola zona.
Se configuri una policy di rete per l'endpoint, assicurati che l'ingresso dalla subnet solo proxy sia consentito.
Implementazione bloccata
- Sintomi
- Il lancio di un deployment aggiornato si blocca e il numero di repliche aggiornate non corrisponde al numero di repliche scelto.
- Possibili cause
I controlli di integrità del deployment non riescono. L'immagine container potrebbe essere danneggiata o il controllo di integrità potrebbe essere configurato in modo errato. La sostituzione in sequenza dei pod attende che il pod appena avviato superi il controllo di idoneità del pod. Ciò si verifica solo se il pod risponde ai controlli di integrità del bilanciatore del carico. Se il pod non risponde o se il controllo di integrità è configurato in modo errato, le condizioni del gate di preparazione non possono essere soddisfatte e l'implementazione non può continuare.
Se utilizzi
kubectl1.13 o versioni successive, puoi controllare lo stato dei readiness gate di un pod con il seguente comando:kubectl get pod POD_NAME -o wideControlla la colonna
READINESS GATES.Questa colonna non esiste in
kubectl1.12 e versioni precedenti. Un pod contrassegnato come in statoREADYpotrebbe non aver superato il gate di idoneità. Per verificarlo, utilizza questo comando:kubectl get pod POD_NAME -o yamlI gate di preparazione e il relativo stato sono elencati nell'output.
- Risoluzione
Verifica che l'immagine container nella specifica del pod del deployment funzioni correttamente e sia in grado di rispondere ai controlli di integrità. Verifica che i controlli di integrità siano configurati correttamente.
Errori della modalità con funzionalità ridotte
- Sintomi
A partire dalla versione 1.29.2-gke.1643000 di GKE, potresti visualizzare i seguenti avvisi sul tuo servizio in Esplora log quando vengono aggiornati i NEG:
Entering degraded mode for NEG <service-namespace>/<service-name>-<neg-name>... due to sync err: endpoint has missing nodeName field- Possibili cause
Questi avvisi indicano che GKE ha rilevato errori di configurazione dell'endpoint durante un aggiornamento NEG basato su oggetti
EndpointSlice, attivando un processo di calcolo più approfondito chiamato modalità degradata. GKE continua ad aggiornare i NEG nel miglior modo possibile, correggendo la configurazione errata o escludendo gli endpoint non validi dagli aggiornamenti dei NEG.Alcuni errori comuni sono:
endpoint has missing pod/nodeName fieldendpoint corresponds to an non-existing pod/nodeendpoint information for attach/detach operation is incorrect
- Risoluzione
In genere, questi eventi sono causati da stati transitori e vengono risolti autonomamente. Tuttavia, gli eventi causati da errori di configurazione negli oggetti
EndpointSlicepersonalizzati rimangono irrisolti. Per comprendere la configurazione errata, esamina gli oggettiEndpointSlicecorrispondenti al servizio:kubectl get endpointslice -l kubernetes.io/service-name=<service-name>Convalida ogni endpoint in base all'errore nell'evento.
Per risolvere il problema, devi modificare manualmente gli oggetti
EndpointSlice. L'aggiornamento attiva di nuovo l'aggiornamento dei NEGs. Una volta che la configurazione errata non esiste più, l'output è simile al seguente:NEG <service-namespace>/<service-name>-<neg-name>... is no longer in degraded mode
Errori durante l'utilizzo di certificati SSL gestiti da Google
Questa sezione fornisce informazioni su come risolvere i problemi relativi ai certificati gestiti da Google.
Controllare gli eventi su ManagedCertificate e le risorse Ingress
Se superi il numero di certificati consentiti, all'ManagedCertificate viene aggiunto un evento con motivo TooManyCertificates. Puoi
controllare gli eventi su un oggetto ManagedCertificate utilizzando il seguente comando:
kubectl describe managedcertificate CERTIFICATE_NAME
Sostituisci CERTIFICATE_NAME con il nome del tuo
ManagedCertificate.
Se colleghi un ManagedCertificate inesistente a un Ingress, all'Ingress viene aggiunto un evento
con un motivo MissingCertificate. Puoi controllare gli eventi su un Ingress utilizzando il seguente comando:
kubectl describe ingress INGRESS_NAME
Sostituisci INGRESS_NAME con il nome del tuo Ingress.
Certificato gestito non sottoposto a provisioning quando il dominio viene risolto in indirizzi IP di più bilanciatori del carico
Quando il tuo dominio viene risolto in indirizzi IP di più bilanciatori del carico (più
oggetti Ingress), devi creare un singolo oggetto ManagedCertificate e
collegarlo a tutti gli oggetti Ingress. Se invece crei molti oggetti ManagedCertificate e li colleghi a un Ingress separato, l'autorità di certificazione potrebbe non essere in grado di verificare la proprietà del tuo dominio e alcuni dei tuoi certificati potrebbero non essere sottoposti a provisioning. Affinché la verifica vada a buon fine, il certificato deve essere visibile in tutti gli indirizzi IP a cui viene risolto il tuo dominio.
Nello specifico, quando il tuo dominio viene risolto in un indirizzo IPv4 e un indirizzo IPv6 configurati con oggetti Ingress diversi, devi creare un singolo oggetto ManagedCertificate e collegarlo a entrambi gli Ingress.
Interruzione della comunicazione tra i certificati gestiti da Google e Ingress
I certificati gestiti comunicano con Ingress utilizzando l'annotazione ingress.gcp.kubernetes.io/pre-shared-cert. Puoi interrompere questa comunicazione
se, ad esempio:
- Esegui un processo automatizzato che cancella l'annotazione
ingress.gcp.kubernetes.io/pre-shared-cert. - Archivia uno snapshot di Ingress, quindi elimina e ripristina Ingress dallo snapshot. Nel frattempo, una risorsa
SslCertificateelencata nell'annotazioneingress.gcp.kubernetes.io/pre-shared-certpotrebbe essere stata eliminata. L'ingresso non funziona se mancano certificati allegati.
Se la comunicazione tra i certificati gestiti da Google e Ingress viene interrotta,
elimina i contenuti dell'annotazione ingress.gcp.kubernetes.io/pre-shared-cert e attendi
che il sistema si riconcili. Per evitare che si ripresenti, assicurati che l'annotazione
non venga modificata o eliminata inavvertitamente.
Errori di convalida durante la creazione di un certificato gestito da Google
ManagedCertificate vengono convalidate prima della creazione dell'oggetto ManagedCertificate. Se la convalida non va a buon fine, l'oggetto ManagedCertificate non viene creato e viene stampato un messaggio di errore. I diversi messaggi di errore e
i motivi sono spiegati di seguito:
spec.domains in body should have at most 100 items
Il file manifest ManagedCertificate elenca più di 100 domini nel campo
spec.domains. I certificati gestiti da Google supportano fino a 100 domini.
spec.domains in body should match '^(([a-zA-Z0-9]+|[a-zA-Z0-9][-a-zA-Z0-9]*[a-zA-Z0-9])\.)+[a-zA-Z][-a-zA-Z0-9]*[a-zA-Z0-9]\.?$'
Hai specificato un nome di dominio non valido o un nome di dominio con caratteri jolly nel
campo spec.domains. L'oggetto ManagedCertificate non supporta
i domini con caratteri jolly (ad esempio *.example.com).
spec.domains in body should be at most 63 chars long
Hai specificato un nome di dominio troppo lungo. I certificati gestiti da Google supportano nomi di dominio con un massimo di 63 caratteri.
Aggiornamento manuale di un certificato gestito da Google
Per aggiornare manualmente il certificato in modo che il certificato per il vecchio dominio continui a funzionare finché non viene eseguito il provisioning del certificato per il nuovo dominio, segui questi passaggi:
- Crea un
ManagedCertificateper il nuovo dominio. - Aggiungi il nome di
ManagedCertificateall'annotazionenetworking.gke.io/managed-certificatesin Ingress utilizzando un elenco separato da virgole. Non rimuovere il nome del vecchio certificato. - Attendi che
ManagedCertificatediventi attivo. - Scollega il vecchio certificato dall'ingresso ed eliminalo.
Quando crei un ManagedCertificate, Google Cloud crea un
certificato SSL gestito da Google. Non puoi aggiornare questo certificato. Se aggiorni ManagedCertificate, Google Cloud elimina e ricrea il certificato SSL gestito da Google.
Per fornire Ingress criptato HTTPS sicuro per i tuoi cluster GKE, consulta l'esempio Ingress sicuro.
Passaggi successivi
Se non riesci a trovare una soluzione al tuo problema nella documentazione, consulta la sezione Richiedi assistenza per ulteriore aiuto, inclusi consigli sui seguenti argomenti:
- Aprire una richiesta di assistenza contattando l'assistenza clienti cloud.
- Ricevere assistenza dalla community
ponendo domande su StackOverflow e utilizzando il tag
google-kubernetes-engineper cercare problemi simili. Puoi anche unirti al canale Slack per ulteriore assistenza della community.#kubernetes-engine - Apertura di bug o richieste di funzionalità utilizzando lo strumento di monitoraggio dei problemi pubblico.