2025-05-03 22:50:47 +00:00
2025-05-03 22:48:22 +00:00
2025-05-03 22:43:39 +00:00
2025-05-03 22:43:39 +00:00
2025-05-03 22:43:39 +00:00
2025-05-03 22:43:39 +00:00
2025-05-03 22:43:39 +00:00
2025-05-03 22:50:47 +00:00

🌐 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 (Lets 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

  1. Aplica todos los recursos:
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).
  1. 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 Lets 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:
kubectl delete ingress switch-ingress -n external
  1. 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.

Description
manifiestos de k8s-external
Readme 28 KiB