Probleme mit Cloud NAT-Paketverlusten in einem Cluster beheben


Auf dieser Seite erfahren Sie, wie Sie Probleme mit Cloud NAT-Paketverlusten in einem VPC-nativen privaten Cluster in Google Kubernetes Engine (GKE) beheben.

Knoten-VMs in VPC-nativen privaten GKE-Clustern haben keine externen IP-Adressen. Das bedeutet, dass Clients im Internet keine Verbindung zu den IP-Adressen der Knoten herstellen können. Mit Cloud NAT können Sie die externen IP-Adressen und Ports zuweisen, die es privaten Clustern ermöglichen, öffentliche Verbindungen herzustellen.

Wenn einer Knoten-VM die von Cloud NAT zugewiesenen externen Ports und IP-Adressen ausgehen, gehen Pakete verloren. Sie können dies vermeiden, indem Sie die Rate der ausgehenden Pakete reduzieren oder die Zuweisung der verfügbaren Cloud NAT-Quell-IP-Adressen und -Ports erhöhen. In den folgenden Abschnitten wird beschrieben, wie Sie Cloud NAT-Paketverluste im Zusammenhang mit privaten GKE-Clustern diagnostizieren und beheben.

Paketverlust diagnostizieren

In den folgenden Abschnitten wird erläutert, wie Sie mit Cloud Logging verlorene Pakete erfassen und mit Cloud Monitoring die Ursache dafür ermitteln.

Verlorene Pakete protokollieren

Sie können mit der folgenden Abfrage in Cloud Logging verlorene Pakete erfassen:

resource.type="nat_gateway"
resource.labels.region=REGION
resource.labels.gateway_name=GATEWAY_NAME
jsonPayload.allocation_status="DROPPED"

Ersetzen Sie Folgendes:

  • REGION: der Name der Region, in der sich der Cluster befindet.
  • GATEWAY_NAME: der Name des Cloud NAT-Gateways.

Dieser Befehl gibt eine Liste aller Pakete zurück, die von einem Cloud NAT-Gateway verworfen wurden. Die Ursache wird jedoch nicht ermittelt.

Ursachen für Paketverlust beobachten

Um die Ursachen für verlorene Pakete zu ermitteln, können Sie den Messwert-Beobachter in Cloud Monitoring abfragen. Pakete werden aus einem der folgenden drei Gründe verworfen:

  • OUT_OF_RESOURCES
  • ENDPOINT_INDEPENDENT_CONFLICT
  • NAT_ALLOCATION_FAILED

Mit der folgenden Abfrage können Sie Pakete ermitteln, die aufgrund von OUT_OF_RESOURCES- oder ENDPOINT_ALLOCATION_FAILED-Fehlercodes verworfen wurden:

fetch nat_gateway
  metric 'router.googleapis.com/nat/dropped_sent_packets_count'
  filter (resource.gateway_name == GATEWAY_NAME)
  align rate(1m)
  every 1m
  group_by [metric.reason],
    [value_dropped_sent_packets_count_aggregate:
       aggregate(value.dropped_sent_packets_count)]

Wenn Sie Pakete ermitteln, die aus diesen Gründen verworfen werden, finden Sie unter Pakete mit Grund verworfen: keine Ressourcen vorhanden und Pakete mit Grund verworfen: endpunktunabhängiger Konflikt Tipps zur Fehlerbehebung.

Mit der folgenden Abfrage können Sie Pakete ermitteln, die aufgrund des Fehlercodes NAT_ALLOCATION_FAILED verworfen wurden:

fetch nat_gateway
  metric 'router.googleapis.com/nat/nat_allocation_failed'
  group_by 1m,
    [value_nat_allocation_failed_count_true:
       count_true(value.nat_allocation_failed)]
  every 1m

Wenn Sie Pakete ermitteln, die aus diesem Grund verworfen wurden, lesen Sie den Hilfeartikel Weitere IP-Adressen müssen zugewiesen werden.

Cloud NAT-Konfiguration prüfen

Wenn die vorherigen Abfragen leere Ergebnisse zurückgeben und GKE-Pods nicht mit externen IP-Adressen kommunizieren können, verwenden Sie die folgende Tabelle, um Probleme mit der Konfiguration zu beheben:

