From 0660e32bb217227077b7277ea82acd71f1b6558d Mon Sep 17 00:00:00 2001 From: xguefer Date: Sat, 26 Jul 2025 09:50:27 +0200 Subject: [PATCH] storage --- readme.md | 1 + .../deployments/nfs-client-provisioner.yaml | 6 +- storage/deployments/nfs-server.yaml | 4 +- storage/kustomization.yaml | 2 +- storage/pod-test.yaml | 17 +++ storage/pvc-test.yaml | 12 ++ storage/rbac/clusterrolebinding.yaml | 2 +- storage/rbac/serviceaccount.yaml | 2 +- storage/readme.md | 130 ++++++++++++++++-- storage/storageclass/storageclass.yaml | 10 +- 10 files changed, 162 insertions(+), 24 deletions(-) create mode 100644 storage/pod-test.yaml create mode 100644 storage/pvc-test.yaml diff --git a/readme.md b/readme.md index 910e6bc..f08a6f7 100644 --- a/readme.md +++ b/readme.md @@ -15,6 +15,7 @@ Este repositorio contiene los **manifiestos, scripts y documentación** para des | `kubevirt.md` | Despliegue de KubeVirt y gestión de VMs | [Ver](./kubevirt.md) | | `comprobaciones.md` | Checklist y pruebas tras cada paso crítico | [Ver](./comprobaciones.md) | | `coredns\readme.md` | Ejemplo de Multus: CoreDNS | [Ver](./coredns/readme.md) | +| `storage\readme.md` | Ejemplo de recurso “class”: storage | [Ver](./storage/readme.md) | --- diff --git a/storage/deployments/nfs-client-provisioner.yaml b/storage/deployments/nfs-client-provisioner.yaml index d238034..10f2169 100644 --- a/storage/deployments/nfs-client-provisioner.yaml +++ b/storage/deployments/nfs-client-provisioner.yaml @@ -24,7 +24,7 @@ spec: - name: PROVISIONER_NAME value: k8s-sigs.io/nfs-subdir-external-provisioner - name: NFS_SERVER - value: 192.168.3.3 # VLAN 30 IP de niflheim + value: 192.168.3.4 # VLAN 30 IP de Yomi - name: NFS_PATH value: / - name: LABELS @@ -32,10 +32,10 @@ spec: volumes: - name: nfs-client-root nfs: - server: 192.168.3.3 + server: 192.168.3.4 path: / tolerations: - key: "storage" operator: "Equal" value: "only" - effect: "NoSchedule" \ No newline at end of file + effect: "NoSchedule" diff --git a/storage/deployments/nfs-server.yaml b/storage/deployments/nfs-server.yaml index a747160..fda0e4e 100644 --- a/storage/deployments/nfs-server.yaml +++ b/storage/deployments/nfs-server.yaml @@ -32,7 +32,7 @@ spec: volumes: - name: nfs-data hostPath: - path: /mnt/storage/k8s/nfsshare + path: /mnt/k8s-temp-nfs type: Directory tolerations: - key: "storage" @@ -40,4 +40,4 @@ spec: value: "only" effect: "NoSchedule" nodeSelector: - kubernetes.io/hostname: niflheim \ No newline at end of file + kubernetes.io/hostname: yomi diff --git a/storage/kustomization.yaml b/storage/kustomization.yaml index b8907b0..02bba46 100644 --- a/storage/kustomization.yaml +++ b/storage/kustomization.yaml @@ -3,6 +3,6 @@ resources: - rbac/clusterrolebinding.yaml - rbac/clusterrole.yaml - rbac/serviceaccount.yaml -# - deployments/nfs-server.yaml + - deployments/nfs-server.yaml - deployments/nfs-client-provisioner.yaml - storageclass/storageclass.yaml diff --git a/storage/pod-test.yaml b/storage/pod-test.yaml new file mode 100644 index 0000000..0c4b1a6 --- /dev/null +++ b/storage/pod-test.yaml @@ -0,0 +1,17 @@ +apiVersion: v1 +kind: Pod +metadata: + name: test-nfs-pod + namespace: nfs-provisioner +spec: + containers: + - name: busybox + image: busybox + command: [ "sleep", "3600" ] + volumeMounts: + - name: nfs-volume + mountPath: /data + volumes: + - name: nfs-volume + persistentVolumeClaim: + claimName: test-nfs-pvc diff --git a/storage/pvc-test.yaml b/storage/pvc-test.yaml new file mode 100644 index 0000000..f5f72b8 --- /dev/null +++ b/storage/pvc-test.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: test-nfs-pvc + namespace: nfs-provisioner +spec: + accessModes: + - ReadWriteMany + resources: + requests: + storage: 1Gi + storageClassName: nfs-temp diff --git a/storage/rbac/clusterrolebinding.yaml b/storage/rbac/clusterrolebinding.yaml index 91775d0..9a63e0c 100644 --- a/storage/rbac/clusterrolebinding.yaml +++ b/storage/rbac/clusterrolebinding.yaml @@ -9,4 +9,4 @@ subjects: roleRef: kind: ClusterRole name: nfs-client-provisioner-runner - apiGroup: rbac.authorization.k8s.io \ No newline at end of file + apiGroup: rbac.authorization.k8s.io diff --git a/storage/rbac/serviceaccount.yaml b/storage/rbac/serviceaccount.yaml index 147f8b3..616c75b 100644 --- a/storage/rbac/serviceaccount.yaml +++ b/storage/rbac/serviceaccount.yaml @@ -2,4 +2,4 @@ apiVersion: v1 kind: ServiceAccount metadata: name: nfs-client-provisioner - namespace: nfs-provisioner \ No newline at end of file + namespace: nfs-provisioner diff --git a/storage/readme.md b/storage/readme.md index 92f9086..1e6dc75 100644 --- a/storage/readme.md +++ b/storage/readme.md @@ -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 mdulo despliega un driver de almacenamiento dinmico 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 dinmico -- StorageClass predeterminado `nfs-manabo` +--- -## Cmo aplicar +## 🏗️ Estructura del módulo - kubectl apply -f namespace.yaml - kubectl apply -f rbac/ - kubectl apply -f deployment/ - kubectl apply -f storageclass/ \ No newline at end of file +* **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 + ``` diff --git a/storage/storageclass/storageclass.yaml b/storage/storageclass/storageclass.yaml index 5b9be18..a7d44de 100644 --- a/storage/storageclass/storageclass.yaml +++ b/storage/storageclass/storageclass.yaml @@ -1,9 +1,11 @@ apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: - name: nfs-manabo - annotations: - storageclass.kubernetes.io/is-default-class: "true" + name: nfs-temp provisioner: k8s-sigs.io/nfs-subdir-external-provisioner -reclaimPolicy: Retain +parameters: + archiveOnDelete: "false" +reclaimPolicy: Delete volumeBindingMode: Immediate +mountOptions: + - nfsvers=4.1