124 lines
3.6 KiB
Markdown
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
|
|
```
|