Minikube: Gestión de Ingress
¡El café, la fotografía, el manga, los cómics y la tecnología son mis grandes pasiones!
Magíster en Ingeniería de Sistemas y Computación. Actualmente, instructor de la Facultad de Ingeniería de la Universidad de los Andes.
En Kubernetes, Ingress es un recurso que administra el acceso externo a los servicios dentro de un clúster, típicamente HTTP y HTTPS. Ingress dirige el tráfico web a los diferentes servicios según las reglas que se han definido.
A diferencia de otros métodos para exponer servicios (como NodePort o LoadBalancer), Ingress proporciona:
Enrutamiento basado en URL: Dirige
/fooa un servicio y/bara otroConsolidación de puntos de entrada: Un solo punto de entrada para múltiples servicios
Terminación TLS/SSL: Gestiona certificados y cifrado
Balanceo de carga: Distribuye el tráfico eficientemente
Arquitectura de Ingress
Para entender Ingress correctamente, necesitamos conocer sus componentes principales:
Recurso Ingress: La definición de reglas (un archivo YAML donde se especifica cómo debe enrutarse el tráfico)
Controlador Ingress: El componente que implementa estas reglas (en Minikube, es Nginx por defecto)
Servicios backend: Los servicios de Kubernetes a los que Ingress dirige el tráfico
Funciona así:
Internet → Controlador Ingress → Servicios → Pods
Cuando habilita el complemento Ingress en Minikube, está instalando un Controlador Ingress (Nginx) que observa continuamente los recursos Ingress y configura las reglas de enrutamiento según corresponda.
Prerrequisitos
Antes de comenzar, asegúrate de tener:
Minikube instalado y funcionando
kubectl configurado correctamente
Acceso a Internet para descargar las imágenes necesarias
Paso 1: Habilitando el complemento Ingress en Minikube
El primer paso es activar el complemento Ingress en Minikube, que instalará el controlador Nginx Ingress:
# Si su cluster de minikube esta encendido, apaguelo.
minikube stop
# Identifique la dirección IP de la máquina
ip addr show
# Inicia Minikube especificando la interfaz del host
minikube start --vm-driver=none --apiserver-ips=$(hostname -I | awk '{print $1}')
# Este paso puede tomar varios minutos
minikube addons enable ingress
Este comando realiza varias acciones importantes:
Despliega el controlador Ingress Nginx en el namespace
ingress-nginxConfigura los componentes necesarios como ServiceAccount, ConfigMaps, etc.
Prepara tu clúster para manejar recursos Ingress
Para verificar que el controlador se ha instalado correctamente:
minikube kubectl -- get pods -n ingress-nginx
Debería ver los pods del controlador Ingress ejecutándose. Es crucial esperar hasta que estén en estado Running antes de continuar.
Paso 2: Entendiendo la configuración de ejemplo
Vamos a utilizar el siguiente archivo de ejemplo o referencia, no es necesario que lo descargue o lo genere.
https://storage.googleapis.com/minikube-site-examples/ingress-example.yaml
Ahora vamos a analizar paso a paso el archivo YAML de ejemplo. Este archivo crea una infraestructura completa para demostrar Ingress:
Componente 1: Los Pods
kind: Pod
apiVersion: v1
metadata:
name: foo-app
labels:
app: foo
spec:
containers:
- name: foo-app
image: 'kicbase/echo-server:1.0'
---
kind: Pod
apiVersion: v1
metadata:
name: bar-app
labels:
app: bar
spec:
containers:
- name: bar-app
image: 'kicbase/echo-server:1.0'
Aquí definimos dos pods independientes:
foo-app: Un servidor de eco etiquetado conapp: foobar-app: Otro servidor de eco etiquetado conapp: bar
Estos pods ejecutan la misma imagen (kicbase/echo-server:1.0), que simplemente devuelve información sobre la solicitud recibida. La diferencia clave está en sus etiquetas, que usaremos para seleccionarlos desde sus respectivos servicios.
Componente 2: Los Servicios
kind: Service
apiVersion: v1
metadata:
name: foo-service
spec:
selector:
app: foo
ports:
- port: 8080
---
kind: Service
apiVersion: v1
metadata:
name: bar-service
spec:
selector:
app: bar
ports:
- port: 8080
Para cada pod, creamos un servicio correspondiente:
foo-service: Selecciona el pod con etiquetaapp: foobar-service: Selecciona el pod con etiquetaapp: bar
Cada servicio expone el puerto 8080 de su pod respectivo. Nótese que estos son servicios tipo ClusterIP (el predeterminado), lo que significa que no son accesibles directamente desde fuera del clúster. Es aquí donde Ingress entra en juego.
Componente 3: El Recurso Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
spec:
rules:
- http:
paths:
- pathType: Prefix
path: /foo
backend:
service:
name: foo-service
port:
number: 8080
- pathType: Prefix
path: /bar
backend:
service:
name: bar-service
port:
number: 8080
Esta es la pieza central de nuestra configuración. El recurso Ingress define las reglas de enrutamiento:
Cuando una solicitud llega a la ruta
/foo, se redirige alfoo-serviceen el puerto 8080Cuando una solicitud llega a la ruta
/bar, se redirige albar-serviceen el puerto 8080
El pathType: Prefix indica que cualquier URL que comience con el prefijo especificado (/foo o /bar) coincidirá con la regla. Por ejemplo, /foo/extra también se enrutaría a foo-service.
Paso 3: Aplicando la Configuración
Ahora que entendemos cada componente, vamos a aplicar la configuración a nuestro clúster:
minikube kubectl -- apply -f https://storage.googleapis.com/minikube-site-examples/ingress-example.yaml
Este comando descarga y aplica el archivo YAML completo, creando todos los recursos descritos anteriormente en un solo paso.
Para verificar que todos los recursos se han creado correctamente:
minikube kubectl -- get pods # Debería mostrar foo-app y bar-app
minikube kubectl -- get services # Debería mostrar foo-service y bar-service
minikube kubectl -- get ingress # Debería mostrar example-ingress
Paso 4: Esperando la Asignación de Dirección IP
El controlador Ingress necesita tiempo para configurarse y asignar una dirección IP al recurso Ingress:
minikube kubectl -- get ingress
Inicialmente, el campo ADDRESS puede estar vacío. Espera unos minutos y vuelve a ejecutar el comando hasta que veas una dirección IP asignada:
NAME CLASS HOSTS ADDRESS PORTS AGE
example-ingress nginx * 192.168.49.2 80 5m45s
Esta dirección IP es el punto de entrada único a través del cual accederás a ambos servicios.
Paso 5: Accediendo a los Servicios
Una vez que tiene la dirección IP, puede verificar que el enrutamiento funciona correctamente desde la terminal:
# Accediendo al servicio foo
curl <ip_from_above>/foo
# Accediendo al servicio bar
curl <ip_from_above>/bar
Deberías ver respuestas diferentes según la ruta que uses:
/foomostrará "Request served by foo-app" y más información/barmostrará "Request served by bar-app" y más información
Esto confirma que el Ingress está enrutando correctamente el tráfico según la URL.
Consideraciones Especiales para Docker Desktop
Si está utilizando Minikube con Docker Desktop (un escenario común en Windows y macOS), hay un paso adicional necesario:
minikube tunnel
Este comando crea un túnel de red entre su sistema y el clúster Minikube, permitiendo que las direcciones IP asignadas por Ingress sean accesibles. En este caso, usaría 127.0.0.1 en lugar de la dirección IP mostrada por el comando kubectl get ingress.
Nota importante: El comando minikube tunnel debe ejecutarse en una terminal separada y mantenerse en ejecución mientras necesites acceder a los servicios Ingress.
Análisis Profundo del Funcionamiento
Para entender realmente lo que está sucediendo, visualicemos el flujo de una solicitud:
El usuario envía una solicitud a
<ip_of_ingress>/fooEl controlador Ingress recibe la solicitud y examina la URL
Como la URL comienza con
/foo, el controlador consulta las reglas de IngressLas reglas indican que debe reenviar a
foo-service:8080El servicio
foo-servicereenvía la solicitud al podfoo-appEl pod
foo-appprocesa la solicitud y devuelve una respuestaLa respuesta viaja de vuelta a través del mismo camino
Este proceso ocurre para cada solicitud que llega al Ingress.
Configuraciones Avanzadas de Ingress
El ejemplo mostrado es básico, pero Ingress puede hacer mucho más:
Enrutamiento basado en Host
Puede enrutar tráfico basado en el nombre de host:
spec:
rules:
- host: foo.example.com
http:
paths:
- backend:
service:
name: foo-service
port:
number: 8080
- host: bar.example.com
http:
paths:
- backend:
service:
name: bar-service
port:
number: 8080
Terminación TLS
Puede configurar HTTPS añadiendo una sección TLS:
yamlspec:
tls:
- hosts:
- secure.example.com
secretName: example-tls-secret
rules:
- host: secure.example.com
# ...
Anotaciones de Ingress
Para una configuración más avanzada, puedes usar anotaciones específicas del controlador:
yamlmetadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/ssl-redirect: "false"
Solución de Problemas Comunes
Si encuentra problemas con tu configuración de Ingress, estos son algunos pasos de solución:
Verifica el controlador Ingress:
minikube kubectl -- get pods -n ingress-nginxTodos los pods deben estar en estado Running.
Examina los logs del controlador:
minikube kubectl -- logs -n ingress-nginx -l app.kubernetes.io/name=ingress-nginxVerifica la configuración de Ingress:
minikube kubectl -- describe ingress example-ingressBusca la sección "Events" para ver posibles errores.
Prueba los servicios directamente:
minikube kubectl -- port-forward service/foo-service 8080:8080Luego accede a
localhost:8080para verificar si el servicio funciona correctamente.
Mejores Prácticas para Ingress
Organización de rutas: Diseña tu estructura de rutas de manera lógica y coherente
Seguridad: Utiliza HTTPS siempre que sea posible
Monitoreado: Configura alertas para problemas con tu Ingress
Escalabilidad: Considera usar múltiples controladores Ingress para alta disponibilidad
Validación: Prueba tus configuraciones de Ingress antes de desplegarlas en producción
Ingress es una herramienta para gestionar el acceso externo a tus servicios en Kubernetes. Proporciona una capa de abstracción que permite un enrutamiento avanzado mientras optimiza recursos, especialmente en entornos de nube donde cada LoadBalancer tiene un costo asociado.
Eliminación de Recursos en Kubernetes
Para eliminar todos los recursos que fueron aprovisionados previamente, puedes utilizar el comando kubectl delete con la misma referencia al archivo YAML. Esto instruirá a Kubernetes que elimine todos los recursos definidos en ese archivo.
El comando exacto sería:
minikube kubectl -- delete -f https://storage.googleapis.com/minikube-site-examples/ingress-example.yaml