Capítulo 8.3 - Enrutamiento y TLS
Objetivos de Aprendizaje
Al final de este capítulo, usted será capaz de:
- Configurar el enrutamiento por hostname
- Implementar el enrutamiento basado en path
- Configurar TLS/SSL con certificados
- Utilizar cert-manager para la gestión automática de certificados
- Comprender los path types
- Gestionar los rewrites y redirects
Introducción
El enrutamiento Ingress permite dirigir el tráfico hacia diferentes servicios según el hostname o el path. La configuración TLS permite asegurar las comunicaciones con HTTPS.
Enrutamiento por Hostname
Enrutamiento basado en el nombre de dominio:
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
Enrutamiento por Path (Basado en Path)
Enrutamiento basado en el path de la 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
El path debe comenzar con el prefijo especificado:
- path: /api
pathType: Prefix
Coincide con:
/api/api/v1/api/users/api/v1/users
Exact
El path debe coincidir exactamente:
- path: /api
pathType: Exact
Coincide con:
- Solo
/api
No coincide con:
/api/v1/api/users
ImplementationSpecific
Depende de la implementación del Ingress Controller:
- path: /api
pathType: ImplementationSpecific
Configuración TLS
Crear un Secret TLS
# Generar un certificado (ejemplo con openssl)
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout tls.key -out tls.crt \
-subj "/CN=example.com/O=example.com"
# Crear el Secret
kubectl create secret tls example-tls \
--cert=tls.crt \
--key=tls.key
Usar en 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 habilitado para example.com y www.example.com.
Cert-Manager para Certificados Automáticos
cert-manager gestiona automáticamente los certificados TLS con Let's Encrypt.
Instalación
# 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
Uso en 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 # Creado automáticamente por cert-manager
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
Resultado: Certificado TLS obtenido y renovado automáticamente por cert-manager.
Rewrites y Redirects
Rewrite (NGINX)
Reescribir la URL antes de enviarla al 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
Redirigir hacia otra 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
Ejemplo Completo: Aplicación Multi-Tier
Arquitectura
Configuración
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 Útiles
Verificación
# Ver los Ingress
kubectl get ingress
# Detalles
kubectl describe ingress app-ingress
# Ver los certificados
kubectl get certificates
kubectl describe certificate example-tls
# Ver los secrets TLS
kubectl get secrets | grep tls
Test
# Test HTTP
curl -H "Host: example.com" http://<ingress-ip>/
# Test HTTPS
curl -k https://example.com/
# Test con path
curl -H "Host: example.com" http://<ingress-ip>/api/health
Buenas Prácticas
1. TLS en Todas Partes
Utilizar HTTPS para todas las comunicaciones externas.
2. Cert-Manager
Utilizar cert-manager para la gestión automática de certificados.
3. Path Types
Elegir el path type adecuado (Prefix para la mayoría de los casos).
4. Anotaciones
Utilizar anotaciones para funcionalidades avanzadas (rewrites, redirects).
5. Monitoreo
Supervisar los certificados y su expiración.
Resumen
En este capítulo, usted ha aprendido:
Enrutamiento por hostname: Varios dominios con un solo Ingress
Enrutamiento por path: Enrutamiento basado en path hacia diferentes servicios
Path types: Prefix, Exact, ImplementationSpecific
TLS: Configuración con secrets de Kubernetes
cert-manager: Gestión automática de certificados Let's Encrypt
Rewrites: Reescritura de URLs con anotaciones
Redirects: Redirecciones permanentes o temporales
Buenas prácticas: TLS en todas partes, cert-manager, monitoreo
Próximos Pasos
Módulo 9: Seguridad y RBAC
Lab 8.2: Configuración de Ingress para una Aplicación
Lab 8.3: Certificados TLS con Cert-Manager
Capítulo creado el: Diciembre 2024