Saltar al contenido principal

🗄️ Almacenamiento Compartido (RWX) con CephFS

Esta guía muestra cómo instalar Ceph con el operador Rook en un Clúster Kubernetes en Nuvion de SaveinCloud y crear un CephFS, un sistema de archivos compartido.

Con CephFS, el clúster ofrece volúmenes ReadWriteMany (RWX): varios pods, en workers diferentes, montan y escriben en el mismo volumen al mismo tiempo. Esto es útil para aplicaciones con varias réplicas que necesitan los mismos archivos, como los uploads de un sitio web, contenido estático y archivos de configuración.

El paso a paso sigue la documentación oficial de Rook:


🧩 1. Cómo Funciona​

ComponenteQué haceDónde se ejecuta
Operador RookInstala y gestiona Ceph dentro de Kubernetes1 pod en un worker
Monitores (mon)Guardan el mapa del clúster Ceph; necesitan mayoría (quorum)3, uno en cada worker
Managers (mgr)Métricas y módulos de Ceph2 (1 activo, 1 standby)
OSDsGraban los datos, uno por disco1 por worker, en el volumen extra
MDSServidor de metadatos de CephFS2 (1 activo, 1 standby-replay)
Driver CSICrea los volúmenes y los monta en los podsPlugin en cada worker

Los datos de CephFS se graban con 3 réplicas, cada una en un worker diferente. Si un worker se cae, los datos siguen disponibles en los otros dos.


⚠️ 2. Requisitos Previos​

  • 3 workers (recomendado): Ceph usa 3 monitores y guarda cada dato en 3 workers diferentes. Con menos de 3 workers, el clúster no llega a HEALTH_OK y los datos quedan sin redundancia.
  • Recursos de los workers: recomendamos al menos 4 vCPU y 8 GiB de RAM en cada worker. Con 1 vCPU y 2 GiB, los pods de Ceph no caben.
  • Un volumen extra por worker: vea el siguiente paso.
  • Herramientas: kubectl con acceso al clúster (vea Gestión del Clúster) y git.

💽 3. Creando los Volúmenes para los Workers​

Ceph necesita discos dedicados. Cada worker debe recibir un volumen nuevo, vacío y sin formatear, que será usado solo por Ceph.

No use los volúmenes que el nodo ya tiene

Cada worker del clúster ya viene con dos volúmenes, que no deben ser usados por Ceph:

  • Volumen del nodo (vda): disco del sistema operativo.
  • Volumen de los contenedores (vdb): donde se guardan las imágenes y los datos de los contenedores, montado en /var/lib/containerd.

Ceph debe quedar en un tercer volumen (vdc), creado solo para él. Así, los datos de Ceph no compiten por espacio con el sistema ni con las imágenes de los contenedores.

1. En el panel de Nuvion, cree un volumen para cada worker, todos del mismo tamaño. Como cada dato se guarda 3 veces, el espacio útil de CephFS es más o menos el tamaño de un volumen. Por ejemplo, 3 volúmenes de 10 GiB dan cerca de 10 GiB útiles. Vea cómo crear un volumen en Block Storage.

2. Adjunte cada volumen a un worker diferente (node-0, node-1 y node-2).

No formatee ni monte los volúmenes

Rook solo usa discos vacíos: sin partición y sin sistema de archivos. No ejecute mkfs ni mount en esos volúmenes. Si el disco tiene un sistema de archivos, Rook lo omite y el OSD no se crea.

3. Verifique que el volumen aparece vacío en cada worker. Reemplace <nombre-del-worker> por el nombre que muestra kubectl get nodes:

kubectl debug node/<nombre-del-worker> -it --image=busybox:1.36 --profile=sysadmin -- chroot /host lsblk -f

El nuevo volumen debe aparecer como vdc, sin nada en las columnas FSTYPE y MOUNTPOINTS:

NAME   FSTYPE  ...  MOUNTPOINTS
vda ← volumen del nodo (sistema)
├─vda3 ext4 /boot
└─vda4 xfs /sysroot ...
vdb xfs /var/lib/containerd ← volumen de los contenedores
vdc ← volumen nuevo, para Ceph

El comando crea un pod node-debugger-... en el namespace default. Al terminar, elimine ese pod con kubectl delete pod <nombre-del-pod> (el nombre aparece en kubectl get pods).


📥 4. Descargando los Manifiestos de Rook​

Clone el repositorio de Rook en la versión deseada. Esta guía usa la v1.21.0:

git clone --single-branch --branch v1.21.0 https://github.com/rook/rook.git
cd rook/deploy/examples

Todos los archivos usados de aquí en adelante están en ese directorio.


