Acceder a tus aplicaciones en Kubernetes a través de Ingress

Otra de las formas de acceder a tus pods desde fuera del clúster es a través de lo que se conoce como Ingress. Este recurso nos permite acceder a servicios a través de HTTP(S) y el tráfico se controla utilizando un conjunto de reglas que tú defines. Además de dar a tus aplicaciones una URL externa que permita el acceso, también se puede configurar para el balanceo de carga o terminación SSL. Resumiendo: un proxy inverso. En este artículo te voy a enseñar una de las configuraciones posibles.
Desplegar un Ingress Controller
Antes de configurar el Ingress primero necesitas tener un Ingress Controller. Si revisas la documentación oficial verás que hay de todos los colores. También puedes ver que Kubernetes mantiene dos, que son GCE y Nginx. En este artículo vamos a ver el segundo, para que entiendas el concepto y después puedas elegir el que consideres.
Este controlador no deja de ser un pod en nuestro clúster. Para este artículo vamos a usar minikube, del que ya te hablé en “Otras formas para tener un entorno con Kubernetes”. Aquí es super sencillo de instalar dicho controlador, ya que solo tienes que habilitarlo a través del siguiente comando:
minikube addons enable ingress
Una vez habilitado, podemos ver a través de kubectl get pods –all-namespaces que nginx-controller aparece entre nuestros pods.

Despliegue de un par de aplicaciones
Para comprobar cómo funciona este recurso, necesitamos algo a lo que acceder Para ello, voy a desplegar dos pods de dos aplicaciones cualesquiera, para ver cómo gestionamos el acceso a cada una de ellas. Para este ejemplo he elegido las imágenes aspnetapp y ghost.
#Deploy a couple of apps
kubectl run aspnetcore-sample --image=mcr.microsoft.com/dotnet/core/samples:aspnetapp --port=80
kubectl expose deployment aspnetcore-sample --target-port=80 --type=NodePort
minikube service aspnetcore-sample --url
kubectl run ghost-blog --image=ghost --port=2368
kubectl expose deployment ghost-blog --target-port=2368 --type=NodePort
minikube service ghost-blog --url
Como ves, hemos creado los dos despliegues y luego he habilitado el acceso a través de NodePort. Para comprobar que todo funciona correctamente, puedes recuperar las URL para ambos servicios usando minikube service NOMBRE_DEL_SERVICIO –url. Deberías tener un sitio web con la plantilla de ejemplo de ASP.NET Core y otra con un blog con Ghost.
Crear el recurso Ingress
El recurso ingress es el que va a definir las reglas que se tienen que cumplir para enrutar la petición a un pod u a otro. En este caso, tenemos dos aplicaciones, aspnetcore-sample y ghost-blog, por lo que he creado un archivo con la siguiente configuración:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: example-ingress
spec:
rules:
- host: aspnetcore.sample
http:
paths:
- path: /
backend:
serviceName: aspnetcore-sample
servicePort: 80
- host: ghost.sample
http:
paths:
- path: /
backend:
serviceName: ghost-blog
servicePort: 2368
Para crear este objeto puedes hacerlo a través del siguiente comando:
kubectl apply -f ingress_def_file.yaml
A partir de este momento ya tenemos nuestro ingress creado. Puedes comprobarlo a través del siguiente comando:
Configurar el archivo /etc/hosts
Para poder acceder a ambos sitios, vamos a utilizar dos hostname que van a apuntar a la IP de minikube. Para conocer la misma puedes hacerlo con minikube ip. El archivo /etc/host debería quedar de la siguiente manera:
##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting. Do not change this entry.
##
127.0.0.1localhost
255.255.255.255broadcasthost
::1 localhost
192.168.99.100 aspnetcore.sample
192.168.99.100 ghost.sample
Ahora intenta acceder desde el navegador tanto a http://aspnetcore.sample/


Verás que ambos hostnames son identificados por el ingress y serás enrutado a la aplicación que toque.
¡Saludos!