Questo tutorial mostra come utilizzare i criteri di rete dei cluster per controllare quali pod ricevono il traffico di rete in entrata e quali pod possono inviare il traffico in uscita. Per maggiori informazioni, consulta la pagina relativa alla creazione di un criterio di rete del cluster.
I criteri di rete consentono di limitare le connessioni tra i pod. Pertanto, l'utilizzo dei 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:- Come creare cluster con l'applicazione dei criteri di rete
- Limitare il traffico in entrata ai pod utilizzando le etichette
- Limitare il traffico in uscita dai pod utilizzando le etichette
Costi
In questo documento vengono utilizzati i seguenti componenti fatturabili di Google Cloud:
Per generare una stima dei costi basata sull'utilizzo previsto,
utilizza il Calcolatore prezzi.
Una volta completate le attività descritte in questo documento, puoi evitare la fatturazione continua eliminando le risorse che hai creato. Per ulteriori informazioni, consulta la pagina Pulizia.
Prima di iniziare
Segui questi passaggi per abilitare l'API Kubernetes Engine:- Visita la pagina Kubernetes Engine nella console Google Cloud.
- Crea o seleziona un progetto.
- Attendi che l'API e i servizi correlati siano abilitati. Questa operazione può richiedere diversi minuti.
-
Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.
Installa i seguenti strumenti a riga di comando utilizzati in questo tutorial:
-
gcloud
viene utilizzato per creare ed eliminare cluster Kubernetes Engine.gcloud
è incluso nell'interfaccia a riga di comandogcloud
. -
kubectl
viene utilizzato per gestire Kubernetes, il sistema di orchestrazione dei cluster utilizzato da Kubernetes Engine. Puoi installarekubectl
utilizzandogcloud
: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
Configura i valori predefiniti per lo strumento a riga di comando gcloud
Per risparmiare tempo nella digitazione delle opzioni dell'ID progetto
e della zona di Compute Engine nello strumento a riga di comando gcloud
, puoi configurare 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 l'applicazione dei criteri di rete, esegui questo comando:
gcloud container clusters create test --enable-network-policy
Limitare il traffico in entrata ai pod
Le risorse NetworkPolicy
di Kubernetes consentono di configurare i criteri di accesso
alla rete per i pod. NetworkPolicy
oggetti contengono le seguenti informazioni:
Pod a cui si applicano i criteri di rete, di solito indicati da un selettore di etichette
Tipo di traffico interessato dal criterio di rete: in entrata per il traffico in entrata, In uscita per il traffico in uscita o entrambi
Per i criteri Ingress, quali pod possono connettersi ai pod specificati
Per i criteri in uscita, i pod a cui possono connettersi i pod specificati
Per prima cosa, 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
Poi, configura un NetworkPolicy
per consentire il traffico ai pod hello-web
solo dai pod app=foo
. L'altro traffico in entrata dai pod senza questa etichetta, il traffico esterno e quello dai pod in altri spazi dei nomi vengono 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
:
Per applicare questo criterio al cluster, esegui questo 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 crea 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.
Quindi, esegui un pod temporaneo con un'etichetta diversa (app=other
) e crea una shell all'interno del pod:
kubectl run -l app=other --image=alpine --restart=Never --rm -i -t test-1
Effettua la stessa richiesta per osservare che il traffico non è consentito e, di conseguenza, si verifica il timeout della richiesta, quindi esci dalla shell del pod:
/ # wget -qO- --timeout=2 http://hello-web:8080
wget: download timed out / # exit
Limitazione del traffico in uscita dai pod
Puoi limitare il traffico in uscita proprio come faresti con il traffico in entrata.
Tuttavia, per poter eseguire query su nomi host interni come hello-web
o nomi host esterni come www.example.com
, devi consentire la risoluzione DNS (Domain Name System) nei criteri della rete in uscita. Il traffico DNS avviene sulla porta 53
con i protocolli TCP e UDP.
Per abilitare i criteri di rete in uscita, esegui il deployment di un NetworkPolicy
che controlla il traffico in uscita dai pod con l'etichetta app=foo
, consentendo al contempo il traffico solo verso i 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:
- Pod nello stesso spazio dei nomi con l'etichetta
app=hello
. - Pod del cluster o endpoint esterni sulla porta 53 (UDP e TCP).
Per applicare questo criterio al cluster, esegui questo comando:
kubectl apply -f foo-allow-to-hello.yaml
Convalida il criterio in uscita
Esegui prima il deployment di una nuova applicazione web denominata 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
, e uscire 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.
Elimina il cluster di container: questo passaggio eliminerà le risorse che costituiscono il cluster di container, ad esempio istanze di calcolo, dischi e risorse di rete.
gcloud container clusters delete test