Files
kubernetes/storage/readme.md
2025-07-26 09:53:40 +02:00

124 lines
3.6 KiB
Markdown

# k8s-storage: Provisión Dinámica de Volúmenes con NFS en Kubernetes
En Kubernetes, los recursos terminados en Class (como StorageClass, IngressClass, RuntimeClass) definen cómo se deben crear dinámicamente recursos asociados.
No almacenan datos ni son controladores en sí, sino que describen una “clase” o “tipo” de backend que usará K8s cuando se le pida crear algo nuevo.
Este módulo despliega un sistema de almacenamiento dinámico en Kubernetes usando NFS, ideal para clusters domésticos o de laboratorio. Permite crear volúmenes persistentes bajo demanda mediante un *provisioner* conectado a un servidor NFS respaldado por ZFS.
---
## 🏗️ Estructura del módulo
* **Namespace:** `nfs-provisioner`
* **RBAC:** Permisos y cuentas de servicio necesarios para el provisioner
* **Deployments:**
* `nfs-server`: Servidor NFS provisional exportando una carpeta local (por defecto, `/mnt/k8s-temp-nfs`)
>habra que adaptar el servidor donde se instala y hay que crear la carpeta configurada dandole los permisos correspondientes:
>```sh
>sudo mkdir -p /mnt/k8s-temp-nfs
>sudo chown 65534:65534 /mnt/k8s-temp-nfs # uid/gid nobody:nogroup
>```
* `nfs-client-provisioner`: Provisioner dinámico compatible con la mayoría de aplicaciones
* **StorageClass:**
* `nfs-temp` (o el nombre que definas)
* **Tests:**
* `pvc-test.yaml` y `pod-test.yaml` para probar el almacenamiento
---
## 🚀 Cómo desplegar el almacenamiento NFS
1. **Aplica el namespace:**
```sh
kubectl apply -f namespace.yaml
```
2. **Aplica las reglas RBAC:**
```sh
kubectl apply -f rbac/
```
3. **Despliega el servidor NFS (si no usas uno externo):**
```sh
kubectl apply -f deployments/nfs-server.yaml
```
4. **Despliega el provisioner NFS:**
```sh
kubectl apply -f deployments/nfs-client-provisioner.yaml
```
5. **Crea el StorageClass:**
```sh
kubectl apply -f storageclass/storageclass.yaml
```
---
## 🧪 Cómo probar el almacenamiento
1. **Crea un PVC de prueba:**
```sh
kubectl -n nfs-provisioner apply -f pvc-test.yaml
```
2. **Lanza un pod de test que monte ese PVC:**
```sh
kubectl -n nfs-provisioner apply -f pod-test.yaml
```
3. **Comprueba que el pod está en estado Running:**
```sh
kubectl -n nfs-provisioner get pod test-nfs-pod
```
4. **Conéctate al pod y prueba lectura/escritura:**
```sh
kubectl -n nfs-provisioner exec -it test-nfs-pod -- sh
echo "hola NFS" > /data/test.txt
cat /data/test.txt
ls /data
```
5. **Comprueba desde el nodo que el archivo se ha creado en la carpeta NFS exportada.**
6. **Para limpiar:**
```sh
kubectl -n nfs-provisioner delete pod test-nfs-pod
kubectl -n nfs-provisioner delete pvc test-nfs-pvc
```
---
## 📝 Notas adicionales
* El provisioner y el servidor NFS pueden usarse en cualquier nodo Linux compatible.
* Si usas un servidor NFS externo (ej: una NAS o el ProLiant con ZFS), puedes omitir el despliegue de `nfs-server.yaml` y apuntar el provisioner a ese servidor.
* El StorageClass permite crear volúmenes *ReadWriteMany* (RWX), aptos para aplicaciones que comparten datos entre pods.
* Puedes adaptar los paths y nombres según tu arquitectura (ajusta IPs, rutas, StorageClass, etc.).
---
## 🛠️ Solución de problemas
* Si un PVC queda en estado Pending, revisa que el nombre del `provisioner` en el StorageClass coincida con `PROVISIONER_NAME` en el deployment del provisioner.
* Revisa los permisos de la carpeta exportada en el nodo NFS (debe ser `nobody:nogroup`).
* Consulta los logs del provisioner para ver errores:
```sh
kubectl -n nfs-provisioner logs deploy/nfs-client-provisioner
```