Capítulo 9.3 - Network Policies
Objetivos de Aprendizagem
Ao final deste capítulo, você será capaz de:
- Entender o que são Network Policies
- Criar Network Policies para isolar o tráfego
- Configurar regras de ingress e egress
- Utilizar selectors para direcionar Pods
- Implementar segmentação de rede
- Compreender as limitações
Introdução
As Network Policies permitem controlar o tráfego de rede entre os Pods em um cluster Kubernetes. Elas fornecem segmentação de rede em nível de aplicação.
O que é uma Network Policy?
Uma Network Policy define regras que controlam o tráfego de rede entre os Pods. Ela permite:
- Autorizar ou bloquear o tráfego ingress (entrante)
- Autorizar ou bloquear o tráfego egress (saída)
- Filtrar por namespace, labels ou IPs
Importante: Network Policies requerem um CNI que as suporte (Calico, Cilium, etc.).
Comportamento Padrão
Sem Network Policy
Por padrão: Todos os Pods podem se comunicar com todos os outros Pods.
Com Network Policy
Isolamento: Somente o tráfego autorizado é permitido.
Exemplo Básico
Network Policy: Isolar um Namespace
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all
namespace: production
spec:
podSelector: {} # Todos os Pods
policyTypes:
- Ingress
- Egress
Resultado: Nenhum tráfego ingress ou egress é permitido no namespace production.
Network Policy: Autorizar Tráfego Interno
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-internal
namespace: production
spec:
podSelector: {}
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
name: production
Resultado: Somente o tráfego vindo do namespace production é permitido.
Selectors
Pod Selector
Direcionar Pods específicos:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: app-network-policy
spec:
podSelector:
matchLabels:
app: web
tier: frontend
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: api
Resultado: Os Pods com app=web e tier=frontend podem receber tráfego apenas de Pods com app=api.
Namespace Selector
Direcionar namespaces:
spec:
ingress:
- from:
- namespaceSelector:
matchLabels:
name: frontend
IP Block
Direcionar faixas de IPs:
spec:
ingress:
- from:
- ipBlock:
cidr: 192.168.1.0/24
except:
- 192.168.1.100/32
Exemplo Completo: Aplicação Multi-Camadas
Arquitetura
Network Policy: Frontend
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: frontend-policy
namespace: frontend
spec:
podSelector:
matchLabels:
app: web
policyTypes:
- Ingress
- Egress
ingress:
- from: [] # Permitir de qualquer lugar (Internet via Ingress)
egress:
- to:
- namespaceSelector:
matchLabels:
name: backend
ports:
- protocol: TCP
port: 80
Network Policy: Backend
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: backend-policy
namespace: backend
spec:
podSelector:
matchLabels:
app: api
policyTypes:
- Ingress
- Egress
ingress:
- from:
- namespaceSelector:
matchLabels:
name: frontend
ports:
- protocol: TCP
port: 8080
egress:
- to:
- namespaceSelector:
matchLabels:
name: database
ports:
- protocol: TCP
port: 5432
Network Policy: Database
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: database-policy
namespace: database
spec:
podSelector:
matchLabels:
app: postgres
policyTypes:
- Ingress
- Egress
ingress:
- from:
- namespaceSelector:
matchLabels:
name: backend
ports:
- protocol: TCP
port: 5432
egress: [] # Nenhum tráfego de saída permitido
Portas e Protocolos
Especificar as Portas
spec:
ingress:
- ports:
- protocol: TCP
port: 80
- protocol: TCP
port: 443
- protocol: UDP
port: 53
Faixa de Portas (conforme CNI)
Alguns CNIs suportam faixas de portas:
spec:
ingress:
- ports:
- protocol: TCP
port: 8000-8999
Comandos Úteis
Gerenciamento
# Criar uma Network Policy
kubectl apply -f network-policy.yaml
# Ver as Network Policies
kubectl get networkpolicies
kubectl get netpol
# Detalhes
kubectl describe networkpolicy frontend-policy
# Ver por namespace
kubectl get netpol -n production
Teste
# Testar conectividade a partir de um Pod
kubectl exec -it test-pod -- curl http://api-service:8080
# Ver as regras aplicadas (conforme CNI)
# Calico
calicoctl get networkpolicies
Limitações
1. Suporte do CNI
Nem todos os CNIs suportam Network Policies:
- Suportam: Calico, Cilium, Weave Net, Antrea
- Não suportam: Flannel (básico)
2. Performance
Network Policies podem impactar a performance dependendo do CNI.
3. Complexidade
A gestão de muitas Network Policies pode se tornar complexa.
Boas Práticas
1. Início Progressivo
Comece isolando os namespaces críticos e depois expanda.
2. Documentação
Documente as regras de comunicação entre os serviços.
3. Testes
Teste as Network Policies antes de aplicá-las em produção.
4. Monitoramento
Monitore as conexões bloqueadas para detectar problemas.
5. Default Deny
Utilize uma política "deny all" por padrão e depois permita explicitamente.
Resumo
Neste capítulo, você aprendeu:
Network Policy: Controle do tráfego de rede entre Pods
Comportamento padrão: Todos os Pods podem se comunicar
Selectors: Pod, namespace, IP block
Ingress/Egress: Regras para tráfego de entrada e saída
Portas: Especificar portas e protocolos permitidos
Casos de uso: Segmentação de rede, isolamento multi-camadas
Limitações: Requer um CNI compatível
Boas práticas: Início progressivo, default deny, testes
Próximos Passos
Capítulo 9.4: Pod Security Standards
Lab 9.3: Network Policies Avançadas
Capítulo criado em: Dezembro 2024