Files
2025-07-26 09:53:40 +02:00
..
2025-07-26 09:53:40 +02:00
2025-07-26 09:53:40 +02:00
2025-07-26 09:53:40 +02:00
2025-07-26 09:53:40 +02:00
2025-07-24 18:02:33 +02:00
2025-07-26 09:53:40 +02:00
2025-07-26 09:53:40 +02:00
2025-07-26 09:53:40 +02:00

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:

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:

    kubectl apply -f namespace.yaml
    
  2. Aplica las reglas RBAC:

    kubectl apply -f rbac/
    
  3. Despliega el servidor NFS (si no usas uno externo):

    kubectl apply -f deployments/nfs-server.yaml
    
  4. Despliega el provisioner NFS:

    kubectl apply -f deployments/nfs-client-provisioner.yaml
    
  5. Crea el StorageClass:

    kubectl apply -f storageclass/storageclass.yaml
    

🧪 Cómo probar el almacenamiento

  1. Crea un PVC de prueba:

    kubectl -n nfs-provisioner apply -f pvc-test.yaml
    
  2. Lanza un pod de test que monte ese PVC:

    kubectl -n nfs-provisioner apply -f pod-test.yaml
    
  3. Comprueba que el pod está en estado Running:

    kubectl -n nfs-provisioner get pod test-nfs-pod
    
  4. Conéctate al pod y prueba lectura/escritura:

    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:

    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:

    kubectl -n nfs-provisioner logs deploy/nfs-client-provisioner