Agente di mascheramento IP

Questa pagina spiega come funziona l'IP masquerading in Google Kubernetes Engine (GKE) e fornisce opzioni di configurazione per diversi scenari.

Questa pagina presuppone che tu conosca l'IP masquerading in Kubernetes.

IP masquerading GKE

GKE può utilizzare l'IP masquerading per modificare gli indirizzi IP di origine dei pacchetti inviati dai pod. Quando l'IP masquerading viene applicato a un pacchetto emesso da un pod, GKE modifica l'indirizzo IP di origine del pacchetto dall'indirizzo IP del pod all'indirizzo IP del nodo sottostante. Il mascheramento dell'indirizzo IP di origine di un pacchetto è utile quando un destinatario è configurato per ricevere pacchetti solo dagli indirizzi IP dei nodi del cluster.

Sui nodi Linux, GKE configura le regole iptables. GKE utilizza il DaemonSet ip-masq-agent per configurare il dataplane appropriato.

ip-masq-agent non è supportato sui node pool Windows Server. Tuttavia, i nodi Windows eseguono l'IP masquerading (Source Network Address Translation o SNAT) per i pacchetti inviati a destinazioni esterne al cluster riscrivendo l'indirizzo IP del pod di origine con l'indirizzo IP del nodo. SNAT viene ignorato per i pacchetti inviati agli indirizzi IP di pod o nodi all'interno dello stesso cluster. Questo comportamento sui nodi Windows non è configurabile dall'utente.

IP masquerading per i cluster Standard

Nei cluster Standard, il comportamento di IP masquerading del cluster è regolato da tre fattori:

La seguente tabella riepiloga le configurazioni di mascheramento IP per i cluster GKE Standard:

Configurazione cluster Comportamento SNAT risultante

Il DaemonSet ip-masq-agent è presente nel cluster e esiste un elenco nonMasqueradeCIDRs personalizzato in ip-masq-agent ConfigMap.

GKE conserva gli indirizzi IP dei pod di origine per i pacchetti inviati alle destinazioni specificate nell'elenco nonMasqueradeCIDRs.

GKE modifica gli indirizzi IP dei pod di origine in indirizzi IP dei nodi di origine per i pacchetti inviati a destinazioni non specificate nell'elenco nonMasqueradeCIDRs.

Il DaemonSet ip-masq-agent è presente nel cluster, ma un elenco nonMasqueradeCIDRs personalizzato non esiste nel ConfigMap ip-masq-agent o il ConfigMap ip-masq-agent non è presente.

GKE conserva gli indirizzi IP dei pod di origine per i pacchetti inviati a un insieme di destinazioni non mascherate predefinite.

GKE modifica gli indirizzi IP dei pod di origine in indirizzi IP dei nodi di origine per i pacchetti inviati a destinazioni al di fuori delle destinazioni non mascherate predefinite.

Il DaemonSet ip-masq-agent non è presente nel cluster e hai creato il cluster senza il flag --disable-default-snat.

GKE conserva gli indirizzi IP dei pod di origine per i pacchetti inviati a un insieme di destinazioni non mascherate predefinite.

GKE modifica gli indirizzi IP dei pod di origine in indirizzi IP dei nodi di origine per i pacchetti inviati a destinazioni al di fuori delle destinazioni non mascherate predefinite.

Il DaemonSet ip-masq-agent non è presente nel cluster, ma hai creato il cluster con il flag --disable-default-snat.

GKE conserva gli indirizzi IP dei pod di origine per i pacchetti inviati a tutte le destinazioni.

Consulta Conservare le origini degli indirizzi IPv4 dei pod per le destinazioni internet per importanti considerazioni sul routing quando conservi gli indirizzi di origine IPv4 dei pod e devi instradare i pacchetti a internet.

IP Masquerading per i cluster Autopilot

Nei cluster Autopilot, GKE esegue sempre il deployment di un DaemonSet ip-masq-agent. Ad eccezione dei pacchetti inviati dai pod agli intervalli di nodi, pod o servizi del cluster, puoi controllare il comportamento di IP masquerading utilizzando un EgressNATPolicy. Per utilizzare un EgressNATPolicy, il tuo cluster Autopilot deve soddisfare entrambi i seguenti requisiti:

  • Il cluster deve utilizzare GKE 1.23.4-gke.1600 o versioni successive oppure 1.22.7-gke.1500 o versioni successive.
  • Il cluster deve essere stato creato con GKE Dataplane V2 abilitato.

La seguente tabella riepiloga le configurazioni di mascheramento IP per i cluster GKE Autopilot:

