Questo tutorial mostra come utilizzare i criteri di rete del cluster per controllare quali pod ricevono traffico di rete in entrata e quali possono inviare traffico in uscita. Per saperne di più, consulta la sezione Creazione di un criterio di rete del cluster.
I criteri di rete consentono di limitare le connessioni tra i pod. Pertanto, l'utilizzo di policy 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).
Creazione di un cluster GKE con l'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
Limitazione del traffico in entrata ai pod
Le risorse Kubernetes NetworkPolicy
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 dal criterio di rete: in entrata per il traffico in entrata, in uscita per il traffico in uscita o entrambi
Per i criteri in entrata, quali pod 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 ai pod hello-web
solo dai pod app=foo
. Vengono bloccati altri traffici in entrata dai pod che non hanno questa etichetta, il traffico esterno e il traffico dai pod in altri spazi dei nomi.
Il seguente manifest seleziona i pod con l'etichetta app=hello
e specifica una
policy in entrata per consentire il traffico solo dai pod con l'etichetta app=foo
:
Per applicare questa policy al cluster, esegui questo comando:
kubectl apply -f hello-allow-from-foo.yaml
Convalida il criterio in entrata
Per prima cosa, 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.
Successivamente, 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
Esegui la stessa richiesta per osservare che il traffico non è consentito e quindi la richiesta scade, poi 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 come faresti con il traffico in entrata.
Tuttavia, per poter eseguire query sui nomi host interni come hello-web
o esterni
come www.example.com
, devi consentire la risoluzione DNS (Domain Name System)
nelle policy 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, implementa 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 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 questa policy al cluster, esegui questo comando:
kubectl apply -f foo-allow-to-hello.yaml
Convalida la policy in uscita
Per prima cosa, 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
Successivamente, 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 sia in grado di 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 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.com
wget: download timed out
/ # exit