Nesta página, demonstramos como usar políticas de rede de cluster para controlar se um pod pode receber tráfego de rede de entrada (ou entrada) e se ele pode enviar tráfego de saída (ou saída).
As políticas de rede permitem limitar as conexões entre objetos de pod para reduzir a exposição a ataques.
As políticas de rede funcionam como um firewall na camada 3 ou 4 do modelo do OSI. Elas não oferecem recursos adicionais como autorização ou criptografia.
Como restringir o tráfego recebido aos objetos de pod
Um objeto NetworkPolicy permite configurar políticas de acesso à rede para um pod. Os objetos NetworkPolicy contêm as seguintes informações:
- Objetos em que a política se aplica. Defina objetos e cargas de trabalho de pods com rótulos e seletores. 
- Tipo de tráfego da Internet afetado pela política de rede: Ingress para tráfego de entrada, Egress para tráfego de saída ou ambos 
- Para políticas de Entrada, quais objetos do pod podem se conectar aos objetos do pod especificados. 
- Para políticas de saída, os objetos do pod aos quais os objetos do pod especificados podem se conectar. 
Exemplo de restrição de tráfego de entrada
Nesta seção, demonstramos a criação de uma restrição de tráfego de entrada em um aplicativo de amostra. Modifique este exemplo para se adequar ao seu ambiente de aplicativos.
- Execute um aplicativo de servidor da Web com o rótulo - app=helloe exponha-o internamente no cluster:- kubectl run hello-web --labels app=hello \ --image=us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 \ --port 8080 --expose
- Configure um - NetworkPolicypara permitir o tráfego para o pod- hello-webapenas dos objetos de pod- app=foo. O GKE na AWS bloqueia o tráfego de entrada de objetos de pod que não têm esse rótulo, bem como o tráfego externo e o tráfego de objetos de pod em um namespace diferente.- O manifesto a seguir seleciona objetos de pod com o rótulo - app=helloe especifica uma política de entrada para permitir o tráfego apenas de objetos de pod com o rótulo- app=foo:
- Aplique esta política ao cluster: - kubectl apply -f hello-allow-from-foo.yaml
Verificar a política de entrada
- Execute um pod temporário com o rótulo - app=foo. Para verificar se o tráfego de entrada é permitido, faça uma solicitação para o endpoint- hello-web:8080:- kubectl run -l app=foo --image=alpine --restart=Never --rm -i -t foo-app \ -- wget -qO- --timeout=2 http://hello-web:8080- Se o tráfego do pod - app=foopara os objetos de pod- app=helloestiver ativado, a saída será semelhante a esta:- Hello, world! Version: 1.0.0 Hostname: hello-web-2258067535-vbx6z
- Execute um pod temporário com um rótulo diferente ( - app=other) e faça a mesma solicitação para observar que o tráfego não é permitido:- kubectl run -l app=other --image=alpine --restart=Never --rm -i -t other-app \ -- wget -qO- --timeout=2 http://hello-web:8080- A saída confirma que a conexão não recebe uma resposta: - wget: download timed out
Restrinja o tráfego de saída de objetos de pod
É possível restringir o tráfego de saída do mesmo modo como restringe o tráfego de entrada.
No entanto, para consultar nomes do host internos, como hello-web ou nomes de host externos, como www.example.com, crie uma política de saída que permita o tráfego DNS na porta 53 usando protocolos TCP e UDP.
Para ativar as políticas de rede de saída, implante um NetworkPolicy que controle o tráfego de saída dos objetos do pod com o rótulo app=foo e permita o tráfego apenas para objetos do pod com o rótulo app=hello, bem como o Tráfego DNS.
O manifesto a seguir especifica um NetworkPolicy que controla o tráfego de saída
de objetos de pod com o rótulo app=foo com dois destinos permitidos:
- Objetos de pod no mesmo namespace com o rótulo app=hello
- Endpoints internos ou externos na porta 53 (UDP e TCP)
Aplique esta política ao cluster:
kubectl apply -f foo-allow-to-hello.yaml
Valide a política de saída
- Primeiro, implante um novo aplicativo da Web chamado - hello-web-2e publique-o internamente no 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
- Em seguida, execute um pod temporário com o identificador - app=fooe verifique se ele pode estabelecer conexões com- hello-web:8080:- kubectl run -l app=foo --image=alpine --rm -i -t --restart=Never foo-app \ -- wget -qO- --timeout=2 http://hello-web:8080- O pod responde à solicitação: - Hello, world! Version: 1.0.0 Hostname: hello-web-2258067535-vbx6z
- Valide se o pod não estabelece conexões com - 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:8080- A saída confirma que a conexão não recebe uma resposta: - wget: download timed out
- Valide se o pod não consegue estabelecer conexões com sites externos, como - www.example.com.- kubectl run -l app=foo --image=alpine --rm -i -t --restart=Never foo-app \ -- wget -qO- --timeout=2 http://www.example.com- A saída confirma que a conexão não recebe uma resposta: - wget: download timed out
Limpar
Para remover os recursos criados neste tutorial, execute estes comandos:
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
A seguir
- Documentação de políticas de rede do Kubernetes
- Use a geração de registros de política de rede para gravar quando as conexões com pods são permitidas ou negadas pelas políticas de rede do cluster.