This commit is contained in:
2025-07-26 09:50:27 +02:00
parent 428158931d
commit 0660e32bb2
10 changed files with 162 additions and 24 deletions

View File

@@ -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) | | `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) | | `comprobaciones.md` | Checklist y pruebas tras cada paso crítico | [Ver](./comprobaciones.md) |
| `coredns\readme.md` | Ejemplo de Multus: CoreDNS | [Ver](./coredns/readme.md) | | `coredns\readme.md` | Ejemplo de Multus: CoreDNS | [Ver](./coredns/readme.md) |
| `storage\readme.md` | Ejemplo de recurso “class”: storage | [Ver](./storage/readme.md) |
--- ---

View File

@@ -24,7 +24,7 @@ spec:
- name: PROVISIONER_NAME - name: PROVISIONER_NAME
value: k8s-sigs.io/nfs-subdir-external-provisioner value: k8s-sigs.io/nfs-subdir-external-provisioner
- name: NFS_SERVER - 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 - name: NFS_PATH
value: / value: /
- name: LABELS - name: LABELS
@@ -32,7 +32,7 @@ spec:
volumes: volumes:
- name: nfs-client-root - name: nfs-client-root
nfs: nfs:
server: 192.168.3.3 server: 192.168.3.4
path: / path: /
tolerations: tolerations:
- key: "storage" - key: "storage"

View File

@@ -32,7 +32,7 @@ spec:
volumes: volumes:
- name: nfs-data - name: nfs-data
hostPath: hostPath:
path: /mnt/storage/k8s/nfsshare path: /mnt/k8s-temp-nfs
type: Directory type: Directory
tolerations: tolerations:
- key: "storage" - key: "storage"
@@ -40,4 +40,4 @@ spec:
value: "only" value: "only"
effect: "NoSchedule" effect: "NoSchedule"
nodeSelector: nodeSelector:
kubernetes.io/hostname: niflheim kubernetes.io/hostname: yomi

View File

@@ -3,6 +3,6 @@ resources:
- rbac/clusterrolebinding.yaml - rbac/clusterrolebinding.yaml
- rbac/clusterrole.yaml - rbac/clusterrole.yaml
- rbac/serviceaccount.yaml - rbac/serviceaccount.yaml
# - deployments/nfs-server.yaml - deployments/nfs-server.yaml
- deployments/nfs-client-provisioner.yaml - deployments/nfs-client-provisioner.yaml
- storageclass/storageclass.yaml - storageclass/storageclass.yaml

17
storage/pod-test.yaml Normal file
View File

@@ -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

12
storage/pvc-test.yaml Normal file
View File

@@ -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

View File

@@ -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 * **Namespace:** `nfs-provisioner`
kubectl apply -f rbac/ * **RBAC:** Permisos y cuentas de servicio necesarios para el provisioner
kubectl apply -f deployment/ * **Deployments:**
kubectl apply -f storageclass/
* `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
```

View File

@@ -1,9 +1,11 @@
apiVersion: storage.k8s.io/v1 apiVersion: storage.k8s.io/v1
kind: StorageClass kind: StorageClass
metadata: metadata:
name: nfs-manabo name: nfs-temp
annotations:
storageclass.kubernetes.io/is-default-class: "true"
provisioner: k8s-sigs.io/nfs-subdir-external-provisioner provisioner: k8s-sigs.io/nfs-subdir-external-provisioner
reclaimPolicy: Retain parameters:
archiveOnDelete: "false"
reclaimPolicy: Delete
volumeBindingMode: Immediate volumeBindingMode: Immediate
mountOptions:
- nfsvers=4.1