Controlla il traffico in uscita dai pod utilizzando i criteri di rete FQDN


Questa pagina spiega come controllare le comunicazioni in uscita tra i pod e le risorse al di fuori del cluster Google Kubernetes Engine (GKE) utilizzando i nomi di dominio completi (FQDN). La risorsa personalizzata utilizzata per configurare gli FQDN è la risorsa FQDNNetworkPolicy.

Prima di iniziare

Prima di iniziare, assicurati di aver eseguito le seguenti attività:

  • Attiva l'API Google Kubernetes Engine.
  • Abilita l'API Google Kubernetes Engine
  • Se vuoi utilizzare Google Cloud CLI per questa attività, installa e poi inizializza gcloud CLI. Se hai già installato gcloud CLI, ottieni la versione più recente eseguendo gcloud components update.

Requisiti e limitazioni

Le risorse FQDNNetworkPolicy presentano i seguenti requisiti e limitazioni:

  • Devi avere un cluster GKE che esegue uno dei seguenti versioni:
    • 1.26.4-gke.500 o successive
    • 1.27.1-gke.400 o versioni successive
  • Il cluster deve utilizzare GKE Dataplane V2.
  • Devi utilizzare uno dei provider DNS nel tuo cluster GKE, kube-dns o Cloud DNS. I deployment personalizzati di kube-dns o Core DNS non sono supportati.
  • Google Cloud CLI versione 462.0.0 o successive.
  • I pool di nodi Windows non sono supportati.
  • Cloud Service Mesh non è supportato.
  • Se la tua applicazione contiene indirizzi IP hardcoded, utilizza Campo IPBlock di Kubernetes NetworkPolicy anziché FQDNNetworkPolicy.
  • I risultati restituiti dai server dei nomi DNS non cluster, come i server dei nomi alternativi in resolv.conf, non sono considerati validi per essere programmati nella lista consentita nel piano dati GKE.
  • Il numero massimo di indirizzi IP IPv4 e IPv6 a cui può risolvere un FQDNNetworkPolicy è 50.
  • Non puoi consentire il traffico verso un ClusterIP o un servizio Headless come traffico in uscita destinazione in un FQDNNetworkPolicy perché GKE traduce Indirizzo IP virtuale (VIP) del servizio agli indirizzi IP dei pod di backend prima della valutazione regole dei criteri di rete. Utilizza invece un NetworkPolicy basato su etichette Kubernetes.
  • Esiste una quota massima di 100 indirizzi IP per nome host.
  • La crittografia trasparente tra nodi non è supportata con la rete FQDN Norme.

Abilita il criterio di rete FQDN

Puoi abilitare il criterio di rete FQDN su un cluster nuovo o esistente.

Abilita il criterio di rete FQDN in un nuovo cluster

Crea il cluster utilizzando il flag --enable-fqdn-network-policy:

gcloud container clusters create CLUSTER_NAME  \
    --enable-fqdn-network-policy

Sostituisci CLUSTER_NAME con il nome del tuo cluster.

Abilita il criterio di rete FQDN in un cluster esistente

  1. Per i cluster Autopilot e Standard, aggiorna il cluster utilizzando il flag --enable-fqdn-network-policy:

    gcloud container clusters update CLUSTER_NAME  \
        --enable-fqdn-network-policy
    

    Sostituisci CLUSTER_NAME con il nome del cluster.

  2. Solo per i cluster Standard, riavvia GKE Dataplane V2 anetd DaemonSet:

    kubectl rollout restart ds -n kube-system anetd
    

