Mit Google Distributed Cloud können Sie die Quellnetzwerkadressübersetzung (Source Network Address Translation, SNAT) so konfigurieren, dass bestimmter ausgehender Traffic von Ihrem Nutzercluster eine vorhersehbare Quell-IP-Adresse erhält.
In diesem Dokument wird gezeigt, wie ein NAT-Gateway für ausgehenden Traffic für einen Nutzercluster konfiguriert wird.
Einleitung
Manchmal werden Pods in einem Nutzercluster ausgeführt, die Pakete an Komponenten senden müssen, die in Ihrer Organisation, aber außerhalb des Clusters ausgeführt werden. Sie können diese externen Komponenten so gestalten, dass sie eingehenden Netzwerktraffic entsprechend einer Reihe bekannter Quell-IP-Adressen filtern.
Im Folgenden sind einige Szenarien aufgeführt:
Sie haben eine Firewall vor einer Datenbank, die den Zugriff nur nach IP-Adresse zulässt. Das Team, das die Datenbankfirewall verwaltet, unterscheidet sich vom Team, das den Nutzercluster verwaltet.
Arbeitslasten in Ihrem Nutzercluster müssen über das Internet auf eine Drittanbieter-API zugreifen. Aus Sicherheitsgründen authentifiziert und autorisiert der API-Anbieter den Traffic mithilfe der IP-Adresse als Identität.
Mit einem NAT-Gateway für ausgehenden Traffic können Sie die Quell-IP-Adressen für den Netzwerktraffic, der einen Cluster verlässt, detailliert steuern.
Preise
Für die Verwendung dieses Features während der Vorschau fallen keine Gebühren an.
Funktionsweise eines NAT-Gateways für ausgehenden Traffic
Wenn ein Pod ein Paket aus dem Cluster sendet, wird das Paket normalerweise per SNAT mit der IP-Adresse des Knotens übersetzt, auf dem der Pod ausgeführt wird.
Wenn ein NAT-Gateway für ausgehenden Traffic vorhanden ist, können Sie festlegen, dass bestimmte ausgehende Pakete zuerst an einen dedizierten Gateway-Knoten gesendet werden. Die Netzwerkschnittstelle auf dem Gateway-Knoten wird mit zwei IP-Adressen konfiguriert: der primären IP-Adresse und der Quell-IP-Adresse für ausgehenden Traffic.
Wenn ein Paket ausgewählt wurde, das für das NAT-Gateway für ausgehenden Traffic verwendet wird, verlässt das Paket den Cluster vom Gateway-Knoten und wird per SNAT mit der Quell-IP-Adresse für ausgehenden Traffic übersetzt, die auf der Netzwerkschnittstelle konfiguriert ist.
Das folgende Diagramm veranschaulicht den Paketablauf:
Das obige Diagramm zeigt den Ablauf eines Pakets, das vom Pod gesendet wird.
Auf einem Knoten mit der IP-Adresse 192.168.1.1 generiert ein Pod mit der IP-Adresse 10.10.10.1 ein ausgehendes Paket.
Das Paket entspricht einer Regel für ausgehenden Traffic, sodass das Paket an den Gateway-Knoten weitergeleitet wird.
Der Gateway-Knoten ändert die Quell-IP-Adresse in 192.168.1.100 und sendet das Paket aus dem Cluster.
Der Rücktraffic kehrt zum Gateway-Knoten mit dem Ziel 192.168.1.100 zurück.
Der Gateway-Knoten verwendet Conntrack, um die Ziel-IP-Adresse in 10.10.10.1 zu ändern.
Das Paket wird als clusterinterner Traffic behandelt, an den ursprünglichen Knoten weitergeleitet und an den ursprünglichen Pod zurückgesendet.
Identitäten
In diesem Thema werden zwei Identitäten behandelt:
Clusteradministrator. Diese Person erstellt einen Nutzercluster und gibt Floating-IP-Adressen an, die von Anthos Network Gateway verwendet werden sollen.
Entwickler. Diese Person führt Arbeitslasten im Nutzercluster aus und erstellt Richtlinien für ausgehenden Traffic.
NAT-Gateway für ausgehenden Traffic aktivieren
Dieser Abschnitt richtet sich an Clusteradministratoren.
Verwenden Sie zum Konfigurieren eines NAT-Gateways für ausgehenden Traffic die Felder enableDataplaneV2
und advancedNetworking
in der Konfigurationsdatei des Nutzerclusters und erstellen Sie ein oder mehrere NetworkGatewayGroup-Objekte.
Legen Sie in der Clusterkonfigurationsdatei die folgenden Felder auf true
fest:
enableDataplaneV2: true ... advancedNetworking: true
Erstellen Sie den Nutzercluster.
Floating-IP-Adressen angeben
Dieser Abschnitt richtet sich an Clusteradministratoren.
Wählen Sie eine Reihe von IP-Adressen aus, die Sie als Quelladressen für ausgehenden Traffic verwenden möchten. Diese werden als Floating-IP-Adressen bezeichnet, da Network Gateway Group sie nach Bedarf den Netzwerkschnittstellen von Knoten zuweist, die als Gateways für ausgehenden Traffic ausgewählt werden.
Die Floating-IP-Adressen müssen sich im selben Subnetz wie die Knoten-IP-Adressen befinden.
Der Satz von Floating-IP-Adressen darf sich nicht mit dem Satz von IP-Adressen überschneiden, den Sie für Ihre Knoten angegeben haben.
Angenommen, ein Subnetz hat den Adressbereich 192.168.1.0/24. Nehmen wir außerdem an, dass Sie 192.168.1.1 bis 192.168.1.99 für Knoten verwenden möchten. Dann können Sie 192.168.1.100 bis 192.168.1.104 als Floating-IP-Adressen verwenden.
NetworkGatewayGroup-Objekt erstellen
Dieser Abschnitt richtet sich an Clusteradministratoren.
Hier ein Beispiel für ein Manifest für ein NetworkGatewayGroup-Objekt:
kind: NetworkGatewayGroup apiVersion: networking.gke.io/v1 metadata: namespace: kube-system name: default spec floatingIPs: - 192.168.1.100 - 192.168.1.101 - 192.168.1.102 - 192.168.1.103 - 192.168.1.104
Ersetzen Sie das Array floatingIPs
durch Ihre Floating-IP-Adressen und speichern Sie das Manifest in einer Datei mit dem Namen my-ngg.yaml
.
Erstellen Sie das NetworkGatewayGroup-Objekt:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG apply -f my-ngg.yaml
Beispiel für eine NAT-Richtlinie für ausgehenden Traffic
Dieser Abschnitt richtet sich an Entwickler.
Das folgende Beispiel zeigt eine benutzerdefinierte EgressNatPolicy-Ressource:
kind: EgressNATPolicy apiVersion: networking.gke.io/v1 metadata: name: alice-paul spec: sources: - namespaceSelector: matchLabels: user: alice podSelector: matchLabels: role: frontend - namespaceSelector: matchLabels: user: paul podSelector: matchLabels: role: frontend action: SNAT destinations: - cidr: 8.8.8.0/24 gatewayRef: name: default namespace: kube-system
Im vorhergehenden Manifest sehen wir:
Ein Pod ist ein Kandidat für NAT für ausgehenden Traffic, wenn er folgende Voraussetzungen erfüllt:
Der Pod hat das Label
role: frontend
und der Pod befindet sich in einem Namespace mit dem Labeluser: alice
.Der Pod hat das Label
role: frontend
und der Pod befindet sich in einem Namespace mit dem Labeluser: paul
.
Traffic von einem Kandidaten-Pod an eine Adresse im Bereich 8.8.8.0/24 wird an das NAT-Gateway für ausgehenden Traffic gesendet.
Der Abschnitt
gatewayRef
bestimmt die IP-Adresse der ausgehenden Quelle. Die benutzerdefinierte EgressNATPolicy-Ressource verwendet die WertegatewayRef.name
undgatewayRef.namespace
, um ein NetworkGatewayGroup-Objekt zu finden. Die Richtlinie verwendet eine der Floating-IP-Adressen der NetworkGatewayGroup als Quell-IP-Adresse für ausgehenden Traffic. Wenn die übereinstimmende NetworkGatewayGroup mehrere Floating-IP-Adressen enthält, verwendet die Richtlinie die erste IP-Adresse in derfloatingIPs
-Liste und ignoriert alle anderen IP-Adressen. Wenn im AbschnittgatewayRef
ungültige Felder vorhanden sind, kann das Egress-NAT-Richtlinienobjekt nicht angewendet werden.
EgressNATPolicy-Objekt erstellen
Erstellen Sie Ihr eigenes EgressNATPolicy-Manifest. Setzen Sie metadata.name
auf "my-policy"
.
Speichern Sie Ihr Manifest in einer Datei mit dem Namen my-policy.yaml
.
Erstellen Sie das EgressNatPolicy-Objekt:
kubectl apply --kubeconfig USER_CLUSTER_KUBECONFIG -f my-policy.yaml
Informationen zur NAT-Richtlinie für ausgehenden Traffic ansehen
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get egressnatpolicy my-policy --output yaml kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get networkgatewaygroup --namespace kube-system --output yaml kubectl --kubeconfig USER_CLUSTER_KUBECONFIG describe egressnatpolicy my-policy
Reihenfolge von Vorgängen
Die NAT-Richtlinie für ausgehenden Traffic ist mit APIs für Netzwerkrichtlinien kompatibel. Die Netzwerkrichtlinie wird vor der NAT-Richtlinie für ausgehenden Traffic ausgewertet. Wenn eine Netzwerkrichtlinie vorgibt, ein Paket zu verwerfen, wird das Paket unabhängig von der NAT-Richtlinie für ausgehenden Traffic verworfen.
Mehrere Richtlinien für ausgehenden Traffic
Wie bereits beschrieben verwendet jede EgressNATPolicy die erste IP-Adresse in der floatingIPs
-Liste aus der NetworkGatewayGroup, die mit gatewayRef.name
und gatewayRef.namespace
übereinstimmt. Wenn Sie mehrere Richtlinien erstellen und unterschiedliche IP-Adressen verwenden möchten, müssen Sie mehrere NetworkGatewayGroup-Objekte erstellen und auf sie verweisen. Wenn Sie mehrere Richtlinien erstellen, muss das Objekt gatewayRef
für jede Richtlinie eindeutig sein.
Jede NetworkGatewayGroup
-Ressource muss eindeutige Floating-IP-Adressen enthalten.
Wenn Sie mehrere EgressNATPolicy
-Objekte für die Verwendung derselben IP-Adresse konfigurieren möchten, verwenden Sie für beide denselben gatewayRef.name
und gatewayRef.namespace
.
So richten Sie mehrere Richtlinien für ausgehenden Traffic und mehrere Gateway-Objekte ein:
Erstellen Sie Gateway-Objekte im Namespace
kube-system
, um jede Floating-IP-Adresse zu verwalten. In der Regel sollte jeder Richtlinie für ausgehenden Traffic ein entsprechendes Gateway-Objekt zugeordnet sein, damit die richtige IP-Adresse zugewiesen wird.Prüfen Sie dann jedes Gateway-Objekt mit
kubectl
, um den Zuweisungsstatus der Floating-IP-Adressen abzurufen:kind: NetworkGatewayGroup apiVersion: networking.gke.io/v1 metadata: namespace: kube-system name: gateway1 spec: floatingIPs: - 192.168.1.100 status: ... floatingIPs: 192.168.1.100: worker1 --- kind: NetworkGatewayGroup apiVersion: networking.gke.io/v1 metadata: namespace: kube-system name: gateway2 spec: floatingIPs: - 192.168.1.101 status: ... floatingIPs: 192.168.1.101: worker2 --- kind: NetworkGatewayGroup apiVersion: networking.gke.io/v1 metadata: namespace: kube-system name: gateway3 spec: floatingIPs: - 192.168.1.102 status: ... floatingIPs: 192.168.1.102: worker1
Erstellen Sie mehrere Richtlinien, die auf die Gatewayobjekte verweisen, z. B. die im vorherigen Schritt erstellten
gateway1
:kind: EgressNATPolicy apiVersion: networking.gke.io/v1 metadata: name: egresspolicy1 spec: ... gatewayRef: name: gateway1 namespace: kube-system --- kind: EgressNATPolicy apiVersion: networking.gke.io/v1 metadata: name: egresspolicy2 spec: ... gatewayRef: name: gateway2 namespace: kube-system --- kind: EgressNATPolicy apiVersion: networking.gke.io/v1 metadata: name: egresspolicy3 spec: ... gatewayRef: name: gateway3 namespace: kube-system
(Optional) Knoten angeben, auf denen Floating-IP-Adressen platziert werden sollen
NetworkGatewayGroup
-Ressourcen unterstützen Knotenauswahl. Wenn Sie eine Teilmenge von Knoten angeben möchten, die für das Hosting einer Floating-IP-Adresse in Betracht gezogen werden, können Sie den Knotenselektor dem NetworkGatewayGroup
-Objekt hinzufügen, wie im folgenden Beispiel gezeigt:
kind: NetworkGatewayGroup
apiVersion: networking.gke.io/v1
metadata:
namespace: cluster-cluster1
name: default
spec:
floatingIPs:
- 192.168.1.100
- 192.168.1.101
- 192.168.1.102
nodeSelector:
node-type: "egressNat"
Die Knotenauswahl stimmt mit Knoten mit dem angegebenen Label überein. Nur diese Knoten werden für das Hosten einer Floating-IP-Adresse berücksichtigt. Wenn Sie mehrere Selektoren angeben, ist deren Logik additiv. Ein Knoten muss also jedem Label entsprechen, um beim Hosten einer Floating-IP-Adresse berücksichtigt zu werden. Wenn nicht viele Knoten mit übereinstimmenden Labels vorhanden sind, kann ein Knotenselektor die Hochverfügbarkeitsqualitäten der Platzierung von Floating-IP-Adressen beeinträchtigen.