Pular para o conteúdo principal

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-service
  • app2.example.com → app2-service
  • api.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-service
  • example.com/web → web-service
  • example.com/admin → admin-service
  • example.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