Crea un FQDNNetworkPolicy

  1. Salva il seguente manifest come fqdn-network-policy.yaml:

    apiVersion: networking.gke.io/v1alpha1
    kind: FQDNNetworkPolicy
    metadata:
      name: allow-out-fqdnnp
    spec:
      podSelector:
        matchLabels:
          app: curl-client
      egress:
      - matches:
        - pattern: "*.yourdomain.com"
        - name: "www.google.com"
        ports:
        - protocol: "TCP"
          port: 443
    

    Questo manifest ha le seguenti proprietà:

    • name: www.google.com: il nome di dominio completo. Sono consentiti gli indirizzi IP forniti dal server dei nomi associato a www.google.com. Devi specificare name, pattern o entrambi.
    • pattern: "*.yourdomain.com": sono consentiti gli indirizzi IP forniti dai server DNS che corrispondono a questo pattern. Puoi utilizzare le seguenti espressioni regolari per la chiave del pattern:^([a-zA-Z0-9*]([-a-zA-Z0-9_*]*[a-zA-Z0-9*])*\.?)*$. I criteri di corrispondenza sono additivo. Puoi utilizzare più campi pattern. Devi specificare: name, pattern o entrambi.
    • protocol: "TCP" e port: 443: specifica un protocollo e una porta. Se Il pod tenta di stabilire una connessione agli indirizzi IP utilizzando questo protocollo e porta, la risoluzione del nome funziona, ma il piano dati si blocca la connessione in uscita. Questo campo è facoltativo.
  2. Verifica che il criterio di rete selezioni i tuoi carichi di lavoro:

    kubectl describe fqdnnp
    

    L'output è simile al seguente:

    Name:         allow-out-fqdnnp
    Labels:       <none>
    Annotations:  <none>
    API Version:  networking.gke.io/v1alpha1
    Kind:         FQDNNetworkPolicy
    Metadata:
    ...
    Spec:
      Egress:
        Matches:
          Pattern:  *.yourdomain.com
          Name:     www.google.com
        Ports:
          Port:      443
          Protocol:  TCP
      Pod Selector:
        Match Labels:
          App: curl-client
    Events:     <none>
    

Elimina un FQDNNetworkPolicy

Puoi eliminare FQDNNetworkPolicy utilizzando il comando kubectl delete fqdnnp:

kubectl delete fqdnnp FQDN_POLICY_NAME

Sostituisci FQDN_POLICY_NAME con il nome del tuo FQDNNetworkPolicy.

GKE elimina le regole dall'applicazione dei criteri, ma le connessioni esistenti rimangono attive fino alla chiusura in base alle linee guida del protocollo conntrack standard.

Come funzionano i criteri di rete del nome di dominio completo

FQDNNetworkPolicies sono criteri di sola uscita che controllano a quali endpoint possono inviare traffico i pod selezionati. Analogamente a Kubernetes NetworkPolicy, FQDNNetworkPolicy che seleziona un carico di lavoro crea una regola di negazione implicita per endpoint non specificati come destinazioni in uscita consentite. FQDNNetworkPolicies può essere utilizzato con Kubernetes NetworkPolicies come descritto in FQDNNetworkPolicy e NetworkPolicy.

FQDNNetworkPolicies viene applicato a livello di indirizzo IP e di porta. Sono non applicato utilizzando informazioni sul protocollo di livello 7 (ad es. Request-URI in un HTTP). I nomi di dominio specificati vengono tradotti in indirizzi IP utilizzando le informazioni DNS fornite dal provider DNS del cluster GKE.

Richieste DNS

Un FQDNNetworkPolicy attivo che seleziona i carichi di lavoro non influisce sulla capacità dei carichi di lavoro per effettuare richieste DNS. Comandi come nslookup o dig funzionano su domini senza essere interessati dal criterio. Tuttavia, le richieste successive verranno eliminati agli indirizzi IP che supportano i domini non inclusi in allowist.

Ad esempio, se FQDNNetworkPolicy consente il traffico in uscita verso www.github.com, Le richieste DNS per tutti i domini sono consentite, ma il traffico viene inviato a un indirizzo IP il backup twitter.com viene eliminato.

Scadenza TTL

FQDNNetworkPolicy rispetta il TTL fornito da un record DNS. Se un pod tenta di per contattare un indirizzo IP scaduto una volta trascorso il TTL del record DNS, vengono rifiutate. Le connessioni di lunga durata la cui durata supera il TTL del record DNS non dovrebbero subire interruzioni del traffico mentre conntrack considera la connessione ancora attiva.

FQDNNetworkPolicy e NetworkPolicy