Configurazione del cluster Autopilot Comportamento SNAT risultante

Il cluster include un EgressNATPolicy personalizzato il cui spec.action è NoSNAT contenente destinazioni non mascherate specificate in spec.destinations[].

GKE conserva gli indirizzi IP dei pod di origine per i pacchetti inviati alle destinazioni specificate in spec.destinations[] di EgressNATPolicy. GKE lo fa traducendo spec.destinations[] in un elenco nonMasqueradeCIDRs in un ip-masq-agent configMap.

GKE modifica gli indirizzi IP dei pod di origine in indirizzi IP dei nodi di origine per i pacchetti inviati alle destinazioni non specificate in spec.destinations[] di EgressNATPolicy.

Il cluster non include un EgressNATPolicy personalizzato.

Si applicano sia i EgressNATPolicy predefiniti sia i criteri gestiti da GKE, con il seguente comportamento:

  • GKE conserva gli indirizzi IP dei pod di origine per i pacchetti inviati a un insieme di destinazioni non mascherate predefinite.
  • GKE modifica gli indirizzi IP dei pod di origine in indirizzi IP dei nodi di origine per i pacchetti inviati a destinazioni esterne alle destinazioni predefinite non mascherate.

Esempi di configurazione

Espandi le sezioni seguenti per visualizzare esempi di IP masquerading e configurazione in base al tipo di cluster.

Guida di riferimento alla configurazione avanzata

Quando ip-masq-agent viene implementato automaticamente

Nei cluster in modalità Autopilot, GKE esegue sempre il deployment di un DaemonSet ip-masq-agent.

Nei cluster Standard, GKE esegue il deployment di un DaemonSet ip-masq-agent quando il flag --disable-default-snat non è impostato e il cluster utilizza una delle seguenti combinazioni di configurazione:

Affinché il DaemonSet ip-masq-agent sia efficace, devi anche specificare l'elenco nonMasqueradeCIDRs in ConfigMap ip-masq-agent. Per saperne di più, consulta come configurare un agente di IP masquerading.

Quando un DaemonSet ip-masq-agent è presente in un cluster, GKE aggiorna e riconcilia un pod di distribuzione su ogni nodo del cluster.

Destinazioni non mascherate predefinite

Le destinazioni non mascherate predefinite sono:

  • 10.0.0.0/8
  • 172.16.0.0/12
  • 192.168.0.0/16
  • 100.64.0.0/10
  • 192.0.0.0/24
  • 192.0.2.0/24
  • 192.88.99.0/24
  • 198.18.0.0/15
  • 198.51.100.0/24
  • 203.0.113.0/24
  • 240.0.0.0/4

Le destinazioni non mascherate predefinite sono applicabili ai cluster con le seguenti configurazioni:

Le destinazioni non mascherate predefinite non sono applicabili ai cluster con le seguenti configurazioni:

Effetto del flag --disable-default-snat

Il flag --disable-default-snat modifica il comportamento SNAT predefinito di GKE in modo che gli indirizzi IP dei pod di origine vengano conservati per i pacchetti inviati a tutte le destinazioni. GKE implementa il comportamento SNAT predefinito non eseguendo il deployment di alcun DaemonSet ip-masq-agent nel cluster.

Il flag --disable-default-snat non ha effetto quando un cluster include un DaemonSet ip-masq-agent:

Puoi impostare il flag --disable-default-snat aggiornando un cluster dopo la sua creazione. Se nel cluster non è stato eseguito il deployment di alcun DaemonSet ip-masq-agent, la disabilitazione della SNAT predefinita diventa effettiva dopo che il cluster ha sostituito tutti i suoi nodi, a volte ore dopo. Questo perché GKE rispetta i periodi di manutenzione configurati quando sostituisce i nodi nel cluster. Se non hai configurato alcuna finestra di manutenzione, devi eseguire il ciclo dei nodi nel cluster manualmente prima che il flag --disable-default-snat abbia effetto.

Mascheramento locale rispetto al collegamento

L'intervallo 169.254.0.0/16 viene utilizzato per gli indirizzi IP link-local. Il mascheramento locale rispetto al collegamento si riferisce alla modifica di un indirizzo IP pod di origine in un indirizzo IP nodo di origine per i pacchetti inviati alle destinazioni 169.254.0.0/16.

I cluster Autopilot conservano sempre gli indirizzi IP dei pod di origine per i pacchetti inviati alle destinazioni 169.254.0.0/16.

