🎨 Sysprovider Code
Sysprovider LogoWiki
🇪🇸Hosting español para ecommerce

Almacenamiento Persistente con Ceph y Rook en Kubernetes

Actualizado el 16 de noviembre de 2025

Introducción: El Desafío del Almacenamiento en Kubernetes

En el ecosistema de Kubernetes, la gestión de aplicaciones con estado (stateful applications) siempre ha sido un punto crítico. Mientras que los contenedores son efímeros por naturaleza, las bases de datos, sistemas de archivos y aplicaciones empresariales requieren datos que persistan más allá del ciclo de vida de un Pod. Aquí es donde Ceph y Rook emergen como la solución de facto para proporcionar almacenamiento persistente, escalable y altamente disponible dentro de un clúster de Kubernetes.

Este artículo te guiará a través de los fundamentos de la integración de Ceph y Rook, desde la arquitectura subyacente hasta la implementación práctica, pasando por estrategias de configuración y resolución de problemas. Si buscas un sistema de almacenamiento distribuido que se adapte a las demandas de cargas de trabajo modernas, has llegado al lugar indicado.

¿Qué es Ceph y por qué Rook?

Ceph: El Corazón del Almacenamiento Distribuido

Ceph es un sistema de almacenamiento unificado, distribuido y de código abierto que proporciona tres interfaces principales:

  • RADOS (Reliable Autonomic Distributed Object Store): La capa base que almacena objetos de forma redundante.
  • RBD (RADOS Block Device): Proporciona volúmenes en bloque, ideales para bases de datos como PostgreSQL o MySQL.
  • CephFS: Un sistema de archivos POSIX-compatible, perfecto para cargas de trabajo que requieren acceso concurrente a archivos.
  • RGW (RADOS Gateway): Una interfaz compatible con S3 y Swift para almacenamiento de objetos.

La clave de Ceph es su capacidad para distribuir datos de manera automática, replicarlos y auto-repararse sin intervención manual. Sin embargo, su configuración tradicional puede ser compleja y tediosa.

Rook: El Orquestador de Ceph en Kubernetes

Rook es un operador nativo de Kubernetes que automatiza el despliegue, la configuración, el escalado y la recuperación de Ceph. Con Rook, el clúster de Ceph se convierte en un recurso gestionado de la misma manera que los Deployments o Services de Kubernetes.

Ventajas clave de Rook:

  • Integración nativa: Usa CRDs (Custom Resource Definitions) para definir clústeres Ceph.
  • Autogestión: Rook maneja automáticamente el balanceo de datos, la replicación y la recuperación ante fallos.
  • Almacenamiento persistente dinámico: Crea PersistentVolumeClaims (PVCs) de forma dinámica a través de StorageClasses.
  • Alta disponibilidad: Los monitores (MONs) y gestores (MGRs) de Ceph se despliegan como Pods con tolerancia a fallos.

Arquitectura de un Clúster Ceph con Rook

Antes de sumergirnos en la instalación, es crucial entender los componentes que intervienen.

Componentes del Operador Rook

  1. Rook Operator: El cerebro de la operación, escucha los CRDs y orquesta los cambios.
  2. Ceph Monitors (MONs): Mantienen el mapa del clúster y la información de estado. Deben ser al menos 3 para garantizar quorum.
  3. Ceph Managers (MGRs): Proporcionan métricas y una interfaz web (Dashboard).
  4. Ceph OSDs (Object Storage Daemons): Los que realmente almacenan los datos. Cada OSD se asocia a un disco físico o lógico.
  5. Ceph MDS (Metadata Server): Necesario solo si usas CephFS.

Flujo de Datos

Cuando un Pod solicita un volumen persistente:

  1. El usuario crea un PVC que hace referencia a una StorageClass de Rook.
  2. Kubernetes contacta al provisionador de Rook (CSI driver).
  3. Rook crea una imagen RBD (o un subvolumen CephFS) en el pool de Ceph correspondiente.
  4. El PVC se liga a un PV (PersistentVolume) que apunta a esa imagen.
  5. El Pod monta el volumen y comienza a leer/escribir directamente en Ceph.

Instalación Paso a Paso de Rook en Kubernetes

A continuación, te presento una guía práctica para desplegar un clúster Ceph con Rook. Asumimos que tienes un clúster Kubernetes funcional (1.19+) y al menos 3 nodos con discos sin particionar.

1. Requisitos Previos

  • Kubernetes: Versión 1.19 o superior.
  • Discos: Al menos 3 discos sin usar (pueden ser discos virtuales) en diferentes nodos.
  • Permisos: El usuario que ejecuta los comandos debe tener permisos de administrador del clúster.
  • Módulos del kernel: Asegúrate de tener rbd y ceph instalados en los nodos worker (opcional pero recomendado).

2. Clonar el Repositorio de Rook

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

[TIP]
Siempre usa una versión estable de Rook. Verifica la última versión en GitHub Releases.

3. Desplegar el Operador Rook

El primer paso es instalar el operador y los CRDs necesarios.

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

Verifica que el Pod del operador esté corriendo:

kubectl -n rook-ceph get pods

4. Configurar el Clúster Ceph

Crea un archivo cluster.yaml con la configuración de tu clúster. Aquí un ejemplo básico:

apiVersion: ceph.rook.io/v1
kind: CephCluster
metadata:
  name: rook-ceph
  namespace: rook-ceph
spec:
  dataDirHostPath: /var/lib/rook
  mon:
    count: 3
    allowMultiplePerNode: false
  dashboard:
    enabled: true
  storage:
    useAllNodes: true
    useAllDevices: false
    config:
      databaseSizeMB: "1024"
      journalSizeMB: "1024"
    nodes:
    - name: "node1"
      devices:
      - name: "sdb"
    - name: "node2"
      devices:
      - name: "sdb"
    - name: "node3"
      devices:
      - name: "sdb"

