Capítulo 8.3 - Roteamento e TLS
Objetivos de Aprendizagem
Ao final deste capítulo, você será capaz de:
- Configurar roteamento por hostname
- Implementar roteamento baseado em caminho (path-based)
- Configurar TLS/SSL com certificados
- Utilizar cert-manager para gerenciamento automático de certificados
- Compreender os path types
- Gerenciar rewrites e redirects
Introdução
O roteamento Ingress permite direcionar o tráfego para diferentes serviços de acordo com o hostname ou caminho. A configuração de TLS permite proteger as comunicações com HTTPS.
Roteamento por Hostname
Roteamento baseado no nome de domínio:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: multi-host-ingress
spec:
ingressClassName: nginx
rules:
- host: app1.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: app1-service
port:
number: 80
- host: app2.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: app2-service
port:
number: 80
- host: api.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: api-service
port:
number: 80
Resultado:
app1.example.com→app1-serviceapp2.example.com→app2-serviceapi.example.com→api-service
Roteamento por Caminho (Path-Based)
Roteamento baseado no caminho da URL:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: path-based-ingress
spec:
ingressClassName: nginx
rules:
- host: example.com
http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: api-service
port:
number: 80
- path: /web
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
- path: /admin
pathType: Prefix
backend:
service:
name: admin-service
port:
number: 80
- path: /
pathType: Prefix
backend:
service:
name: default-service
port:
number: 80
Resultado:
example.com/api→api-serviceexample.com/web→web-serviceexample.com/admin→admin-serviceexample.com/→default-service
Path Types
Prefix
O caminho deve começar com o prefixo especificado:
- path: /api
pathType: Prefix
Corresponde a:
/api/api/v1/api/users/api/v1/users
Exact
O caminho deve corresponder exatamente:
- path: /api
pathType: Exact
Corresponde a:
- Apenas
/api
Não corresponde a:
/api/v1/api/users
ImplementationSpecific
Depende da implementação do Ingress Controller:
- path: /api
pathType: ImplementationSpecific
Configuração TLS
Criar um Secret TLS
# Gerar um certificado (exemplo com openssl)
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout tls.key -out tls.crt \
-subj "/CN=example.com/O=example.com"
# Criar o Secret
kubectl create secret tls example-tls \
--cert=tls.crt \
--key=tls.key
Utilizar no Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: tls-ingress
spec:
ingressClassName: nginx
tls:
- hosts:
- example.com
- www.example.com
secretName: example-tls
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
- host: www.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
Resultado: HTTPS ativado para example.com e www.example.com.
Cert-Manager para Certificados Automáticos
cert-manager gerencia automaticamente certificados TLS com Let's Encrypt.
Instalação
# Helm
helm repo add jetstack https://charts.jetstack.io
helm repo update
helm install cert-manager jetstack/cert-manager \
--namespace cert-manager \
--create-namespace \
--set installCRDs=true
ClusterIssuer (Let's Encrypt)
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: admin@example.com
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- http01:
ingress:
class: nginx
Utilização no Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: cert-ingress
annotations:
cert-manager.io/cluster-issuer: "letsencrypt-prod"
spec:
ingressClassName: nginx
tls:
- hosts:
- example.com
secretName: example-tls # Criado automaticamente pelo cert-manager
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
Resultado: Certificado TLS obtido e renovado automaticamente pelo cert-manager.
Rewrites e Redirects
Rewrite (NGINX)
Reescreve a URL antes de encaminhar para o backend:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: rewrite-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
ingressClassName: nginx
rules:
- host: example.com
http:
paths:
- path: /api(/|$)(.*)
pathType: ImplementationSpecific
backend:
service:
name: api-service
port:
number: 80
Resultado: example.com/api/users → api-service/users
Redirect
Redireciona para outra URL:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: redirect-ingress
annotations:
nginx.ingress.kubernetes.io/permanent-redirect: "https://www.example.com"
spec:
ingressClassName: nginx
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
Exemplo Completo: Aplicação Multi-Tier
Arquitetura
Configuração
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app-ingress
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "true"
cert-manager.io/cluster-issuer: "letsencrypt-prod"
spec:
ingressClassName: nginx
tls:
- hosts:
- example.com
secretName: example-tls
rules:
- host: example.com
http:
paths:
# Web frontend
- path: /
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
# API backend
- path: /api
pathType: Prefix
backend:
service:
name: api-service
port:
number: 8080
# Admin panel
- path: /admin
pathType: Prefix
backend:
service:
name: admin-service
port:
number: 8080
Comandos Úteis
Verificação
# Ver Ingress
kubectl get ingress
# Detalhes
kubectl describe ingress app-ingress
# Ver certificados
kubectl get certificates
kubectl describe certificate example-tls
# Ver secrets TLS
kubectl get secrets | grep tls
Teste
# Teste HTTP
curl -H "Host: example.com" http://<ingress-ip>/
# Teste HTTPS
curl -k https://example.com/
# Teste com path
curl -H "Host: example.com" http://<ingress-ip>/api/health
Boas Práticas
1. TLS em Todo Lugar
Utilize HTTPS para todas as comunicações externas.
2. Cert-Manager
Utilize cert-manager para o gerenciamento automático de certificados.
3. Path Types
Escolha o path type correto (Prefix para a maioria dos casos).
4. Annotations
Use annotations para funcionalidades avançadas (rewrites, redirects).
5. Monitoring
Monitore os certificados e sua expiração.
Resumo
Neste capítulo, você aprendeu:
Roteamento por hostname: Vários domínios com um único Ingress
Roteamento por caminho: Roteamento baseado em caminho para diferentes serviços
Path types: Prefix, Exact, ImplementationSpecific
TLS: Configuração com secrets do Kubernetes
cert-manager: Gerenciamento automático de certificados Let's Encrypt
Rewrites: Reescrita de URLs com annotations
Redirects: Redirecionamentos permanentes ou temporários
Boas práticas: TLS em todo lugar, cert-manager, monitoring
Próximos Passos
Módulo 9: Segurança e RBAC
Lab 8.2: Configuração de Ingress para uma Aplicação
Lab 8.3: Certificados TLS com Cert-Manager
Capítulo criado em: Dezembro 2024