⚙️ 5. Instalando el Operador Rook​

Cree los CRDs, los permisos comunes, el operador de CSI y el operador de Rook:

kubectl create -f crds.yaml -f common.yaml -f csi-operator.yaml
kubectl create -f operator.yaml

Espere a que el pod del operador esté Running:

kubectl -n rook-ceph get pod -l app=rook-ceph-operator -w

🛠️ 6. Ajustando y Creando el Clúster Ceph​

El cluster.yaml de ejemplo ya viene listo para este escenario:

  • useAllNodes: true y useAllDevices: true: Rook busca discos vacíos en todos los nodos y crea un OSD en cada uno. Encuentra vdc e ignora vda y vdb, porque esos ya tienen sistema de archivos.
  • security.cephx.csi.keyType: aes: claves compatibles con el kernel de los nodos. Ceph 20 genera claves AES-256 por defecto, y el kernel 6.12 de Fedora CoreOS no acepta ese tipo; el montaje fallaría con Unknown error 524. No cambie esta opción.

Como Ceph 20 considera inseguro el tipo aes, el clúster queda en HEALTH_WARN con avisos de insecure key types. Estos avisos son esperados en este escenario. Para silenciarlos, edite el cluster.yaml:

vi cluster.yaml

Busque la sección healthCheck: y agregue el bloque muteHealthWarning:

  healthCheck:
muteHealthWarning:
AUTH_INSECURE_ROTATING_SERVICE_KEY_TYPE:
policy: mute
AUTH_INSECURE_CLIENT_KEY_TYPE:
policy: mute
AUTH_INSECURE_KEYS_ALLOWED:
policy: mute
AUTH_INSECURE_KEYS_CREATABLE:
policy: mute
daemonHealth:
# ... (mantenga el resto como está)

Cree el clúster:

kubectl create -f cluster.yaml
tip

Si ya creó el clúster antes de editar el archivo, aplique el cambio con kubectl apply -f cluster.yaml.

La creación tarda algunos minutos. Siga los pods hasta que aparezcan los mon, mgr y un osd por worker:

kubectl -n rook-ceph get pod -w

🧰 7. Instalando el Toolbox y Verificando Ceph​

El toolbox es un pod con la línea de comandos ceph, usado para verificar la salud del clúster:

kubectl create -f toolbox.yaml
kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- ceph status

El resultado esperado:

  cluster:
health: HEALTH_OK
(muted: AUTH_INSECURE_CLIENT_KEY_TYPE AUTH_INSECURE_KEYS_ALLOWED ...)

services:
mon: 3 daemons, quorum a,b,c
mgr: b(active), standbys: a
osd: 3 osds: 3 up, 3 in

Verifique que cada worker tiene un OSD y que los OSDs están en los volúmenes nuevos:

kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- ceph osd tree
kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- ceph osd metadata | grep -E '"(hostname|devices)"'

Cada OSD debe aparecer en un worker diferente, con "devices": "vdc".


📂 8. Creando el Sistema de Archivos (CephFS)​

Cree el CephFS myfs, con metadatos y datos replicados 3 veces:

kubectl create -f filesystem.yaml

Espere a que los pods del MDS estén Running y verifique el sistema de archivos:

kubectl -n rook-ceph get pod -l app=rook-ceph-mds
kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- ceph fs status myfs

Deben aparecer 1 MDS active y 1 standby-replay, en workers diferentes.


🏷️ 9. Creando la StorageClass​

Cree la StorageClass rook-cephfs, que usarán los PVCs:

kubectl apply -f csi/cephfs/storageclass.yaml
kubectl get sc
NAME          PROVISIONER                     RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION
rook-cephfs rook-ceph.cephfs.csi.ceph.com Delete Immediate true
  • allowVolumeExpansion: true: el volumen se puede ampliar después.
  • reclaimPolicy: Delete: al eliminar el PVC, los datos del volumen se eliminan junto con él.

🧪 10. Probando el Volumen Compartido​

Para probar, cree un PVC RWX y un Deployment con 3 réplicas de nginx usando el mismo volumen. Después, grabe un archivo desde un pod y léalo desde los otros.

1. Cree el archivo teste-pvc.yaml:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: teste-pvc
spec:
accessModes:
- ReadWriteMany
volumeMode: Filesystem
resources:
requests:
storage: 2Gi
storageClassName: rook-cephfs
kubectl apply -f teste-pvc.yaml
kubectl get pvc teste-pvc

El PVC debe quedar Bound, con ACCESS MODES igual a RWX.

