Objetivos y esquema
Objetivos:
- Servicios a través del puerto 443
- Certificado SSL
- Menor coste posible
- Gestión de certificados SSL
- Simple de mantener
Guía sobre cómo estoy alojando esta página web en AWS con S3 y Cloudfront con coste mínimo
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.
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
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
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
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
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