In diesem Leitfaden erfahren Sie, wie Sie diagnostizieren, warum Ihre Arbeitslasten (Pods oder VMs) nicht über Cloud NAT auf externe Netzwerke zugreifen können. Als Entwickler interagieren Sie hauptsächlich mit der Ressource CloudNatGateway. Der Status dieser Ressource ist Ihre primäre Informationsquelle für die Fehlerbehebung.
Hinweis
Für die Fehlerbehebung bei einer Cloud NAT-Konfiguration benötigen Sie Folgendes:
- Die erforderlichen Identitäts- und Zugriffsrollen. Bitten Sie Ihren IAM-Projektadministrator, Ihnen eine oder beide der folgenden Rollen zuzuweisen:
- Cloud NAT-Betrachter (
cloud-nat-viewer): Diese Rolle bietet Lesezugriff auf Cloud NAT-Ressourcen. Mit dieser Rolle können Sie mit der Diagnose des Problems beginnen. - Cloud NAT Developer (
cloud-nat-developer): Diese Rolle bietet die erforderlichen Berechtigungen für Anwendungsoperatoren, um Cloud NAT-Objekte in ihren zugewiesenen Projekten zu erstellen, zu lesen, zu aktualisieren und zu löschen (CRUD). Mit dieser Rolle können Sie viele der auf dieser Seite beschriebenen Korrekturen vornehmen. - Für einige spezifische Diagnosemaßnahmen und Fehlerbehebungen sind möglicherweise zusätzliche Rollen erforderlich.
- Cloud NAT-Betrachter (
Erste Diagnose
Bevor Sie sich mit Fehlercodes befassen, sollten Sie prüfen, ob die grundlegenden Ressourcen vorhanden und erreichbar sind.
Befehl:
kubectl get cloudnatgateway GATEWAY_NAME -n PROJECT_NAMESPACE -o yaml
Ersetzen Sie Folgendes:
GATEWAY_NAME: Name derCloudNatGateway-Ressource.PROJECT_NAMESPACE: Der Namespace Ihres Projekts.
Statusbedingungen prüfen: Bei einem fehlerfreien Gateway müssen alle folgenden Bedingungen auf True gesetzt sein:
Ready: Globaler Integritätsstatus.SubnetsReady: Die IP-Pool-Konfiguration ist gültig.PerimeterConfigurationReady: Die vorgelagerte Netzwerkinfrastruktur ist konfiguriert.EgressRoutesReady: Die Routingrichtlinien für Ihre Pods sind aktiv.
Wenn einer dieser Werte False ist, prüfen Sie die Felder reason und message in der Statusausgabe und sehen Sie sich die Tabellen in den folgenden Abschnitten an.
Fehlercode-Referenz und -Behebung
Die von kubectl get cloudnatgateway zurückgegebenen Fehlercodes lassen sich in drei Hauptkategorien unterteilen.
Subnetzfehler (SubnetsReady ist „False“)
Dieser Zustand weist auf Probleme mit dem IP-Adresspool hin, der dem Gateway zugewiesen ist.
| Fehlercode | Bedeutung | Schritte zur Abhilfe |
|---|---|---|
CloudNATSelectorFieldOverlapsCode |
Konfigurationskonflikt. Der workloadSelector dieses Gateways stimmt mit denselben Arbeitslasten wie ein anderes Gateway in Ihrem Projekt überein. Der Traffic kann nicht deterministisch weitergeleitet werden. |
|
CloudNATSubnetRefsFieldInvalidCode |
Ungültiges Subnetz. Das in
|
|
CloudNATSubnetAlreadyInUseCode |
Subnetzkonflikt. Das von Ihnen angeforderte Subnetz gehört bereits einem anderen Cloud NAT-Gateway. Ein Subnetz kann jeweils nur an ein Gateway angehängt werden. |
|
UNETAPIServerErrorCode |
Systemfehler. Der Controller kann nicht mit dem API-Server kommunizieren, um Subnetze zu validieren. | Maßnahme:Wahrscheinlich handelt es sich um ein vorübergehendes Problem mit der Plattform. Wenn das Problem weiterhin besteht, wenden Sie sich an Ihren Plattformadministrator. |
Fehler bei der Perimeterkonfiguration (PerimeterConfigurationReady ist „False“)
Diese Bedingung spiegelt den Status der Perimeter-Gateways wider.
| Fehlercode | Bedeutung | Schritte zur Abhilfe |
|---|---|---|
NET-E0305 |
Konfigurationskonflikt. (Wie oben) Sich überschneidende Selektoren verhindern, dass das System die richtige Routinggruppe berechnet. |
|
NET-E0301 |
Ressourcenerschöpfung / Knotenausfall. Das System hat die Konfiguration erstellt, konnte Ihre ausgehenden IP-Adressen jedoch keinem fehlerfreien physischen Knoten zuweisen. Das bedeutet in der Regel, dass entweder im Subnetz keine IP-Adressen mehr verfügbar sind oder die Gateway-Knoten ausgefallen sind. |
|
NET-E0001 |
Systemfehler. Fehler bei der Kommunikation mit dem Controller. | Maßnahme: Wenden Sie sich an den Plattformadministrator. |
Fehler bei Routen für ausgehenden Traffic (EgressRoutesReady ist „False“)
Diese Bedingung spiegelt den Status der Routingrichtlinien im Cluster wider.
| Fehlercode | Bedeutung | Schritte zur Abhilfe |
|---|---|---|
NET-E0305 |
Konfigurationskonflikt. (Wie oben) |
|
NET-E0304 |
Programmierfehler. Das System konnte die Routingregeln (BPF) für Ihre spezifischen Gateway-IPs nicht programmieren. | Maßnahme: Dies ist ein interner Programmierfehler oder eine Statusinkonsistenz.
|
Weitere häufig auftretende Probleme
Wenn der Gateway-Status Ready: True lautet, der Traffic aber weiterhin fehlschlägt, prüfen Sie die folgenden häufigen Fehlkonfigurationen:
Fehlende Berechtigung auf Projektebene
Ihr Projekt muss explizit für ausgehenden Traffic autorisiert sein.
- Prüfen: Hat Ihre Projektressource das Label
networking.gdc.goog/enable-default-egress-allow-to-outside-the-org: "true"? - Lösung: Bitten Sie Ihren Projektadministrator, dieses Label anzuwenden.
Fehlende VM-Annotation (nur virtuelle Maschinen)
VMs umgehen den Standardpfad für ausgehenden Pod-Traffic und benötigen eine explizite Anweisung, um Cloud NAT zu verwenden.
- Prüfen: Hat das
VirtualMachineExternalAccess-Objekt (VMEA) für Ihre VM die Annotationegress.networking.gke.io/use-cloud-nat: "true"? - Lösung: Fügen Sie die Annotation dem VMEA-Objekt hinzu.
Ausgehender Traffic von Standardclusterknoten
Wenn Sie einen Standardcluster ausführen, benötigen die Knoten selbst die Berechtigung für ausgehenden Traffic.
- Prüfen: Hat das Objekt
Clusterdas Labelcluster.gdc.goog/enable-node-egress-to-outside-the-org: "true"? - Lösung: Bitten Sie Ihren Plattformadministrator, das Clusterobjekt zu labeln.
Kollision zwischen Standard-NAT für ausgehenden Traffic und Cloud NAT
Ein häufiger Konfigurationsfehler tritt auf, wenn eine Arbeitslast für die Verwendung des alten Standard-NAT-Mechanismus für ausgehenden Traffic konfiguriert ist, während sie gleichzeitig von einem Cloud NAT-Gateway ausgewählt wird. Diese Kombination führt zu einer Kollision, bei der die Datenebene widersprüchliche Routinganweisungen erhält, was zu Paketverlusten oder nicht deterministischem Routingverhalten führt.
Pod-Kollisionen diagnostizieren
Für Pods wird die Standard-NAT für ausgehenden Traffic normalerweise durch Hinzufügen eines bestimmten Labels aktiviert. Ein Pod kann dieses Label nicht haben, wenn er gleichzeitig von einem Cloud NAT-Gateway als Ziel verwendet wird.
Ziel-Pod identifizieren: Rufen Sie die Labels des Pods ab, bei dem Verbindungsprobleme auftreten.
kubectl get pod <POD_NAME> -n <NAMESPACE> --show-labelsAuf in Konflikt stehende Labels prüfen:
- Cloud NAT-Auswahl: Stimmen die Labels des Pods mit dem
workloadSelectoreinesCloudNatGatewayim Namespace überein? - Standard-Label für ausgehenden Traffic: Hat der Pod das Label
egress.networking.gke.io/enabled: "true"?
Bedingung: Wenn BEIDE Bedingungen erfüllt sind, liegt eine Kollision vor.
- Cloud NAT-Auswahl: Stimmen die Labels des Pods mit dem
Lösung: Entfernen Sie das Legacy-Standardlabel für ausgehenden Traffic vom Pod (oder seinem übergeordneten Deployment/StatefulSet), damit Cloud NAT die exklusive Kontrolle übernehmen kann.
VM-Kollisionen diagnostizieren
Bei virtuellen Maschinen ist der Mechanismus anders. VMs mit VirtualMachineExternalAccess-Objekten (VMEA) sind häufig für den Standardzugriff konfiguriert. Wenn Sie Cloud NAT verwenden möchten, müssen Sie dies explizit aktivieren. Fügen Sie dazu eine Annotation hinzu, um den Standardpfad zu deaktivieren und den Cloud NAT-Pfad zu aktivieren.
VMEA identifizieren: Suchen Sie das
VirtualMachineExternalAccess-Objekt, das mit der VM verknüpft ist.kubectl get vmea -n <NAMESPACE>Auf fehlende Annotation prüfen:
- Cloud NAT-Auswahl: Stimmen die Labels der VM mit einer
CloudNatGatewayüberein? - Opt-in-Anmerkung: Suchen Sie im VMEA nach der Anmerkung
egress.networking.gke.io/use-cloud-nat: "true".
Bedingung: Wenn die VM mit einem Gateway übereinstimmt, aber diese Annotation NICHT hat, kollidiert der Traffic mit dem Standard-System für ausgehenden Traffic.
- Cloud NAT-Auswahl: Stimmen die Labels der VM mit einer
Lösung: Fügen Sie die Annotation dem VMEA-Objekt hinzu.
kubectl annotate vmea <VMEA_NAME> -n <NAMESPACE> egress.networking.gke.io/use-cloud-nat="true"