storage
This commit is contained in:
@@ -1,17 +1,123 @@
|
||||
# k8s-storage
|
||||
# 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 driver de almacenamiento din<69>mico basado en NFS, apuntando a un servidor ZFS (`niflheim`, 192.168.1.10) con la ruta `/mnt/storage/k8s`.
|
||||
|
||||
## Componentes incluidos
|
||||
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.
|
||||
|
||||
- Namespace `nfs-provisioner`
|
||||
- RBAC necesario
|
||||
- Deployment del provisioner din<69>mico
|
||||
- StorageClass predeterminado `nfs-manabo`
|
||||
---
|
||||
|
||||
## C<EFBFBD>mo aplicar
|
||||
## 🏗️ Estructura del módulo
|
||||
|
||||
kubectl apply -f namespace.yaml
|
||||
kubectl apply -f rbac/
|
||||
kubectl apply -f deployment/
|
||||
kubectl apply -f storageclass/
|
||||
* **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
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user