🌐 k8s-external-router
Este proyecto despliega un proxy inverso en Kubernetes que permite acceder a dispositivos o servicios externos (fuera del clúster) mediante dominios públicos gestionados con TLS, a través de NGINX y cert-manager.
📝 Componentes
- Deployment: contenedor
nginx:alpine
que actúa como proxy. - ConfigMap: define los proxies en archivos
.conf
cargados en/etc/nginx/conf.d
. - Service: expone el contenedor internamente en el clúster.
- Ingress: gestiona el acceso externo con certificados TLS (Let’s Encrypt).
💠 Estructura del proyecto
k8s-external/
├── configmaps/
│ └── configmap.yaml # Configuración de NGINX
├── deployments/
│ └── deployment.yaml # Proxy con hostNetwork
├── services/
│ └── service.yaml # Service interno
├── ingress/
│ └── router.yaml # Ingress TLS público
🚀 Despliegue
- Aplica todos los recursos:
kubectl apply -k .
Asegúrate de que tu clúster ya tenga:
cert-manager
instalado.- Un
ClusterIssuer
llamadoletsencrypt-prod
.- Un controlador Ingress funcionando (por ejemplo,
nginx
).
- Reinicia el deployment para recargar cambios del
ConfigMap
:
kubectl rollout restart deployment external-router-proxy -n external
➕ Añadir un nuevo proxy
Para añadir un nuevo dominio que apunte a una IP externa:
1. Edita el ConfigMap
switch.conf: |
server {
listen 80;
server_name switch.manabo.org;
location / {
proxy_pass https://192.168.0.100;
proxy_ssl_verify off;
}
}
Guarda el archivo como
configmaps/configmap.yaml
.
2. Aplica el nuevo ConfigMap
y reinicia el deployment
kubectl apply -f configmaps/configmap.yaml
kubectl rollout restart deployment external-router-proxy -n external
3. Crea un nuevo Ingress
Guarda este archivo en ingress/switch.yaml
:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: switch-ingress
namespace: external
annotations:
cert-manager.io/cluster-issuer: "letsencrypt-prod"
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
ingressClassName: nginx
tls:
- hosts:
- switch.manabo.org
secretName: switch-tls
rules:
- host: switch.manabo.org
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: external-router-svc
port:
number: 80
Y aplícalo:
kubectl apply -f ingress/switch.yaml
🔍 Verificación
- Verifica que el pod proxy esté funcionando:
kubectl get pods -n external
- Verifica que el endpoint externo responde desde dentro del contenedor:
kubectl exec -n external deploy/external-router-proxy -- curl -k https://192.168.X.X
- Verifica que el dominio esté expuesto correctamente:
curl -k https://switch.manabo.org
🔐 Seguridad
- Los proxys usan certificados TLS automáticos con Let’s Encrypt.
- La verificación de certificados en el
proxy_pass
está desactivada (proxy_ssl_verify off
) para permitir certificados autofirmados de los dispositivos.
🗜 Limpieza
Para eliminar un proxy:
- Borra la entrada del
ConfigMap
. - Borra el
Ingress
correspondiente:
kubectl delete ingress switch-ingress -n external
- Vuelve a aplicar y reiniciar:
kubectl apply -f configmaps/configmap.yaml
kubectl rollout restart deployment external-router-proxy -n external
✨ Créditos
Mantenido por Xavor — Kubernetes DevOps Homelab.