Configuration Fehlerbehebung
Der Cloud NAT-Dienst ist so konfiguriert, dass er nur auf den primären IP-Adressbereich des Subnetzes angewendet wird. Wenn Cloud NAT nur für den primären IP-Adressbereich des Subnetzes konfiguriert ist, müssen Pakete, die vom Cluster an externe IP-Adressen gesendet werden, eine Quellknoten-IP-Adresse haben. In dieser Cloud NAT-Konfiguration:
  • Pods können Pakete an externe IP-Adressen senden, wenn diese Ziele externer IP-Adressen IP-Masquerading unterliegen. Stellen Sie beim Bereitstellen des ip-masq-agent sicher, dass die Liste nonMasqueradeCIDRs nicht die Ziel-IP-Adresse und den Zielport enthält. Pakete, die an diese Ziele gesendet werden, werden zuerst in Quellknoten-IP-Adressen umgewandelt, bevor sie von Cloud NAT verarbeitet werden.
  • Damit die Pods mit dieser Cloud NAT-Konfiguration eine Verbindung zu allen externen IP-Adressen herstellen können, muss ip-masq-agent bereitgestellt sein und die Liste nonMasqueradeCIDRs darf nur die Knoten- und Pod-IP-Adressbereiche des Clusters enthalten. Pakete, die an Ziele außerhalb des Clusters gesendet werden, werden zuerst in Quellknoten-IP-Adressen umgewandelt, bevor sie von Cloud NAT verarbeitet werden.
  • Wenn Sie verhindern möchten, dass Pods Pakete an bestimmte externe IP-Adressen senden, müssen Sie diese Adressen explizit blockieren, damit sie nicht maskiert werden. Wenn der ip-masq-agent bereitgestellt wird, fügen Sie die externen IP-Adressen, die Sie blockieren möchten, der Liste nonMasqueradeCIDRs hinzu. Pakete, die an diese Ziele gesendet werden, verlassen den Knoten mit ihren ursprünglichen Pod-IP-Adressquellen. Die Pod-IP-Adressen stammen aus einem sekundären IP-Adressbereich des Subnetzes des Clusters. In dieser Konfiguration wird Cloud NAT nicht für diesen sekundären Bereich verwendet.
Der Cloud NAT-Dienst ist so konfiguriert, dass er nur auf den sekundären IP-Adressbereich des Subnetzes angewendet wird, der für Pod-IP-Adressen verwendet wird.

Wenn Cloud NAT nur für den sekundären IP-Adressbereich des Subnetzes konfiguriert ist, der von den Pod-IPs des Clusters verwendet wird, müssen Pakete, die vom Cluster an externe IP-Adressen gesendet werden, eine Pod-IP-Adresse als Quelladresse haben. In dieser Cloud NAT-Konfiguration:

  • Wenn Sie einen IP-Masquerading-Agenten verwenden, verlieren Pakete ihre Quell-Pod-IP-Adresse, wenn sie von Cloud NAT verarbeitet werden. Wenn Sie die Quell-Pod-IP-Adresse beibehalten möchten, geben Sie Ziel-IP-Adressbereiche in einer nonMasqueradeCIDRs-Liste an. Wenn ip-masq-agent bereitgestellt ist, behalten alle Pakete, die an Ziele in der Liste nonMasqueradeCIDRs gesendet werden, ihre Quell-Pod-IP-Adressen, bevor sie von Cloud NAT verarbeitet werden.
  • Damit die Pods mit dieser Cloud NAT-Konfiguration eine Verbindung zu allen externen IP-Adressen herstellen können, muss Folgendes gewährleistet sein: ip-masq-agent ist bereitgestellt und die nonMasqueradeCIDRs-Liste ist so groß wie möglich (0.0.0.0/0 gibt alle IP-Adressziele an). Pakete, die an alle Ziele gesendet werden, behalten die Quell-Pod-IP-Adressen bei, bevor sie von Cloud NAT verarbeitet werden.

Paketverlust reduzieren

Nachdem Sie die Ursache für den Paketverlust ermittelt haben, können Sie die folgenden Empfehlungen berücksichtigen, um die Wahrscheinlichkeit zu verringern, dass das Problem in Zukunft wieder auftritt:

  • Konfigurieren Sie das Cloud NAT-Gateway für die dynamische Portzuweisung und erhöhen Sie die maximale Anzahl von Ports pro VM.

  • Wenn Sie die statische Portzuweisung verwenden, erhöhen Sie die Mindestanzahl der Ports pro VM.

  • Reduzieren Sie die Rate der ausgehenden Pakete Ihrer Anwendung. Wenn eine Anwendung mehrere ausgehende Verbindungen zur selben Ziel-IP-Adresse und zum selben Zielport herstellt, kann sie schnell alle Verbindungen verbrauchen, die Cloud NAT mit der Anzahl der zugewiesenen NAT-Quelladressen und Quellport-Tupeln zu diesem Ziel herstellen kann.

    Weitere Informationen dazu, wie Cloud NAT NAT-Quelladressen und ‑Quellports zum Herstellen von Verbindungen verwendet, einschließlich Einschränkungen der Anzahl gleichzeitiger Verbindungen zu einem Ziel, finden Sie unter Ports und Verbindungen.

    Verwenden Sie offene Verbindungen erneut, um die Rate der ausgehenden Verbindungen aus der Anwendung zu reduzieren. Gängige Methoden zur Wiederverwendung von Verbindungen sind Verbindungspooling, Multiplexing von Verbindungen mit Protokollen wie HTTP/2 oder das Herstellen persistenter Verbindungen, die für mehrere Anfragen wiederverwendet werden. Weitere Informationen finden Sie unter Ports und Verbindungen.

Nächste Schritte

Wenn Sie weitere Unterstützung benötigen, wenden Sie sich an den Cloud Customer Care.