Per impostazione predefinita, i cluster Standard conservano anche gli indirizzi IP dei pod di origine per i pacchetti inviati alle destinazioni 169.254.0.0/16.

Puoi attivare l'IP masquerading link-local in un cluster Standard eseguendo entrambe le seguenti operazioni:

Contenitori e pod diagnostici con hostNetwork: true

A meno che tu non specifichi un indirizzo IP di origine personalizzato per i pacchetti, i pod in esecuzione con hostNetwork: true e i container di diagnostica inviano pacchetti con origini corrispondenti all'indirizzo IP del nodo. Per i pod in esecuzione con hostNetwork: true, GKE assegna al pod l'indirizzo IP del nodo. GKE non gestisce gli indirizzi IP per i container di diagnostica, inclusi i container per il debug dei problemi dei nodi utilizzando toolbox.

I cluster Autopilot non supportano l'esecuzione di pod con spec.hostNetwork: true. Poiché i nodi di un cluster Autopilot non sono accessibili tramite SSH, non puoi eseguire container di diagnostica su di essi.

Conservazione delle origini degli indirizzi IPv4 dei pod per le destinazioni internet

Se la configurazione di IP Masquerade del tuo cluster è una delle seguenti, GKE conserva le origini degli indirizzi IP dei pod per i pacchetti inviati a tutte le destinazioni, incluse quelle internet:

  • Nei cluster Standard con un DaemonSet ip-masq-agent, se hai impostato nonMasqueradeCIDRs su 0.0.0.0 in ConfigMap ip-masq-agent.
  • Nei cluster standard senza un DaemonSet ip-masq-agent, se hai impostato il flag --disable-default-snat.
  • Nei cluster Autopilot, se modifichi l'oggetto EgressNATPolicy predefinito in modo che spec.action sia NoSNAT e spec.destinations contenga Cidr: 0.0.0.0/0.

Le origini IPv4 dei pod sono indirizzi IPv4 interni, il che significa che non sono instradabili su internet. Di conseguenza, quando conservi gli indirizzi IPv4 dei pod di origine per i pacchetti inviati a internet, devi utilizzare una tecnica come una delle seguenti per instradare i pacchetti dopo che lasciano i nodi del cluster:

  • Assicurati che la tua rete VPC abbia una route predefinita con l'hop successivo del gateway internet predefinito e configura un gateway Cloud NAT per fornire servizi Public NAT almeno agli intervalli di indirizzi IPv4 secondari della subnet utilizzati dai pod nel cluster. Per saperne di più, consulta la sezione Interazione con GKE nella panoramica di Cloud NAT.
  • Configura la tua rete VPC in modo che utilizzi una route predefinita personalizzata il cui hop successivo sia un'istanza VM o un bilanciatore del carico di rete passthrough interno, in cui la VM o i backend del bilanciatore del carico siano stati configurati per instradare i pacchetti a internet per conto dei pod.

Ripristino del comportamento SNAT predefinito

Per ripristinare il comportamento SNAT predefinito quando è presente un ip-masq-agent DaemonSet in un cluster, elimina il ip-masq-agent ConfigMap associato. Il DaemonSet ip-masq-agent ripristina il comportamento predefinito dell'IP masquerading sui nodi che gestisce.

Per ripristinare il comportamento SNAT predefinito quando un DaemonSet ip-masq-agent non è presente in un cluster, devi eseguire l'upgrade del node pool (assicurati che --disable-default-snat non sia impostato sul cluster).

Effetto della policy NAT in uscita nei cluster Autopilot

La policy NAT in uscita di GKE ti consente di configurare l'IP masquerading sui cluster Autopilot. Puoi utilizzare la definizione di risorsa personalizzata (CRD) della policy NAT in uscita di GKE per modificare gli indirizzi IP di origine dei pacchetti inviati dai pod.

Per motivi di sicurezza o esaurimento degli indirizzi IP, puoi mascherare gli indirizzi IP dal pod all'intervallo di indirizzi IP del nodo per il traffico in uscita verso le reti on-premise. Ad esempio, puoi utilizzare un intervallo non RFC-1918 per i cluster Autopilot e un intervallo RFC-1918 per i nodi. Tuttavia, se i pod devono comunicare con reti on-premise che utilizzano anche un intervallo non RFC-1918, gli indirizzi IP possono sovrapporsi. Per evitare la perdita di traffico, puoi configurare una policy NAT in uscita in modo da non annunciare gli intervalli non RFC-1918 dei pod alle reti on-premise. La policy NAT in uscita maschera l'intervallo non RFC-1918 dei pod per utilizzare l'intervallo RFC-1918 del nodo. Assicurati che un intervallo di nodi non si sovrapponga a un intervallo on-premise, altrimenti potrebbe causare un loop di traffico.

