Configurando NGINX Ingress en Kubernetes Local usando Minikube

Publicado por Jose Maria Hidalgo Garcia el

DevOpsKubernetesMinikube

Cuando se comienza con Kubernetes nos asaltan numerosas dudas, pero una de las más comunes es ¿cómo puedo habilitar el acceso desde el exterior a los servicios de mi cluster?.

Casi por defecto, y porque es una maravillosa solución, muchos de nosotros nos lanzamos de cabeza a usar traefik.

Pero cuando buscamos ejemplos sobre Ingress en Kubernetes descubrimos que existen anotaciones del tipo kubernetes.io/ingress.class: "nginx" en los ficheros YAML.

La idea de esta entrada es precisamente cubrir los pasos para disponer de nuestro propio NGINX Ingress sirviendo peticiones sobre HTTPS en nuestro Kubernetes Local para poder trastear sin miedo y poder afianzar conceptos.

Enumeremos ahora los pasos que daremos juntos:

  • Crear los certificados y secrets donde almacenarlos.
  • Activar el Addon NGINX Ingress en Minikube.
  • Desplegar la imagen microbot y configurar un service para acceder a al pod instanciado.
  • Configurar un Ingress de acceso al host microbot.minikube.io.

Crear los certificados y secrets donde almacenarlos

Primero de todo, vamos a necesitar generar un certificado autofirmado. En Internet podéis encontrar multitud de formas. A continuación os dejo la linea que suelo usar:

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls-key.key -out tls-cert.crt  

Para terminar esta primera etapa crearemos los secrets donde almacenar el certificado anterior:

kubectl create secret tls tls-certificate --key tls-key.key --cert tls-cert.crt  

Activar el Addon Nginx Ingress en Minikube

A partir de Minikube > 0.14 se añadió NGINX Ingress como un Addon y se puede
activar con el siguiente comando:

minikube addons enable ingress  

El anterior comando creará:

Desplegar la imagen microbot y configurar un service para acceder al pod instanciado

Ya tenemos nuestro NGINX Ingress funcionando pero ahora vamos a instanciar un ejemplo. Usaremos la imagen [dontrebootme/microbot](https://github.com/dontrebootme/docker-microbot) e indicaremos que se quiere exponer el puerto 80.

kubectl run microbot --image=dontrebootme/microbot:v1 --port 80  

Ahora creamos el servicio:

kubectl expose deployment microbot --type=NodePort  

Comprobar que se puede acceder al pod instanciado usando el servicio, el siguiente comando abrirá el navegador en el puerto asignado en el cluster:

minikube service microbot  

Entramos en la parte más importante porque vamos a crear el Ingress para nuestro servicio microbot usando el host microbot.minikube.io:

Para esto es necesario crear el fichero microbot-ingress.yaml con el siguiente contenido:

apiVersion: extensions/v1beta1  
kind: Ingress  
metadata:  
  name: microbot-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.org/ssl-services: "microbot"
spec:  
  tls:
    - hosts:
      - microbot.minikube.io
      secretName: tls-certificate
  rules:
  - host: microbot.minikube.io
    http:
      paths:
      - path: /
        backend:
          serviceName: microbot
          servicePort: 80

Usaremos anotaciones de kubernetes en el apartado de metadata para indicar que el ingress-controller es NGINX en nuestro caso. Puedes encontrar más información sobre las anotaciones en la documentación oficial de Kubernetes sobre Ingress

Aparte, también configuraremos con la anotación nginx.org/ssl-services que siempre se sirva las peticiones usando HTTPS.

En el apartado tls se indica el host y el secret que contiene el certificado SSL creado en el primer paso tls-certificate. Esta información será usada por el nginx-controller para reconstruir su configuración y habilitar el acceso por el host inidicado microbot.minikube.io.

Por último se define en rules el host y path indicando qué service y puerto atenderá a la petición. En nuestro caso será el service microbot en el puerto 80.

Ahora crearemos el microbot-ingress a partir del fichero YAML:

kubectl apply -f microbot-ingress.yaml  

Una vez añadida la entrada al fichero hosts de nuestra máquina que apunte a la IP de minikube minikube ip, deberíamos poder acceder a la URL https://microbot.minikube.io

Si lo prefieres y prefieres no ensuciar tu hosts puedes usar curl:

curl --resolve microbot.minikube.io:$(minikube ip) https://microbot.minikube.io --insecure  

Prueba también que si usas http://microbot.minikube.io serás redirigido a https por NGINX.

Para terminar

Esto es el principio de todo lo que podemos hacer al configurar un "ingress-controller". Por ejemplo otro paso adicional sería unirlo a la generación de certificados con Letsencrypt, pero esto da para un nuevo post ;-).

No dudes en comentar cualquier duda o comentario por aquí, o a través de nuestra cuenta de Twitter @enmilocalfun.

Se admiten sugerencias para continuar escribiendo y compartiendo conocimiento sobre este maravilloso producto que es Kubernetes.

Nos leemos.

Autor

Jose Maria Hidalgo Garcia

Arquitecto software y apasionado por todo lo que rodea al movimiento DevOps. Me encanta el terminal y tener todo automatizado en los proyectos en los que participo.
Twitter: @jhidalgo3