Aplica la configuración:

kubectl create -f cluster.yaml

[WARNING]
Asegúrate de que los discos especificados (sdb en el ejemplo) estén limpios y no tengan sistemas de archivos. Rook no sobreescribirá datos existentes a menos que se lo indiques explícitamente.

5. Verificar el Estado del Clúster

Tras unos minutos, puedes comprobar el estado:

kubectl -n rook-ceph get pods
kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- ceph status

Deberías ver un output similar a:

  cluster:
    id:     a1b2c3d4-e5f6-7890-abcd-ef1234567890
    health: HEALTH_OK

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

6. Configurar StorageClasses y Acceso

Para que los usuarios puedan crear volúmenes, necesitas definir una StorageClass. Rook proporciona ejemplos predefinidos.

kubectl create -f csi/rbd/storageclass.yaml

Esto creará una StorageClass llamada rook-ceph-block. Luego, puedes probar creando un PVC:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test-pvc
spec:
  storageClassName: rook-ceph-block
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
kubectl apply -f test-pvc.yaml
kubectl get pvc

Si todo está correcto, el PVC pasará a estado Bound en segundos.

Estrategias Avanzadas de Configuración

1. Almacenamiento con CephFS

Para aplicaciones que requieren un sistema de archivos compartido (ej. múltiples Pods leyendo/escribiendo), CephFS es la opción ideal.

kubectl create -f filesystem.yaml

Luego, crea la StorageClass correspondiente:

kubectl create -f csi/cephfs/storageclass.yaml

Ahora puedes crear PVCs con storageClassName: rook-cephfs.

2. Alta Disponibilidad y Tolerancia a Fallos

Ceph está diseñado para ser resiliente. Puedes ajustar el número de replicas (por defecto 3) o usar erasure coding para optimizar el espacio.

# Ejemplo de pool con erasure coding
apiVersion: ceph.rook.io/v1
kind: CephBlockPool
metadata:
  name: replicated-pool
  namespace: rook-ceph
spec:
  failureDomain: host
  replicated:
    size: 3

[INFO]
El failureDomain puede ser host (fallo de nodo) o rack (fallo de rack). En entornos cloud, considera usar zonas de disponibilidad.

3. Monitorización y Dashboard

Rook despliega automáticamente un dashboard de Ceph. Para acceder:

kubectl -n rook-ceph get svc rook-ceph-mgr-dashboard

Obtén la contraseña del usuario admin:

kubectl -n rook-ceph get secret rook-ceph-dashboard-password -o jsonpath="{['data']['password']}" | base64 --decode

Accede vía HTTPS al puerto expuesto (generalmente 8443).

Resolución de Problemas Comunes

Problema 1: OSDs no se inician

Síntoma: Los OSDs están en estado down o out.

Solución:

  1. Verifica que los discos estén disponibles y no montados.
  2. Revisa los logs del OSD: kubectl -n rook-ceph logs <osd-pod-name>.
  3. Asegúrate de que el directorio dataDirHostPath tenga permisos de escritura.

Problema 2: PVC se queda en estado Pending

Síntoma: El PVC no se liga a un PV.

Solución:

  1. Verifica la StorageClass: kubectl get sc.
  2. Asegúrate de que el pool de Ceph tenga espacio suficiente.
  3. Revisa los eventos del PVC: kubectl describe pvc <pvc-name>.
kubectl describe pvc test-pvc
# Busca mensajes como "provisioning: Failed to create volume"

Problema 3: Rendimiento lento

Síntoma: Las operaciones de lectura/escritura son lentas.

Solución:

  1. Aumenta el número de OSDs (más discos = más paralelismo).
  2. Usa discos SSD/NVMe para los OSDs.
  3. Configura el tamaño del journal y database (ver cluster.yaml).
  4. Ajusta el parámetro osd_pool_default_size a 2 si la redundancia no es crítica.

Buenas Prácticas para Producción

  1. Planifica la capacidad: Ceph se escala horizontalmente añadiendo OSDs. No escatimes en discos.
  2. Usa nodos dedicados para MONs: Los monitores son críticos. Desplegarlos en nodos separados de los OSDs mejora la resiliencia.
  3. Implementa backups: Aunque Ceph replica datos, no es un sustituto de backups. Usa herramientas como rbd export o soluciones de backup externas.
  4. Monitorea el rendimiento: Utiliza Prometheus y Grafana con los exportadores de Ceph para anticipar cuellos de botella.
  5. Actualiza con cuidado: Sigue las guías de actualización de Rook. Las versiones mayores pueden requerir pasos manuales.

Conclusión

La combinación de Ceph y Rook ofrece una solución de almacenamiento persistente robusta, escalable y nativa de Kubernetes. Al eliminar la complejidad operativa de Ceph, Rook permite a los equipos de SysAdmin centrarse en lo que importa: ejecutar aplicaciones con estado de manera confiable.

Ya sea que necesites volúmenes en bloque para bases de datos, sistemas de archivos compartidos para microservicios o almacenamiento de objetos para data lakes, esta integración te proporciona una base sólida. Implementa los pasos descritos, ajusta la configuración a tu entorno y estarás listo para gestionar el almacenamiento distribuido del futuro.

[TIP]
La clave del éxito con Rook está en la planificación inicial. Invierte tiempo en diseñar la topología de discos y nodos, y el mantenimiento será mínimo.

¿Necesitas ayuda?Son dos de nuestros técnicos, Agustín y Mikel, y están disponibles para resolver cualquier problema.

Hablar con ellos ahora
Agustín y Mikel