GKE applica il comportamento di IP masquerading per i cluster Autopilot tramite il seguente processo:

  1. GKE esegue il deployment del controller NAT in uscita e di ip-masq-agent.
  2. Crea il criterio NAT in uscita.
  3. Il controller GKE traduce il criterio in ConfigMap ip-masq-agent.
  4. Il DaemonSet ip-masq-agent legge il ConfigMap e GKE applica il comportamento di IP masquerading.

Policy generate automaticamente

GKE supporta le seguenti due policy NAT in uscita generate automaticamente:

  • Predefinito: queste norme sono modificabili.
  • Gestite da GKE: queste policy sono fisse e non sono modificabili.

Policy predefinita

GKE predefinisce un insieme di intervalli di indirizzi IP predefiniti. Quando i pacchetti vengono inviati a queste destinazioni, il cluster non maschera le origini degli indirizzi IP e conserva gli indirizzi IP dei pod di origine. Per modificare questi intervalli di indirizzi IP predefiniti, consulta Modificare e implementare la policy NAT in uscita.

Il seguente manifest descrive una policy NAT in uscita predefinita:

    Name:         default
    Namespace:
    Labels:       <none>
    Annotations:  <none>
    API Version:  networking.gke.io/v1
    Kind:         EgressNATPolicy
    Metadata:
      Creation Timestamp:  2022-03-16T21:05:45Z
      Generation:          2
      Managed Fields:
        API Version:  networking.gke.io/v1
        Fields Type:  FieldsV1
        fieldsV1:
          f:spec:
            .:
            f:action:
          f:status:
        Manager:      egress-nat-controller
        Operation:    Update
        Time:         2022-03-16T21:05:45Z
        API Version:  networking.gke.io/v1
        Fields Type:  FieldsV1
        fieldsV1:
          f:spec:
            f:destinations:
        Manager:         kubectl
        Operation:       Update
        Time:            2022-03-17T01:58:13Z
      Resource Version:  189346
      UID:               06acbb5a-23ba-4c2a-bb34-9b6ed8c4a87f
    Spec:
      Action:  NoSNAT
      Destinations:
        Cidr:  10.0.0.0/8
        Cidr:  172.16.0.0/12
        Cidr:  192.168.0.0/16
        Cidr:  240.0.0.0/4
        Cidr:  192.0.2.0/24
        Cidr:  198.51.100.0/24
        Cidr:  203.0.113.0/24
        Cidr:  100.64.0.0/10
        Cidr:  198.18.0.0/15
        Cidr:  192.0.0.0/24
        Cidr:  192.88.99.0/24
    Status:
    Events:  <none>

Gli intervalli CIDR sono gli stessi degli intervalli di destinazione non mascherati predefiniti.

Gestita dalla policy GKE

La policy NAT in uscita di GKE prenota un intervallo statico di indirizzi IP necessari per preservare il funzionamento del cluster. Questo intervallo statico contiene gli intervalli di indirizzi IP di pod, servizi e nodi del cluster e potrebbe sovrapporsi alla policy predefinita.

Puoi identificare questa policy tramite un hash dinamico di 8 byte (gke-{CLUSTER_SHORT_HASH}) assegnato da GKE. Non puoi modificare questa policy.

Il seguente manifest descrive una policy gestita da GKE denominata gke-bbfa6c0e-1:

    Name:         gke-bbfa6c0e-1
    Namespace:
    Labels:       <none>
    Annotations:  <none>
    API Version:  networking.gke.io/v1
    Kind:         EgressNATPolicy
    Metadata:
      Creation Timestamp:  2022-03-16T21:05:46Z
      Generation:          1
      Managed Fields:
        API Version:  networking.gke.io/v1
        Fields Type:  FieldsV1
        fieldsV1:
          f:spec:
            .:
            f:action:
            f:destinations:
          f:status:
        Manager:         egress-nat-controller
        Operation:       Update
        Time:            2022-03-16T21:05:46Z
      Resource Version:  11699
      UID:               0201b5de-a6f6-4926-822b-31ed7cdee2c6
    Spec:
      Action:  NoSNAT
      Destinations:
        Cidr:  10.119.128.0/17
        Cidr:  10.120.0.0/22
        Cidr:  10.128.0.0/20
    Status:
    Events:  <none>

Passaggi successivi