Controllare il traffico in uscita dei pod utilizzando le policy di rete FQDN

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

Prima di iniziare

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

  • Abilita l'API Google Kubernetes Engine.
  • Abilita l'API Google Kubernetes Engine
  • Per utilizzare Google Cloud CLI per questa attività, installala e poi inizializza gcloud CLI. Se hai già installato gcloud CLI, scarica l'ultima versione eseguendo il comando gcloud components update. Le versioni precedenti di gcloud CLI potrebbero non supportare l'esecuzione dei comandi in questo documento.

Requisiti e limitazioni

Le risorse FQDNNetworkPolicy hanno i seguenti requisiti e limitazioni:

  • Il cluster deve utilizzare GKE Dataplane V2.
    • Devi utilizzare uno dei provider DNS nel tuo cluster GKE, kube-dns o Cloud DNS. I deployment kube-dns o Core DNS personalizzati non sono supportati.
  • Google Cloud CLI versione 462.0.0 o successive.
  • I node pool Windows non sono supportati.
  • Cloud Service Mesh non è supportato.
  • Se nella tua applicazione sono presenti indirizzi IP hardcoded, utilizza il campo IPBlock di Kubernetes NetworkPolicy anziché un 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 la programmazione nella lista consentita nel piano dati GKE.
  • Il numero massimo di indirizzi IP IPv4 e IPv6 in cui un FQDNNetworkPolicy può essere risolto è 50.
  • Non puoi consentire il traffico verso un servizio ClusterIP o headless come destinazione in uscita in un FQDNNetworkPolicy perché GKE traduce l'indirizzo IP virtuale (VIP) del servizio in indirizzi IP dei pod di backend prima di valutare le regole delle policy 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 le policy di rete FQDN.
  • Le policy di rete FQDN che utilizzano la corrispondenza di pattern corrispondono solo ai sottodomini allo stesso livello del carattere jolly. Ad esempio, pattern: *.company.com corrisponde a api.company.com o store.company.com, ma non a eu.api.company.com o company.com.

Abilita la policy di rete FQDN

Puoi abilitare la policy di rete FQDN su un cluster nuovo o esistente.

Abilita la policy 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 la policy 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 tuo cluster.

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

    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 o pattern o entrambi.
    • pattern: "*.yourdomain.com": sono consentiti gli indirizzi IP forniti dai server dei nomi corrispondenti 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 additivi. Puoi utilizzare più campi pattern. Devi specificare name o pattern o entrambi.
    • protocol: "TCP" e port: 443: specifica un protocollo e una porta. Se un pod tenta di stabilire una connessione a indirizzi IP utilizzando questa combinazione di protocollo e porta, la risoluzione dei nomi funziona, ma il piano dati blocca la connessione in uscita. Questo campo è facoltativo.
  2. Verifica che la policy di rete selezioni i tuoi workload:

    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 un 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 delle policy, ma le connessioni esistenti rimangono attive finché non vengono chiuse seguendo le linee guida del protocollo standard conntrack.

Come funzionano le policy di rete FQDN

FQDNNetworkPolicies sono policy solo in uscita che controllano a quali endpoint i pod selezionati possono inviare traffico. Analogamente a Kubernetes NetworkPolicy, un FQDNNetworkPolicy che seleziona un workload crea una regola di rifiuto implicito per gli endpoint non specificati come destinazioni in uscita consentite. FQDNNetworkPolicies può essere utilizzato con Kubernetes NetworkPolicies come descritto in FQDNNetworkPolicy e NetworkPolicy.

FQDNNetworkPolicies vengono applicate a livello di indirizzo IP e porta. Non vengono applicate utilizzando informazioni sul protocollo di livello 7 (ad esempio Request-URI in una richiesta 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 workload non influisce sulla capacità dei workload di effettuare richieste DNS. I comandi come nslookup o dig funzionano su qualsiasi dominio senza essere interessati dalla policy. Tuttavia, le richieste successive all'indirizzo IP che supporta i domini non inclusi nella lista consentita verranno ignorate.

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

Scadenza TTL

FQDNNetworkPolicy rispetta il TTL fornito da un record DNS. Se un pod tenta di contattare un indirizzo IP scaduto dopo che è trascorso il TTL del record DNS, le nuove connessioni vengono rifiutate. Le connessioni di lunga durata che superano il TTL del record DNS non dovrebbero subire interruzioni del traffico finché conntrack considera la connessione ancora attiva.

FQDNNetworkPolicy e NetworkPolicy

Quando sia un FQDNNetworkPolicy sia un NetworkPolicy si applicano allo stesso pod, ovvero le etichette del pod corrispondono a quelle configurate nelle policy, il traffico in uscita è consentito purché corrisponda a una delle policy. Non esiste una gerarchia tra NetworkPolicies in uscita che specifica indirizzi IP o selettori di etichette e FQDNNetworkPolicies.

Endpoint con indirizzi IP condivisi (bilanciatori del carico, CDN, gateway VPN ecc.)

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

Quando configuri FQDNNetworkPolicies, è importante considerare se i domini consentiti utilizzano indirizzi IP dedicati o condivisi. Poiché FQDNNetworkPolicies vengono applicate a livello di indirizzo IP e porta, non possono distinguere tra più domini gestiti dallo stesso indirizzo IP. Consentire l'accesso 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 verso compute.googleapis.com consentirà anche al pod di comunicare con altre API Google Cloud .

Ricerca del 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 pod esegue query su example.com, devi scrivere example.com nella regola. Anche se ricevi una catena di alias dai tuoi server DNS upstream (ad es. example.com in example.cdn.com in 1.2.3.4), la policy di rete FQDN consentirà comunque il passaggio del traffico.

Passaggi successivi