Proxy inverso HTTPS y servidor DNS en kubernetes con terraform

Guía sobre cómo estoy alojando esta página web en AWS con S3 y Cloudfront con coste mínimo

Objetivos y esquema

Objetivos:

Certificados SSL con cert-manager

Conseguir token

Cert-manager es una herramienta que se encarga de gestionar certificados SSL automáticamente, incluida su renovación. Para ello necesita verificar que somos los dueños del dominio , en este caso lo haremos a través de un desafío DNS. Primero necesitaremos crear un token en nuestro proveedor de dominio, en mi caso, cloudflare.

Helm y manifests

Desplegaremos cert-manager con el helm oficial

helm install \
cert-manager oci://quay.io/jetstack/charts/cert-manager \
--version v1.19.2 \
--namespace cert-manager \
--create-namespace \
--set crds.enabled=true

Ahora utilizaremos nuestro token para generar el certificado aplicando los manifest de publicados en mi GitHub

kubectl apply -f cert-manager

IP externa con metalLB

Kubernetes está diseñado para pedir una ip externa a proveedores de cloud, como en mi caso estoy alojando kubernetes en un servidor "bare-metal", es decir, en un ordenador físico, necesito otra manera de dar IPs externas a servicios. La solución a esto es metalLB.

Lo desplegaremos utilizando el helm oficial

helm repo add metallb https://metallb.github.io/metallb
helm install \
metallb metallb/metallb \
--namespace cert-manager \
--create-namespace

MetalLB necesita que le especifiquemos en qué rango están las IPs que debe publicar. Los manifest necesarios para esto están en el GitHub

kubectl apply -f metallb

Controlador de ingress con traefik

Traefik nos permité dirigir cada petición a su servicio correspondiente de acuerdo al FQDN al que fuera dirigida, es decir, a.tudominio.com será dirigida al servicio a y b.tudominio.com será dirigida al servicio b.

Lo desplegaremos utilizando el helm oficial

helm repo add metallb https://metallb.github.io/metallb
helm install \
metallb metallb/metallb \
--namespace cert-manager \
--create-namespace

MetalLB necesita que le especifiquemos en qué rango están las IPs que debe publicar. Los manifest necesarios para esto están en el GitHub

kubectl apply -f metallb

Servidor DNS privado con bind9

En este caso todos mis proyectos tienen acceso limitado a través de una VPN y no son accesibles al público, entonces en vez de usar entradas DNS públicas, utilizaré un DNS privado.

El primer paso es crear un despligue de bind9 y hacerlo accesible con un servicio con IP externa.

kubectl create ns dns
kubectl apply -f bind9

Comprobarmos que efectivamente funciona

nslookup registroprivado.tudominio.com ip-del-servidor-dns

Conclusiones

Funciona adecuadamente y utiliza un certificado SSL válido, hemos conseguido centralizar el acceso y automatizar la gestion de certificados SSL. Los usuarios ya no tendrán que memorizar puertos ni IPs. Para forzar el el acceso a través del proxy es necesario configurar el firewall de los servidores para que solo acepten peticiones https del prxy

Antes vs. después