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á:
- ConfigMap para el NGINX.
- nginx-ingress-controller.
- El servicio que expone un NGINX por defecto para la gestión de peticiones no mapeadas.
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.