Configura i criteri di rete per le applicazioni


Questo tutorial mostra come utilizzare i criteri di rete del cluster per controllare quali pod ricevono il traffico di rete in entrata e quali possono inviare il traffico in uscita. Per ulteriori informazioni, consulta la sezione Creare un criterio di rete del cluster.

I criteri di rete ti consentono di limitare le connessioni tra i pod. Pertanto, l'utilizzo di criteri di rete offre una maggiore sicurezza riducendo il raggio di compromissione.

Tieni presente che i criteri di rete determinano se una connessione è consentita e non offrono funzionalità di livello superiore come l'autorizzazione o il trasporto sicuro (come SSL/TLS).

Obiettivi

In questo tutorial imparerai a:

  • Come creare cluster con l'applicazione dei criteri di rete
  • Come limitare il traffico in entrata ai pod utilizzando le etichette
  • Come limitare il traffico in uscita dai pod utilizzando le etichette

Costi

In questo documento utilizzi i seguenti componenti fatturabili di Google Cloud:

Per generare una stima dei costi in base all'utilizzo previsto, utilizza il Calcolatore prezzi. I nuovi utenti di Google Cloud potrebbero essere idonei per una prova gratuita.

Al termine delle attività descritte in questo documento, puoi evitare la fatturazione continua eliminando le risorse che hai creato. Per ulteriori informazioni, consulta la sezione Pulizia.

Prima di iniziare

Per abilitare l'API Kubernetes Engine, segui questi passaggi:
  1. Visita la pagina di Kubernetes Engine nella console Google Cloud.
  2. Crea o seleziona un progetto.
  3. Attendi che l'API e i relativi servizi siano abilitati. L'operazione può richiedere diversi minuti.
  4. Make sure that billing is enabled for your Google Cloud project.

Installa i seguenti strumenti a riga di comando utilizzati in questo tutorial:

  • gcloud viene utilizzato per creare ed eliminare i cluster Kubernetes Engine. gcloud è incluso nell'interfaccia a riga di comando gcloud.
  • kubectl viene utilizzato per gestire Kubernetes, il sistema di orchestrazione dei cluster utilizzato da Kubernetes Engine. Puoi installare kubectl utilizzando gcloud:
    gcloud components install kubectl

Clona il codice di esempio da GitHub:

git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
cd kubernetes-engine-samples/networking/network-policies

Impostare i valori predefiniti per lo strumento a riga di comando gcloud

Per risparmiare tempo digitando le opzioni ID progetto e Zona Compute Engine nello strumento a riga di comando gcloud, puoi impostare i valori predefiniti:
gcloud config set project project-id
gcloud config set compute/zone compute-zone

Creazione di un cluster GKE con applicazione dei criteri di rete

Per creare un cluster di container con applicazione dei criteri di rete, esegui il seguente comando:

gcloud container clusters create test --enable-network-policy

Limitazione del traffico in entrata ai pod

Le risorse NetworkPolicy Kubernetes ti consentono di configurare i criteri di accesso alla rete per i pod. Gli oggetti NetworkPolicy contengono le seguenti informazioni:

  • Pod a cui vengono applicati i criteri di rete, di solito designati da un selettore di etichette

  • Tipo di traffico interessato dal criterio di rete: Ingress per il traffico in entrata, Egress per il traffico in uscita o entrambi

  • Per i criteri in entrata, i pod che possono connettersi ai pod specificati

  • Per i criteri in uscita, i pod a cui possono connettersi i pod specificati

Innanzitutto, esegui un'applicazione server web con l'etichetta app=hello ed esponila internamente nel cluster:

kubectl run hello-web --labels app=hello \
  --image=us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 --port 8080 --expose

Successivamente, configura un NetworkPolicy per consentire il traffico verso i pod hello-web solo dai pod app=foo. L'altro traffico in entrata dai pod che non hanno questa etichetta, il traffico esterno e il traffico dai pod in altri spazi dei nomi sono bloccati.

