Files
kubernetes/external/readme.md

167 lines
3.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 🌐 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
```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 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:
```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.