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 a través de reglas que nosotros definimos. Además de dar a los servicios 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.

nginx-ingress-controller ejecutándose
nginx-ingress-controller ejecutándose

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

A partir de este momento ya tenemos nuestro ingress creado. Puedes comprobarlo a través del siguiente comando:

kubectl get ingress

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/

Acceso al pod aspnetcore-sample a través del Ingress

como a http://ghost.sample/

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

¡Saludos!