Il seguente manifest seleziona i pod con l'etichetta app=hello e specifica un criterio in entrata per consentire il traffico solo dai pod con l'etichetta app=foo:

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: hello-allow-from-foo
spec:
  policyTypes:
  - Ingress
  podSelector:
    matchLabels:
      app: hello
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: foo

Per applicare questo criterio al cluster, esegui il seguente comando:

kubectl apply -f hello-allow-from-foo.yaml

Convalida il criterio in entrata

Innanzitutto, esegui un pod temporaneo con l'etichetta app=foo e apri una shell nel pod:

kubectl run -l app=foo --image=alpine --restart=Never --rm -i -t test-1

Invia una richiesta all'endpoint hello-web:8080 per verificare che il traffico in entrata sia consentito:

/ # wget -qO- --timeout=2 http://hello-web:8080
Hello, world!
Version: 1.0.0
Hostname: hello-web-2258067535-vbx6z
/ # exit

Il traffico dal pod app=foo ai pod app=hello è abilitato.

Poi, esegui un pod temporaneo con un'etichetta diversa (app=other) e apri una shell all'interno del pod:

kubectl run -l app=other --image=alpine --restart=Never --rm -i -t test-1

Fai la stessa richiesta per osservare che il traffico non è consentito e quindi la richiesta scade, quindi esci dalla shell del pod:

/ # wget -qO- --timeout=2 http://hello-web:8080
wget: download timed out
/ # exit

Limitare il traffico in uscita dai pod

Puoi limitare il traffico in uscita come faresti con quello in entrata.

Tuttavia, per poter eseguire query sui nomi host interni come hello-web o su nomi host esterni come www.example.com, devi consentire la risoluzione DNS (Domain Name System) nei criteri di rete in uscita. Il traffico DNS utilizza la porta 53 e i protocolli TCP e UDP.

Per attivare i criteri di rete in uscita, esegui il deployment di un NetworkPolicy che controlli il traffico in uscita dai pod con l'etichetta app=foo, consentendo al contempo il traffico solo ai pod con l'etichetta app=hello, nonché il traffico DNS.

Il seguente manifest specifica un criterio di rete che controlla il traffico in uscita dai pod con etichetta app=foo con due destinazioni consentite:

  1. Pod nello stesso spazio dei nomi con l'etichetta app=hello.
  2. Pod di cluster o endpoint esterni sulla porta 53 (UDP e TCP).
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: foo-allow-to-hello
spec:
  policyTypes:
  - Egress
  podSelector:
    matchLabels:
      app: foo
  egress:
  - to:
    - podSelector:
        matchLabels:
          app: hello
  - ports:
    - port: 53
      protocol: TCP
    - port: 53
      protocol: UDP

Per applicare questo criterio al cluster, esegui il seguente comando:

kubectl apply -f foo-allow-to-hello.yaml

Convalida il criterio in uscita

Innanzitutto, esegui il deployment di una nuova applicazione web chiamata hello-web-2 ed esponila internamente nel cluster:

kubectl run hello-web-2 --labels app=hello-2 \
  --image=us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 --port 8080 --expose

Quindi, esegui un pod temporaneo con l'etichetta app=foo e apri una shell all'interno del container:

kubectl run -l app=foo --image=alpine --rm -i -t --restart=Never test-3

Verifica che il pod sia in grado di stabilire connessioni a hello-web:8080:

/ # wget -qO- --timeout=2 http://hello-web:8080
Hello, world!
Version: 1.0.0
Hostname: hello-web-2258067535-vbx6z

Verifica che il pod non possa stabilire connessioni a hello-web-2:8080:

/ # wget -qO- --timeout=2 http://hello-web-2:8080
wget: download timed out

Verifica che il pod non possa stabilire connessioni a siti web esterni come www.example.com ed esci dalla shell del pod.

/ # wget -qO- --timeout=2 http://www.example.com
wget: download timed out
/ # exit

Esegui la pulizia

Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, elimina il progetto che contiene le risorse oppure mantieni il progetto ed elimina le singole risorse.

  1. Elimina il cluster di container:questo passaggio elimina le risorse che compongono il cluster di container, ad esempio le istanze di calcolo, i dischi e le risorse di rete.

    gcloud container clusters delete test

Passaggi successivi