2. Cree el archivo teste.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
name: app-compartilhada
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: web-shared
template:
metadata:
labels:
app: web-shared
spec:
containers:
- name: nginx
image: nginx:alpine
volumeMounts:
- name: dados-compartilhados
mountPath: /usr/share/nginx/html
volumes:
- name: dados-compartilhados
persistentVolumeClaim:
claimName: teste-pvc
kubectl apply -f teste.yaml
kubectl get pods -l app=web-shared -o wide -w

3. Con los 3 pods Running, grabe un archivo desde el primer pod (reemplace <pod-1> por el nombre real):

kubectl exec -it <pod-1> -- sh -c "echo 'Hola desde el Pod 1 a través de CephFS' > /usr/share/nginx/html/index.html"

4. Lea el archivo desde los otros pods:

kubectl exec -it <pod-2> -- cat /usr/share/nginx/html/index.html
kubectl exec -it <pod-3> -- cat /usr/share/nginx/html/index.html

Todos deben mostrar Hola desde el Pod 1 a través de CephFS. Esto confirma que los pods, incluso en workers diferentes, están usando el mismo volumen.

5. Al terminar, elimine la prueba:

kubectl delete -f teste.yaml -f teste-pvc.yaml

📌 11. Buenas Prácticas de Uso​

Escritura en el mismo archivo

Varios pods pueden escribir en el mismo volumen sin problema cuando cada uno escribe en sus propios archivos. Cuando varios pods escriben en el mismo archivo, la aplicación necesita usar lock (flock/fcntl), que CephFS respeta entre los nodos. Sin lock, las escrituras simultáneas en el mismo archivo pueden perder datos sin que aparezca ningún error. NFS se comporta de la misma forma.

  • Espacio útil: verifique el espacio libre con ceph df. Como los datos se guardan 3 veces, el espacio útil es cerca de 1/3 de la suma de los volúmenes.
  • Más espacio: adjunte un volumen vacío más en cada worker. Rook crea un OSD nuevo para cada disco vacío en la próxima reconciliación. Para forzar la reconciliación en el momento, reinicie el operador: kubectl -n rook-ceph rollout restart deploy/rook-ceph-operator.
  • Bases de datos: para volúmenes usados por un único pod, como los de una base de datos, prefiera un volumen ReadWriteOnce. CephFS está indicado para datos a los que varios pods necesitan acceder al mismo tiempo.

🩺 12. Solución de Problemas​

SíntomaCausa probableSolución
No aparece ningún pod rook-ceph-osd-NEl volumen tiene partición o sistema de archivos, o no fue adjuntadoVerifique con lsblk -f (paso 3). Vea el motivo en los logs: kubectl -n rook-ceph logs -l app=rook-ceph-osd-prepare -c provision
HEALTH_WARN con PGs undersizedMenos de 3 workers con OSDAsegure 3 workers, cada uno con su volumen
HEALTH_WARN ... insecure key typesClaves aes, necesarias para el kernel de los nodosSilencie los avisos con muteHealthWarning (paso 6)
Pod atascado en ContainerCreating con Unknown error 524Claves AES-256, que el kernel de los nodos no aceptaMantenga security.cephx.csi.keyType: aes en el cluster.yaml
PVC atascado en PendingEl CephFS o la StorageClass no fueron creadosVerifique con ceph fs status myfs y kubectl get sc rook-cephfs

🗑️ 13. Eliminación​

peligro

La eliminación borra todos los datos de Ceph. Haga una copia de seguridad de lo importante antes de continuar.

Siga el orden de abajo, desde el directorio rook/deploy/examples:

# 1. Elimine los workloads y PVCs que usan rook-cephfs, y después la StorageClass
kubectl get pvc -A | grep rook-cephfs
kubectl delete -f csi/cephfs/storageclass.yaml

# 2. Elimine el CephFS
kubectl -n rook-ceph delete cephfilesystem myfs

# 3. Autorice la limpieza de los datos y elimine el clúster Ceph
kubectl -n rook-ceph patch cephcluster rook-ceph --type merge \
-p '{"spec":{"cleanupPolicy":{"confirmation":"yes-really-destroy-data"}}}'
kubectl -n rook-ceph delete cephcluster rook-ceph

# 4. Cuando el CephCluster desaparezca, elimine el toolbox, el operador y los CRDs
kubectl -n rook-ceph get cephcluster
kubectl delete -f toolbox.yaml
kubectl delete -f operator.yaml
kubectl delete -f common.yaml -f csi-operator.yaml -f crds.yaml

Después, desadjunte y elimine los volúmenes de los workers en el panel de Nuvion. Para reutilizar un volumen en una nueva instalación de Ceph, debe estar vacío de nuevo, sin partición y sin sistema de archivos.

Más detalles en Rook Ceph: Cleanup.