Questo tutorial mostra come utilizzare i criteri di rete del cluster per controllare quali pod ricevono traffico di rete in entrata e quali pod possono inviare traffico in uscita. Per saperne di più, consulta Creazione di una policy di rete del cluster.
I criteri di rete ti 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 a:- Creare cluster con 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 in base all'utilizzo previsto,
utilizza il calcolatore prezzi.
Al termine delle attività descritte in questo documento, puoi evitare l'addebito di ulteriori costi eliminando le risorse che hai creato. Per saperne di più, consulta Esegui la pulizia.
Prima di iniziare
Per abilitare l'API Kubernetes Engine, segui questi passaggi:- Visita la pagina di Kubernetes Engine nella Google Cloud console.
- Crea o seleziona un progetto.
- Attendi che l'API e i relativi servizi siano abilitati. L'operazione può richiedere diversi minuti.
-
Verifica che la fatturazione sia attivata per il tuo Google Cloud progetto.
Installa i seguenti strumenti a riga di comando utilizzati in questo tutorial:
-
gcloudviene utilizzato per creare ed eliminare i cluster Kubernetes Engine.gcloudè incluso nellagcloudCLI. -
kubectlviene utilizzato per gestire Kubernetes, il sistema di orchestrazione dei cluster utilizzato da Kubernetes Engine. Puoi installarekubectlutilizzandogcloud:gcloud components install kubectl
Clona il codice campione da GitHub:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples cd kubernetes-engine-samples/networking/network-policies
Imposta i valori predefiniti per lo strumento a riga di comando gcloud
Per risparmiare tempo durante la digitazione dell'ID progetto
e delle opzioni della zona di 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 comando seguente:
gcloud container clusters create test --enable-network-policy
Limitazione del traffico in entrata ai pod
Le risorse NetworkPolicy di Kubernetes consentono di configurare i criteri di accesso alla rete per i pod. Gli oggetti NetworkPolicy contengono le seguenti informazioni:
Pod a cui si applicano i criteri di rete, in genere indicati da un selettore di etichette
Tipo di traffico interessato dalla policy 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
Quindi, configura un NetworkPolicy per consentire il traffico ai pod hello-web solo dai pod app=foo. Il resto del traffico in entrata dai pod che non hanno questa etichetta, il traffico esterno e il traffico 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 il comando seguente:
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:8080Hello, 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 apri una shell all'interno del pod:
kubectl run -l app=other --image=alpine --restart=Never --rm -i -t test-1
Invia la stessa richiesta per osservare che il traffico non è consentito e quindi la richiesta va in timeout, quindi esci dalla shell del pod:
/ # wget -qO- --timeout=2 http://hello-web:8080wget: download timed out / # exit
Limitazione del traffico in uscita dai pod
Puoi limitare il traffico in uscita in modo analogo al traffico in entrata.
Tuttavia, per poter eseguire query sui nomi host interni come hello-web o sui 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 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 il traffico solo ai pod con l'etichetta app=hello, nonché il traffico DNS.
Il seguente manifest specifica una policy di rete che controlla il traffico in uscita dai pod con l'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 il comando seguente:
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:8080Hello, world!
Version: 1.0.0
Hostname: hello-web-2258067535-vbx6zVerifica che il pod non sia in grado di stabilire connessioni a hello-web-2:8080:
/ # wget -qO- --timeout=2 http://hello-web-2:8080wget: download timed outVerifica che il pod non sia in grado di stabilire connessioni a siti web esterni come www.example.com ed esci dalla shell del pod.
/ # wget -qO- --timeout=2 http://www.example.comwget: download timed out
/ # exitLibera spazio
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 elimina le risorse che compongono il cluster di container, come le istanze di Compute, i dischi e le risorse di rete.
gcloud container clusters delete test