Questa pagina mostra come utilizzare le policy di rete del cluster per controllare se un pod può ricevere traffico di rete in entrata (o in ingresso) e se può inviare traffico in uscita.
Le policy di rete consentono di limitare le connessioni tra gli oggetti Pod, in modo da ridurre l'esposizione agli attacchi.
Le policy di rete fungono da firewall sul livello 3 o 4 del modello OSI. Non offrono funzionalità aggiuntive come l'autorizzazione o la crittografia.
Limitare il traffico in entrata agli oggetti Pod
Un oggetto NetworkPolicy
consente di configurare le policy di accesso alla rete per un pod. Gli oggetti NetworkPolicy contengono le seguenti informazioni:
Oggetti Pod a cui si applica la policy. Definisci gli oggetti Pod e i carichi di lavoro con etichette e selettori.
Tipo di traffico interessato dalla policy di rete: Ingress per il traffico in entrata, Egress per il traffico in uscita o entrambi.
Per le policy in entrata, gli oggetti Pod che possono connettersi agli oggetti Pod specificati.
Per le policy in uscita, gli oggetti Pod a cui possono connettersi gli oggetti Pod specificati.
Esempio di limitazione del traffico in entrata
Questa sezione mostra la creazione di una limitazione del traffico in entrata su un'applicazione di esempio. Modifica questo esempio in base al tuo ambiente applicativo.
Esegui un'applicazione server web con l'etichetta
app=helloed 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 --exposeConfigura un
NetworkPolicyper consentire il traffico al podhello-websolo dagli oggetti Podapp=foo. GKE su AWS blocca il traffico in entrata dagli oggetti Pod che non hanno questa etichetta, nonché il traffico esterno e il traffico dagli oggetti Pod in uno spazio dei nomi diverso.Il seguente manifest seleziona gli oggetti Pod con l'etichetta
app=helloe specifica una policy in entrata per consentire il traffico solo dagli oggetti Pod con l'etichettaapp=foo:Applica questa policy al cluster:
kubectl apply -f hello-allow-from-foo.yaml
Verifica la policy in entrata
Esegui un pod temporaneo con l'etichetta
app=foo. Per verificare che il traffico in entrata sia consentito, invia una richiesta all'endpointhello-web:8080:kubectl run -l app=foo --image=alpine --restart=Never --rm -i -t foo-app \ -- wget -qO- --timeout=2 http://hello-web:8080Se il traffico dall'oggetto Pod
app=fooagli oggetti Podapp=helloè abilitato, l'output è simile al seguente:Hello, world! Version: 1.0.0 Hostname: hello-web-2258067535-vbx6zEsegui un pod temporaneo con un'etichetta diversa (
app=other) ed esegui la stessa richiesta per verificare che il traffico non sia consentito:kubectl run -l app=other --image=alpine --restart=Never --rm -i -t other-app \ -- wget -qO- --timeout=2 http://hello-web:8080L'output conferma che la connessione non riceve una risposta:
wget: download timed out
Limita il traffico in uscita dagli oggetti Pod
Puoi limitare il traffico in uscita in modo analogo al traffico in entrata.
Tuttavia, per eseguire query sui nomi host interni come hello-web o sui nomi host esterni come www.example.com, devi creare una policy in uscita che consenta il traffico DNS sulla porta 53 utilizzando i protocolli TCP e UDP.
Per abilitare le policy di rete in uscita, esegui il deployment di un NetworkPolicy che controlla il traffico in uscita dagli oggetti Pod con l'etichetta app=foo, consentendo il traffico solo agli oggetti Pod con l'etichetta app=hello, nonché il traffico DNS.
Il seguente manifest specifica un NetworkPolicy che controlla il traffico in uscita dagli oggetti Pod con l'etichetta app=foo con due destinazioni consentite:
- Oggetti Pod nello stesso spazio dei nomi con l'etichetta
app=hello - Endpoint interni o esterni sulla porta 53 (UDP e TCP)
Applica questa policy al cluster:
kubectl apply -f foo-allow-to-hello.yaml
Convalida la policy in uscita
Esegui il deployment di una nuova applicazione web chiamata
hello-web-2ed 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 --exposeEsegui un pod temporaneo con l'etichetta
app=fooe verifica che il pod possa stabilire connessioni ahello-web:8080:kubectl run -l app=foo --image=alpine --rm -i -t --restart=Never foo-app \ -- wget -qO- --timeout=2 http://hello-web:8080Il pod risponde alla richiesta:
Hello, world! Version: 1.0.0 Hostname: hello-web-2258067535-vbx6zVerifica che il pod non possa stabilire connessioni a
hello-web-2:8080:kubectl run -l app=foo --image=alpine --rm -i -t --restart=Never foo-app \ -- wget -qO- --timeout=2 http://hello-web-2:8080L'output conferma che la connessione non riceve una risposta:
wget: download timed outVerifica che il pod non possa stabilire connessioni a siti web esterni come
www.example.com.kubectl run -l app=foo --image=alpine --rm -i -t --restart=Never foo-app \ -- wget -qO- --timeout=2 http://www.example.comL'output conferma che la connessione non riceve una risposta:
wget: download timed out
Libera spazio
Per rimuovere le risorse che hai creato in questo tutorial, esegui questi comandi:
kubectl delete pods --labels app=hello-2
kubectl delete pods --labels app=hello
kubectl delete -f foo-allow-to-hello.yaml
kubectl delete -f hello-allow-from-foo.yaml
Passaggi successivi
- Documentazione relativa alle policy di rete di Kubernetes
- Utilizza il logging delle policy di rete per registrare quando le connessioni agli oggetti Pod sono consentite o negate dalle policy di rete del cluster.