diff --git a/ingress.md b/ingress.md index 29e179c..18dadad 100644 --- a/ingress.md +++ b/ingress.md @@ -151,7 +151,65 @@ Estructura del repositorio: kubectl apply -k . ``` -Esto desplegará el controlador en el namespace `ingress-nginx` y lo dejará listo para enrutar peticiones entrantes hacia los servicios del clú ster. +Esto desplegará el controlador en el namespace `ingress-nginx` y lo dejará listo para enrutar peticiones entrantes hacia los servicios del clúster. + +### Separacion del trafico en dos redes + +Para separar el tráfico **externo** (Internet) del **interno** (VPN), el controlador `ingress-nginx` se publica con **dos Services** de tipo `LoadBalancer` apuntando al *mismo* DaemonSet de NGINX: + +**Estructura (repo `kubernetes/ingress-nginx/`):** +``` +configmap/configmap.yaml +deployments/deployment.yaml # DaemonSet del controller +ingressclass/ingressclass.yaml # IngressClass: nginx (controller: k8s.io/ingress-nginx) +namespace.yaml +rbac/* +services/ + ├─ service.yaml # LB público (IP en red 192.168.0.0/24) + └─ service-200.yaml # LB VPN (IP en red 192.168.200.0/24) +``` + +- **`service.yaml`** → IP pública (ej.: `192.168.0.100`). Aquí entra **ACME/Let’s Encrypt** y tráfico externo normal. +- **`service-200.yaml`** → IP **VPN** (ej.: `192.168.200.10`). Solo accesible desde la VPN/CoreDNS interno. + +> Ambos Services seleccionan los *mismos* Pods del controller (`selector: app.kubernetes.io/name: ingress-nginx`). Kubernetes permite múltiples Services por el mismo backend. + +**Ejemplo de `services/service-200.yaml`** +```yaml +apiVersion: v1 +kind: Service +metadata: + name: ingress-nginx-controller-200 + namespace: ingress-nginx +spec: + type: LoadBalancer + loadBalancerIP: 192.168.200.10 + # Preserva la IP de cliente en NGINX y evita hairpinning innecesario. + externalTrafficPolicy: Local + selector: + app.kubernetes.io/name: ingress-nginx + ports: + - name: http + port: 80 + targetPort: 80 + - name: https + port: 443 + targetPort: 443 +``` + +**Uso desde los Ingress de las apps:** +- Todos los Ingress usan la *misma* `ingressClassName: nginx`. +- El aislamiento se consigue con la **lista blanca** de orígenes, por ejemplo: + ```yaml + metadata: + annotations: + nginx.ingress.kubernetes.io/whitelist-source-range: "192.168.200.0/24,10.244.0.0/16,192.168.4.0/24" + ``` +- **ACME/Let’s Encrypt** validará por el LB **público** (`service.yaml`). +- El LB **VPN** (`service-200.yaml`) sirve a clientes internos (WireGuard) y al **CoreDNS** interno, que resuelve los FQDN a `192.168.200.10`. + +**Notas:** +- Si dependes de la IP real del cliente en logs/reglas, usa `externalTrafficPolicy: Local` en ambos Services (o al menos en el interno). Ajusta el firewall si procede. ---