Esta página demonstra como usar políticas de rede de clusters para controlar se um pod pode receber tráfego de rede de entrada (ou Ingress) e se pode enviar tráfego de saída (ou Egress).
As políticas de rede permitem limitar as ligações entre objetos Pod, para que possa reduzir a exposição a ataques.
As políticas de rede funcionam como uma firewall na camada 3 ou na camada 4 do modelo OSI. Não oferecem funcionalidades adicionais, como autorização ou encriptação.
Restringir o tráfego de entrada a objetos Pod
Um objeto NetworkPolicy
permite-lhe configurar políticas de acesso à rede para um Pod. Os objetos NetworkPolicy contêm as seguintes informações:
Objetos Pod aos quais a política se aplica. Define objetos Pod e cargas de trabalho com etiquetas e seletores.
Tipo de tráfego afetado pela política de rede: entrada para tráfego de entrada, saída para tráfego de saída ou ambos.
Para políticas de entrada, que objetos Pod podem ligar-se aos objetos Pod especificados.
Para políticas de saída, os objetos Pod aos quais os objetos Pod especificados se podem ligar.
Exemplo de restrição de tráfego de entrada
Esta secção demonstra a criação de uma restrição de tráfego de entrada numa aplicação de exemplo. Modifique este exemplo para se adequar ao seu próprio ambiente de aplicação.
Execute uma aplicação de servidor Web com a etiqueta
app=helloe exponha-a 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 --exposeConfigure um
NetworkPolicypara permitir o tráfego para o podhello-webapenas a partir dos objetos do podapp=foo. O GKE no AWS bloqueia o tráfego recebido de objetos Pod que não tenham esta etiqueta, bem como o tráfego externo e o tráfego de objetos Pod num espaço de nomes diferente.O seguinte manifesto seleciona objetos Pod com a etiqueta
app=helloe especifica uma política de entrada para permitir tráfego apenas de objetos Pod com a etiquetaapp=foo:Aplicar esta política ao cluster:
kubectl apply -f hello-allow-from-foo.yaml
Valide a política de entrada
Execute um Pod temporário com a etiqueta
app=foo. Para verificar se o tráfego de entrada é permitido, faça um pedido ao ponto finalhello-web:8080:kubectl run -l app=foo --image=alpine --restart=Never --rm -i -t foo-app \ -- wget -qO- --timeout=2 http://hello-web:8080Se o tráfego do pod
app=foopara os objetos do podapp=helloestiver ativado, o resultado é semelhante ao seguinte:Hello, world! Version: 1.0.0 Hostname: hello-web-2258067535-vbx6zExecute um pod temporário com uma etiqueta diferente (
app=other) e faça o mesmo pedido 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:8080O resultado confirma que a ligação não recebe uma resposta:
wget: download timed out
Restrinja o tráfego de saída de objetos Pod
Pode restringir o tráfego de saída tal como faria com o tráfego de entrada.
No entanto, para consultar nomes de anfitriões internos, como hello-web, ou nomes de anfitriões externos, como www.example.com, tem de criar uma política de saída que permita o tráfego DNS na porta 53 através dos protocolos TCP e UDP.
Para ativar as políticas de rede de saída, implemente um NetworkPolicy que controle o tráfego de saída
de objetos Pod com a etiqueta app=foo, ao mesmo tempo que permite o tráfego apenas para
objetos Pod com a etiqueta app=hello, bem como o tráfego DNS.
O manifesto seguinte especifica um NetworkPolicy controlo do tráfego de saída
de objetos Pod com a etiqueta app=foo com dois destinos permitidos:
- Objetos Pod no mesmo espaço de nomes com a etiqueta
app=hello - Pontos finais internos ou externos na porta 53 (UDP e TCP)
Aplicar esta política ao cluster:
kubectl apply -f foo-allow-to-hello.yaml
Valide a política de saída
Implemente uma nova app Web denominada
hello-web-2e exponha-a 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 --exposeExecute um pod temporário com a etiqueta
app=fooe valide se o pod consegue estabelecer ligações ahello-web:8080:kubectl run -l app=foo --image=alpine --rm -i -t --restart=Never foo-app \ -- wget -qO- --timeout=2 http://hello-web:8080O agrupamento responde ao pedido:
Hello, world! Version: 1.0.0 Hostname: hello-web-2258067535-vbx6zValide que o Pod não consegue estabelecer ligações 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:8080O resultado confirma que a ligação não recebe uma resposta:
wget: download timed outValide se o Pod não consegue estabelecer ligações a Websites 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.comO resultado confirma que a ligação não recebe uma resposta:
wget: download timed out
Limpar
Para remover os recursos que criou 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
O que se segue?
- Documentação das políticas de rede do Kubernetes
- Use o registo de políticas de rede para registar quando as ligações a objetos Pod são permitidas ou negadas pelas políticas de rede do seu cluster.