Quando allo stesso pod vengono applicati sia un FQDNNetworkPolicy sia un NetworkPolicy, ovvero le etichette del pod corrispondono a quelle configurate nei criteri, il traffico in uscita è consentito purché corrisponda a uno dei criteri. Non sono presenti gerarchia tra il traffico in uscita da NetworkPolicies e la specifica di indirizzi IP oppure selettori di etichette e FQDNNetworkPolicies.

Endpoint di indirizzi IP condivisi (bilanciatori del carico, CDN, gateway VPN e così via)

Molti domini non hanno indirizzi IP dedicati e sono invece esposti utilizzando indirizzi IP condivisi. Ciò è particolarmente comune quando è gestita da un bilanciatore del carico o una CDN. Ad esempio, le API Google Cloud (compute.googleapis.com, container.googleapis.com e così via) non hanno indirizzi IP univoci per ogni API. Tutte le API sono invece esposte utilizzando un intervallo condiviso.

Quando configuri FQDNNetworkPolicies, è importante valutare se i domini consentiti utilizzano indirizzi IP dedicati o condivisi. Poiché FQDNNetworkPolicies vengono applicati a livello di indirizzo IP e porta, non possono distinguere tra più domini serviti dallo stesso indirizzo IP. Autorizzato a un dominio supportato da un indirizzo IP condiviso consentirà al pod di comunicare con tutti gli altri domini gestiti da quell'indirizzo IP. Ad esempio, consentire il traffico a compute.googleapis.com consentirà anche al pod di dialogare con altre API Google Cloud.

Inseguimento CNAME

Se l'oggetto FQDN in FQDNNetworkPolicy include un dominio con CNAME nel record DNS, devi configurare FQDNNetworkPolicy con tutti i nomi di dominio su cui il pod può eseguire query direttamente, inclusi tutti i potenziali alias, per garantire un comportamento affidabile di FQDNNetworkPolicy.

Se il tuo pod esegue query su example.com, devi scrivere example.com nella regola. Anche se ricevi una catena di alias dal DNS upstream server (ad es. da example.com a example.cdn.com a 1.2.3.4), la rete FQDN Le norme consentiranno comunque di passare al tuo traffico.

Problemi noti

Questa sezione elenca tutti i problemi noti relativi ai nomi di dominio completi (FQDN).

La specifica di protocol: ALL fa sì che il criterio venga ignorato

Questo problema noto è stato risolto per le versioni GKE 1.27.10-gke.1055000 e successive e 1.28.3-gke.1055000 e successive

Se crei un FQDNNetworkPolicy che specifica protocol: ALL nel ports, GKE non applica il criterio. Questo problema si verifica a causa di un problema con l'analisi del criterio. La specifica di TCP o UDP non causa questo problema.

Come soluzione alternativa, se non specifichi un protocol nella voce ports, per impostazione predefinita la regola corrisponde a tutti i protocolli. La rimozione di protocol: ALL aggira il problema di analisi e GKE applica FQDNNetworkPolicy.

In GKE 1.27.10-gke.1055000 e versioni successive e 1.28.3-gke.1055000 e versioni successive, i criteri con protocol: ALL vengono analizzati e applicati correttamente.

La registrazione di NetworkPolicy causa log errati o mancanti

Questo problema noto è stato risolto per le versioni GKE 1.27.10-gke.1055000+ e 1.28.2-gke.1157000+

Se il tuo cluster utilizza il registro dei criteri di rete e i criteri di rete FQDN, è presente un bug che può causare voci di log mancanti o errate.

Quando utilizzi il logging dei criteri di rete senza delegato, il criterio registra il DNS per il DNS connessioni che lasciano un carico di lavoro affermano erroneamente che il traffico è stato interrotto. Il traffico stesso era consentito (in base al FQDNNetworkPolicy), ma i log erano risposta errata.

Quando utilizzi il logging dei criteri di rete con la delega, i log dei criteri non sono presenti. Il traffico stesso non è interessato.

Questo bug è stato corretto in GKE 1.27.10-gke.105500 e versioni successive e in 1.28.2-gke.1157000 e versioni successive. Ora le connessioni DNS verranno registrate correttamente come ALLOWED, quando il traffico viene selezionato da un NetworkPolicy o da un FQDNNetworkPolicy.

Passaggi successivi