storage
This commit is contained in:
@@ -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) |
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -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,7 +32,7 @@ spec:
|
||||
volumes:
|
||||
- name: nfs-client-root
|
||||
nfs:
|
||||
server: 192.168.3.3
|
||||
server: 192.168.3.4
|
||||
path: /
|
||||
tolerations:
|
||||
- key: "storage"
|
||||
|
||||
@@ -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
|
||||
kubernetes.io/hostname: yomi
|
||||
|
||||
@@ -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
|
||||
|
||||
17
storage/pod-test.yaml
Normal file
17
storage/pod-test.yaml
Normal 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
12
storage/pvc-test.yaml
Normal 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
|
||||
@@ -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
|
||||
```
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user