Ingress Controller
Hasta ahora, tenemos dos opciones principales para acceder a nuestras aplicaciones desde el exterior:
- Services del tipo NodePort: No es muy viable para entornos de producción, ya que debemos utilizar puertos aleatorios entre 30000-40000.
- Services del tipo LoadBalancer: Válido solo si trabajamos en un proveedor Cloud que ofrece un balanceador de carga para cada aplicación. En un cloud público, puede ser una opción muy costosa.
La solución puede ser utilizar un Ingress controller, que permite usar un proxy inverso (HAproxy, nginx, traefik, etc.) para acceder a nuestras aplicaciones mediante nombres, utilizando reglas de encaminamiento obtenidas de la API de Kubernetes.
Instalación de Ingress Controller en minikube
En una instalación de minikube, el Ingress Controller no viene instalado por defecto. Minikube ofrece un conjunto de addons que, al activarlos, instalan componentes adicionales. Para ver los addons disponibles, ejecuta:
minikube addons list
Para activar el Ingress Controller, ejecuta:
minikube addons enable ingress
Para comprobar si el componente está instalado, visualiza los Pods creados en el namespace ingress-nginx
:
kubectl get pods -n ingress-nginx
Debería aparecer un Pod llamado ingress-nginx-controller-...
, lo que indica que se ha instalado un Ingress Controller basado en el proxy inverso nginx.
Describiendo el recurso Ingress
Una vez instalado el Ingress Controller, podemos definir un recurso Ingress en un archivo YAML. Trabajaremos con el despliegue y el Service de nginx que hemos creado.
El recurso Ingress para acceder a nuestro despliegue de nginx está en el archivo ingress.yaml
:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx
spec:
rules:
- host: www.example.org
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx
port:
number: 80
Hemos indicado el tipo de recurso Ingress (kind
) y le hemos puesto un nombre (name
). En la especificación del recurso, ponemos una regla que relaciona un nombre de host con un Service que permite el acceso a una aplicación:
host
: Nombre de host para el acceso, que debe apuntar a la IP del nodo master.path
: Ruta de la URL para el acceso, en este caso, la raíz/
. Esto es útil si queremos servir la aplicación en una ruta específica, por ejemplo:www.example.org/app1
.pathType
: Indica cómo se trabajarán las URL.backend
: Service al que se accederá, indicando su nombre (service/name
) y puerto (service/port/number
).
Cuando se crea el recurso, al acceder al nombre indicado, un proxy inverso redirigirá las peticiones HTTP a la IP y puerto del Service correspondiente. Nota: Utilizando Ingress, no es necesario que los Services sean de tipo NodePort para acceder a la aplicación desde el exterior.
Gestionando el recurso Ingress
Para crear el recurso Ingress:
kubectl apply -f ingress.yaml
Para ver el recurso Ingress creado:
kubectl get ingress
Para obtener información detallada del recurso:
kubectl describe ingress/nginx
Accediendo a la aplicación
Como no tenemos un servidor DNS para gestionar los nombres de acceso a las aplicaciones, usaremos resolución estática. Como root
, añade una nueva línea en el archivo /etc/hosts
, indicando el nombre (www.example.org
) y la IP correspondiente, la IP del nodo master:
192.168.39.222 www.example.org