# 🌐 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 ```bash 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 1. Aplica todos los recursos: ```bash kubectl apply -k . ``` > AsegĂșrate de que tu clĂșster ya tenga: > > * `cert-manager` instalado. > * Un `ClusterIssuer` llamado `letsencrypt-prod`. > * Un controlador Ingress funcionando (por ejemplo, `nginx`). 2. Reinicia el deployment para recargar cambios del `ConfigMap`: ```bash 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` ```yaml 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 ```bash 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`: ```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: ```bash kubectl apply -f ingress/switch.yaml ``` --- ## 🔍 VerificaciĂłn * Verifica que el pod proxy estĂ© funcionando: ```bash kubectl get pods -n external ``` * Verifica que el endpoint externo responde desde dentro del contenedor: ```bash kubectl exec -n external deploy/external-router-proxy -- curl -k https://192.168.X.X ``` * Verifica que el dominio estĂ© expuesto correctamente: ```bash 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: 1. Borra la entrada del `ConfigMap`. 2. Borra el `Ingress` correspondiente: ```bash kubectl delete ingress switch-ingress -n external ``` 3. Vuelve a aplicar y reiniciar: ```bash kubectl apply -f configmaps/configmap.yaml kubectl rollout restart deployment external-router-proxy -n external ``` --- ## ✹ CrĂ©ditos Mantenido por [Xavor](https://manabo.org) — Kubernetes DevOps Homelab.