Questa guida ti aiuta a diagnosticare il motivo per cui i tuoi workload (pod o VM) non riescono ad accedere alle reti esterne utilizzando Cloud NAT. In qualità di sviluppatore, interagisci principalmente con la risorsa CloudNatGateway. Lo stato di questa risorsa è la tua fonte di verità principale per il debug.
Prima di iniziare
Per risolvere i problemi di una configurazione Cloud NAT, devi disporre di quanto segue:
- I ruoli di identità e accesso necessari. Chiedi all'amministratore del progetto IAM di concederti uno o entrambi i seguenti ruoli:
- Cloud NAT Viewer (
cloud-nat-viewer): questo ruolo offre l'accesso di sola lettura alle risorse Cloud NAT. Questo ruolo ti consente di iniziare a diagnosticare il problema. - Cloud NAT Developer (
cloud-nat-developer): questo ruolo fornisce le autorizzazioni necessarie agli operatori delle applicazioni per creare, leggere, aggiornare ed eliminare (CRUD) gli oggetti Cloud NAT all'interno dei progetti assegnati. Questo ruolo ti consente di eseguire molte delle correzioni descritte in questa pagina. - Per alcune misure diagnostiche e correzioni specifiche potrebbero essere necessari ruoli aggiuntivi.
- Cloud NAT Viewer (
Diagnostica iniziale
Prima di esaminare i codici di errore, assicurati che le risorse di base siano presenti e raggiungibili.
Comando:
kubectl get cloudnatgateway GATEWAY_NAME -n PROJECT_NAMESPACE -o yaml
Sostituisci quanto segue:
GATEWAY_NAME: il nome della risorsaCloudNatGateway.PROJECT_NAMESPACE: lo spazio dei nomi del progetto.
Controlla le condizioni di stato: un gateway integro deve avere tutte le seguenti condizioni impostate su True:
Ready: stato di salute globale.SubnetsReady: la configurazione del pool di IP è valida.PerimeterConfigurationReady: L'infrastruttura di rete a monte è configurata.EgressRoutesReady: le policy di routing per i pod sono attive.
Se uno di questi è False, controlla i campi reason e message nell'output dello stato e consulta le tabelle nelle sezioni seguenti.
Significato dei codici di errore e correzione
I codici di errore restituiti da kubectl get cloudnatgateway rientrano in tre
categorie principali.
Errori della subnet (SubnetsReady è False)
Questa condizione indica problemi con il pool di indirizzi IP assegnato al gateway.
| Codice di errore | Significato | Passaggi per correggere l'errore |
|---|---|---|
CloudNATSelectorFieldOverlapsCode |
Conflitto di configurazione. Il workloadSelector di questo gateway corrisponde agli stessi workload di un altro gateway nel tuo progetto. Il traffico non può essere instradato in modo deterministico. |
|
CloudNATSubnetRefsFieldInvalidCode |
Subnet non valida. La subnet specificata in
|
|
CloudNATSubnetAlreadyInUseCode |
Conflitto di subnet. La subnet richiesta è già "di proprietà" di un altro gateway Cloud NAT. Una subnet può essere collegata a un solo gateway alla volta. |
|
UNETAPIServerErrorCode |
Errore di sistema. Il controller non può comunicare con il server API per convalidare le subnet. | Azione: molto probabilmente si tratta di un problema temporaneo della piattaforma. Se il problema persiste, contatta l'amministratore della piattaforma. |
Errori di configurazione del perimetro (PerimeterConfigurationReady è False)
Questa condizione riflette lo stato dei gateway perimetrali.
| Codice di errore | Significato | Passaggi per correggere l'errore |
|---|---|---|
NET-E0305 |
Conflitto di configurazione. (Come sopra). I selettori sovrapposti impediscono al sistema di calcolare il gruppo di routing corretto. |
|
NET-E0301 |
Esaurimento delle risorse / errore del nodo. Il sistema ha creato la configurazione, ma non è stato possibile assegnare gli IP in uscita a un nodo fisico integro. In genere, questo significa che la subnet ha esaurito gli IP o che i nodi gateway non sono attivi. |
|
NET-E0001 |
Errore di sistema. Errore di comunicazione del controller. | Azione: contatta l'amministratore della piattaforma. |
Errori della route in uscita (EgressRoutesReady è False)
Questa condizione riflette lo stato delle policy di routing all'interno del cluster.
| Codice di errore | Significato | Passaggi per correggere l'errore |
|---|---|---|
NET-E0305 |
Conflitto di configurazione. (Come sopra). |
|
NET-E0304 |
Errore di programmazione. Il sistema non è riuscito a programmare le regole di instradamento (BPF) per gli IP del gateway specifici. | Azione: si tratta di un errore di programmazione interno o di un'incoerenza di stato.
|
Altri problemi comuni
Se lo stato del gateway è Ready: True, ma il traffico continua a non funzionare, controlla queste configurazioni errate comuni:
Autorizzazione a livello di progetto mancante
Il tuo progetto deve essere esplicitamente autorizzato a inviare traffico in uscita.
- Verifica: la risorsa Project ha l'etichetta
networking.gdc.goog/enable-default-egress-allow-to-outside-the-org: "true"? - Correzione: chiedi all'amministratore del progetto di applicare questa etichetta.
Annotazione VM mancante (solo macchine virtuali)
Le VM bypassano il percorso di traffico in uscita standard dei pod e richiedono istruzioni esplicite per utilizzare Cloud NAT.
- Verifica: l'oggetto
VirtualMachineExternalAccess(VMEA) della VM ha l'annotazioneegress.networking.gke.io/use-cloud-nat: "true"? - Correzione: aggiungi l'annotazione all'oggetto VMEA.
Traffico in uscita dai nodi del cluster standard
Se esegui un cluster Standard, i nodi stessi devono avere l'autorizzazione per il traffico in uscita.
- Verifica: l'oggetto
Clusterha l'etichettacluster.gdc.goog/enable-node-egress-to-outside-the-org: "true"? - Correzione: chiedi all'amministratore della piattaforma di etichettare l'oggetto Cluster.
Conflitto tra NAT in uscita predefinito e Cloud NAT
Un errore di configurazione comune si verifica quando un workload è configurato per utilizzare il meccanismo NAT di uscita predefinito legacy, ma è anche selezionato da un gateway Cloud NAT. Questa combinazione genera una collisione in cui il piano dati riceve istruzioni di routing in conflitto, con conseguente perdita di pacchetti o comportamento di routing non deterministico.
Diagnostica le collisioni dei pod
Per i pod, il NAT in uscita predefinito viene in genere attivato aggiungendo un'etichetta specifica. Un pod non può avere questa etichetta se è anche il target di un gateway Cloud NAT.
Identifica il pod di destinazione: recupera le etichette del pod che presenta problemi di connettività.
kubectl get pod <POD_NAME> -n <NAMESPACE> --show-labelsControlla la presenza di etichette in conflitto:
- Selezione di Cloud NAT: le etichette del pod corrispondono al
workloadSelectordi unCloudNatGatewaynello spazio dei nomi? - Etichetta in uscita predefinita: il pod ha l'etichetta
egress.networking.gke.io/enabled: "true"?
Condizione: se ENTRAMBE le condizioni sono vere, si verifica una collisione.
- Selezione di Cloud NAT: le etichette del pod corrispondono al
Risoluzione: rimuovi l'etichetta di traffico in uscita predefinita legacy dal pod (o dal relativo deployment/StatefulSet principale) per consentire a Cloud NAT di assumere il controllo esclusivo.
Diagnostica le collisioni delle VM
Per le macchine virtuali, il meccanismo è diverso. Le VM con oggetti VirtualMachineExternalAccess (VMEA) sono spesso configurate per l'accesso predefinito. Per utilizzare Cloud NAT, devono attivarlo esplicitamente aggiungendo un'annotazione per disattivare il percorso predefinito e attivare il percorso Cloud NAT.
Identifica il VMEA: trova l'oggetto
VirtualMachineExternalAccessassociato alla VM.kubectl get vmea -n <NAMESPACE>Controlla se manca l'annotazione:
- Selezione di Cloud NAT: le etichette della VM corrispondono a un
CloudNatGateway? - Annotazione di attivazione:controlla il VMEA per l'annotazione
egress.networking.gke.io/use-cloud-nat: "true".
Condizione: se la VM corrisponde a un gateway, ma NON ha questa annotazione, il traffico entrerà in conflitto con il sistema di traffico in uscita predefinito.
- Selezione di Cloud NAT: le etichette della VM corrispondono a un
Risoluzione: aggiungi l'annotazione all'oggetto VMEA.
kubectl annotate vmea <VMEA_NAME> -n <NAMESPACE> egress.networking.gke.io/use-cloud-nat="true"