Un gateway NAT in uscita in Google Distributed Cloud ti consente di assegnare indirizzi IP SNAT persistenti e deterministici al traffico in uscita dai tuoi cluster. Con indirizzi di origine prevedibili, le reti esterne possono applicare misure di sicurezza basate su IP, come le policy di inserimento nella lista consentita. Il gateway NAT in uscita è una funzionalità di networking avanzata basata su Dataplane V2.
Come funziona il gateway NAT in uscita
Il gateway NAT in uscita viene abilitato utilizzando due risorse personalizzate. Per un determinato spazio dei nomi, la risorsa personalizzata NetworkGatewayGroup specifica gli indirizzi IP mobili che possono essere configurati sull'interfaccia di rete di un nodo scelto per fungere da gateway. La risorsa personalizzata EgressNatPolicy consente di specificare policy di routing in uscita per controllare il traffico sul gateway in uscita.
Se non configuri un gateway NAT in uscita o se il traffico in uscita non soddisfa le regole di selezione del traffico, il traffico in uscita da un determinato pod a una destinazione esterna al cluster viene mascherato con l'indirizzo IP del nodo in cui è in esecuzione il pod. In questo scenario, non è garantito che tutto il traffico in uscita da un determinato pod abbia lo stesso indirizzo IP di origine o che venga mascherato con lo stesso indirizzo IP del nodo.
La logica di selezione del traffico in uscita si basa su un selettore di spazi dei nomi, un selettore di pod e un insieme di intervalli di indirizzi IP di destinazione nella notazione dei blocchi CIDR. Per illustrare il funzionamento del gateway NAT in uscita, considera il flusso di un pacchetto da un pod a un consumer esterno e la risposta corrispondente. Supponiamo che la subnet del nodo abbia indirizzi IP nel blocco CIDR 192.168.1.0/24.
Il seguente diagramma mostra l'architettura di rete per il traffico in uscita tramite un nodo gateway.
Il flusso di pacchetti attraverso il gateway NAT in uscita potrebbe essere simile al seguente:
Il traffico in uscita viene generato da un pod con indirizzo IP
10.10.10.1in un nodo con indirizzo IP192.168.1.1.L'indirizzo di destinazione del traffico è un endpoint esterno al cluster.
Se il traffico corrisponde a una regola in uscita, il programma eBPF instrada il traffico in uscita al nodo gateway, anziché mascherarlo direttamente con l'indirizzo IP del nodo.
Il nodo gateway riceve il traffico in uscita.
Il nodo gateway maschera l'indirizzo IP di origine del traffico,
10.10.10.1, con l'indirizzo IP di uscita di origine,192.168.1.100, specificato nella risorsa personalizzataEgressNATPolicy.Il traffico di ritorno torna al nodo gateway con destinazione
192.168.1.100.Il nodo gateway associa il conntrack del traffico di ritorno a quello del traffico in uscita originale e riscrive l'indirizzo IP di destinazione come
10.10.10.1.10.10.10.1viene trattato come traffico interno al cluster, instradato al nodo originale e recapitato al pod originale.
Prima di iniziare
Se i nodi eseguono Ubuntu 18.04, il kernel Linux deve essere la versione 5.4 o successive. Per saperne di più, consulta Configura Ubuntu.
Configura gli indirizzi IP mobili per il traffico dei nodi
La risorsa personalizzata Network Gateway Group è un componente integrato di Google Distributed Cloud. La risorsa gestisce un elenco di uno o più indirizzi IP mobili da utilizzare per il traffico in uscita dai nodi del cluster. I nodi partecipanti sono determinati dallo spazio dei nomi specificato. Il gruppo di gateway di rete rende sempre disponibile un indirizzo IP mobile secondo il principio del "best effort". Se un nodo che utilizza un indirizzo IP mobile non è disponibile, l'operatore di rete avanzato sposta l'indirizzo IP assegnato al nodo successivo disponibile. Anche tutto il traffico in uscita del workload che utilizza quell'indirizzo IP verrà spostato.
Includi i dettagli del gruppo di gateway di rete (annotazione e specifica) nel file di configurazione del cluster quando crei un nuovo cluster 1.36.200-gke.118.
Crea la risorsa personalizzata NetworkGatewayGroup
Per attivare il gruppo di gateway di rete, imposta il campo spec.clusterNetwork.advancedNetworking su true nel file di configurazione del cluster quando crei un cluster, come mostrato nell'esempio seguente:
apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
name: cluster1
namespace: cluster-cluster1
spec:
clusterNetwork:
...
advancedNetworking: true
...
Quando crei la risorsa personalizzata NetworkGatewayGroup, imposta il relativo spazio dei nomi su quello del cluster e specifica un elenco di indirizzi IP mobili, come mostrato nell'esempio seguente:
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
L'operatore di networking avanzato assegna gli IP mobili ai nodi in base ai seguenti criteri:
- Subnet del nodo: l'indirizzo IP mobile deve corrispondere alla subnet del nodo.
- Ruolo del nodo (control plane, worker): i nodi worker hanno la precedenza sui nodi del control plane quando vengono assegnati indirizzi IP mobili.
- Se un nodo ha un indirizzo IP mobile: l'operatore dà la priorità alle assegnazioni ai nodi a cui non è già stato assegnato un IP mobile.
La mappatura degli indirizzi ai nodi è disponibile nella sezione status quando recuperi l'oggetto NetworkGatewayGroup. Tieni presente che l'oggetto NetworkGatewayGroup si trova nello spazio dei nomi kube-system. Se un nodo gateway non è attivo, l'operatore di rete avanzato assegna gli indirizzi IP mobili al nodo successivo disponibile.
Verifica la configurazione del gateway
Dopo aver applicato le modifiche alla configurazione del gateway, puoi utilizzare kubectl per controllare lo stato del gateway e recuperare gli indirizzi IP mobili specificati per il gateway.
Utilizza il seguente comando per controllare lo stato di NetworkGatewayGroup e vedere come vengono allocati gli indirizzi IP mobili:
kubectl -n kube-system get networkgatewaygroups.networking.gke.io default -o yamlLa risposta per un cluster con due nodi, worker1 e worker2, potrebbe
essere simile alla seguente:
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
status:
nodes:
worker1: Up
worker2: Up // Or Down
floatingIPs:
192.168.1.100: worker1
192.168.1.101: worker2
192.168.1.102: worker1
Imposta regole di selezione del traffico
La risorsa personalizzata EgressNATPolicy specifica le regole di selezione del traffico e assegna un indirizzo IP deterministico per il traffico in uscita dal cluster.
Quando specifichi la risorsa personalizzata, egress (con almeno una regola), destinationCIDRs e egressSourceIP sono tutti obbligatori.
Utilizza kubectl apply per creare la risorsa personalizzata EgressNATPolicy. Le sezioni seguenti forniscono dettagli ed esempi per la definizione della specifica.
Specifica le regole di instradamento in uscita
La risorsa personalizzata EgressNatPolicy consente di specificare le seguenti regole per il traffico in uscita:
Devi specificare una o più regole di selezione del traffico in uscita nella sezione
egress.- Ogni regola è composta da un
podSelectore da unnamespaceSelector. - La selezione si basa su un'etichetta dello spazio dei nomi,
namespaceSelector.matchLabels.user, e su un'etichetta del pod,podSelector.matchLabels.role. - Se un pod corrisponde a una delle regole (la corrispondenza utilizza una relazione OR), viene selezionato per il traffico in uscita.
- Ogni regola è composta da un
Specifica gli indirizzi di destinazione consentiti nella sezione
destinationCIDRs.destinationCIDRsaccetta un elenco di blocchi CIDR.- Se il traffico in uscita da un pod ha un indirizzo IP di destinazione che rientra nell'intervallo di uno dei blocchi CIDR specificati, viene selezionato per il traffico in uscita.
Nell'esempio seguente, il traffico in uscita da un pod è consentito se vengono soddisfatti i seguenti criteri:
- Il pod è etichettato con
role: frontend. - Il pod si trova in uno spazio dei nomi etichettato come
user: aliceouser: paul. - Il pod sta comunicando con gli indirizzi IP nel blocco CIDR
8.8.8.0/24.
kind: EgressNATPolicy
apiVersion: networking.gke.io/v1
metadata:
name: egress
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
Per saperne di più sull'utilizzo delle etichette, consulta Etichette e selettori nella documentazione di Kubernetes.
Ottieni un indirizzo IP di origine per il traffico in uscita
La risorsa personalizzata (policy) EgressNATPolicy utilizza i valori gatewayRef.name e gatewayRef.namespace per trovare un oggetto NetworkGatewayGroup (gateway).
La policy utilizza uno degli indirizzi IP mobili del gateway come indirizzo IP di origine per il traffico in uscita. Se nel gateway corrispondente sono presenti più indirizzi IP mobili, la policy utilizza il primo indirizzo IP nell'elenco floatingIPs e ignora tutti gli altri indirizzi IP. Per il gateway di esempio, il primo indirizzo nell'elenco floatingIPs è 192.168.1.100. La presenza di campi o valori non validi nella sezione gatewayRef comporterà la mancata applicazione dell'oggetto della policy.
Più policy in uscita e più oggetti gateway
Come descritto nella sezione precedente, ogni oggetto egressNATPolicy (policy) utilizza il primo indirizzo IP nell'elenco floatingIPs dell'oggetto gateway che corrisponde a gatewayRef.name e gatewayRef.namespace. Puoi creare più policy e, se intendi utilizzare indirizzi IP diversi, devi creare più oggetti NetworkGatewayGroup e fare riferimento a questi rispettivamente.
Ogni risorsa NetworkGatewayGroup deve contenere indirizzi IP mobili univoci.
Per configurare più oggetti EgressNATPolicy in modo che utilizzino lo stesso indirizzo IP, utilizza lo stesso gatewayRef.name e lo stesso gatewayRef.namespace per entrambi.
Per configurare più policy in uscita e più oggetti gateway:
Crea oggetti gateway nello spazio dei nomi
kube-systemper gestire ogni indirizzo IP mobile. In genere, ogni policy in uscita deve avere un oggetto gateway corrispondente per garantire l'allocazione dell'indirizzo IP corretto.Poi, verifica ogni oggetto gateway con
kubectlper ottenere lo stato di allocazione degli indirizzi IP mobili: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: worker1Crea più policy che fanno riferimento agli oggetti gateway, ad esempio
gateway1creato nel passaggio precedente:kind: EgressNATPolicy apiVersion: networking.gke.io/v1 metadata: name: egress1 spec: ... gatewayRef: name: gateway1 namespace: kube-system --- kind: EgressNATPolicy apiVersion: networking.gke.io/v1 metadata: name: egress2 spec: ... gatewayRef: name: gateway2 namespace: kube-system --- kind: EgressNATPolicy apiVersion: networking.gke.io/v1 metadata: name: egress3 spec: ... gatewayRef: name: gateway3 namespace: kube-system
(Facoltativo) Specifica i nodi su cui posizionare gli indirizzi IP mobili
Le risorse NetworkGatewayGroup supportano i selettori dei nodi. Per specificare un sottoinsieme di nodi che vengono presi in considerazione per l'hosting di un indirizzo IP mobile, puoi aggiungere il selettore di nodi all'oggetto NetworkGatewayGroup come mostrato nell'esempio seguente:
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"
Il selettore dei nodi corrisponde ai nodi con l'etichetta specificata e solo questi nodi vengono presi in considerazione per l'hosting di un indirizzo IP mobile. Se specifichi più selettori, la loro logica è additiva, quindi un nodo deve corrispondere a ogni etichetta per essere preso in considerazione per l'hosting di un indirizzo IP mobile. Se non ci sono molti nodi con etichette corrispondenti, un selettore di nodi può ridurre le qualità di alta affidabilità (HA) del posizionamento degli indirizzi IP mobili.
Failover rapido per un gateway NAT in uscita ad alta affidabilità
Per i cluster della versione 1.34 e successive, puoi configurare il gateway NAT in uscita con failover rapido. Quando hai più indirizzi IP mobili e configuri il failover rapido, ottieni un traffico in uscita ad alta affidabilità. Questa funzionalità fornisce una migliore distribuzione del carico per il traffico in uscita e un failover più rapido per ridurre al minimo i tempi di inattività. Anziché fare affidamento su un singolo nodo gateway alla volta (active-standby), il cluster distribuisce il traffico in uscita su più nodi gateway e su tutti gli indirizzi IP mobili configurati in una risorsaNetworkGatewayGroup.
Questo modello attivo-attivo offre i seguenti vantaggi principali:
Distribuzione del carico: il traffico in uscita da endpoint di origine diversi, come i pod, viene distribuito su tutti i nodi gateway disponibili, riducendo il carico su ogni singolo nodo e aumentando la larghezza di banda in uscita totale disponibile.
Failover rapido: se un nodo gateway in uscita non funziona, il traffico viene reindirizzato automaticamente ai nodi integri rimanenti. L'obiettivo è eseguire rapidamente il failover del traffico. Mentre le connessioni esistenti sul nodo con errore vengono interrotte, le nuove connessioni vengono stabilite immediatamente tramite altri gateway, riducendo al minimo il tempo di inattività.
Differenze principali
La configurazione del gateway NAT in uscita per il failover rapido modifica il funzionamento del gateway NAT in uscita:
| Capacità | Attivo-standby (valore predefinito) | Attivo-attivo (failover rapido) |
|---|---|---|
| Utilizzo di IP mobile | EgressNATPolicy utilizza solo il primo indirizzo IP mobile in NetworkGatewayGroup. |
Tutti gli indirizzi IP mobili elencati in NetworkGatewayGroup distribuiscono attivamente il traffico in uscita. |
| Failover | Se il nodo gateway non funziona, lo stesso indirizzo IP mobile viene spostato in un nodo diverso, il che può causare l'interruzione del traffico. | Se un nodo gateway non funziona, il traffico viene reindirizzato a un indirizzo IP diverso e integro su un altro nodo. Le nuove connessioni vengono instradate immediatamente attraverso i gateway integri, mentre le connessioni stateful esistenti sul nodo con errori vengono terminate. |
| Traffico | Tutto il traffico per una determinata policy passa attraverso un singolo nodo gateway. | Il traffico viene distribuito tra più nodi gateway in base a un hashing coerente dell'endpoint di origine, ad esempio un pod. |
Configura il failover rapido
La configurazione della funzionalità prevede due passaggi principali:
Specifica più indirizzi IP mobili.
Configura
NetworkGatewayGroupcon un pool di almeno due indirizzi IP mobili per sfruttare i vantaggi dell'alta affidabilità e della distribuzione del carico. L'utilizzo di più indirizzi IP mobili migliora l'affidabilità e il throughput in uscita.Ecco un esempio di configurazione:
apiVersion: networking.gke.io/v1 kind: NetworkGatewayGroup metadata: name: egress-gateways namespace: cluster-admin spec: nodeSelector: # Selects nodes that are designated as egress gateways node-role.kubernetes.io/egress: "" floatingIPs: - "192.168.1.100" - "192.168.1.101" - "192.168.1.102"Per attivare il failover rapido, aggiungi l'annotazione
networking.gke.io/egressnat-ha: "enable"alla risorsa personalizzataEgressNATPolicy:kind: EgressNATPolicy apiVersion: networking.gke.io/v1 metadata: name: egress annotations: networking.gke.io/egressnat-ha: "enable" spec: ...
Regole di selezione del traffico in uscita e policy di rete
Il gateway NAT in uscita è compatibile con le API delle policy di rete. Le policy di rete vengono valutate per prime e hanno la precedenza sulle regole di selezione del traffico del gateway NAT in uscita. Ad esempio, se il traffico in uscita attiva una policy di rete che comporta l'eliminazione del pacchetto, le regole del gateway in uscita non controlleranno il pacchetto. Solo quando la policy di rete consente l'uscita del pacchetto, verranno valutate le regole di selezione del traffico in uscita per decidere come gestire il traffico, utilizzando il gateway NAT in uscita o mascherando direttamente l'indirizzo IP del nodo in cui è in esecuzione il pod.
Limitazioni
Le limitazioni attuali per il gateway NAT in uscita includono:
Il gateway NAT in uscita è abilitato solo per la modalità IPv4.
Gli indirizzi IP in uscita devono trovarsi nello stesso dominio di livello 2 degli indirizzi IP dei nodi.
Se configuri il bilanciamento del carico BGP standard insieme a NAT in uscita e utilizzi l'API GKE On-Prem per gestire i cluster (con Terraform, la console Google Cloud o l'interfaccia a riga di comando
gcloud), i selettori dei peer BGP non sono supportati. Questa mancanza di supporto può far sì che le sessioni BGP utilizzino in modo casuale IP locali errati per il peering, il che porta a un errore di peering BGP. Per una soluzione alternativa, consulta Configura i bilanciatori del carico in bundle con BGP: limitazione del selettore BGP.