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) |
|
| `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) |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
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
|
* **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
|
||||||
|
```
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user