Almacenamiento Persistente con Ceph y Rook en Kubernetes
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
- Rook Operator: El cerebro de la operación, escucha los CRDs y orquesta los cambios.
- Ceph Monitors (MONs): Mantienen el mapa del clúster y la información de estado. Deben ser al menos 3 para garantizar quorum.
- Ceph Managers (MGRs): Proporcionan métricas y una interfaz web (Dashboard).
- Ceph OSDs (Object Storage Daemons): Los que realmente almacenan los datos. Cada OSD se asocia a un disco físico o lógico.
- Ceph MDS (Metadata Server): Necesario solo si usas CephFS.
Flujo de Datos
Cuando un Pod solicita un volumen persistente:
- El usuario crea un PVC que hace referencia a una StorageClass de Rook.
- Kubernetes contacta al provisionador de Rook (CSI driver).
- Rook crea una imagen RBD (o un subvolumen CephFS) en el pool de Ceph correspondiente.
- El PVC se liga a un PV (PersistentVolume) que apunta a esa imagen.
- 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
rbdycephinstalados 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 (sdben 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]
ElfailureDomainpuede serhost(fallo de nodo) orack(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:
- Verifica que los discos estén disponibles y no montados.
- Revisa los logs del OSD:
kubectl -n rook-ceph logs <osd-pod-name>. - Asegúrate de que el directorio
dataDirHostPathtenga permisos de escritura.
Problema 2: PVC se queda en estado Pending
Síntoma: El PVC no se liga a un PV.
Solución:
- Verifica la StorageClass:
kubectl get sc. - Asegúrate de que el pool de Ceph tenga espacio suficiente.
- 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:
- Aumenta el número de OSDs (más discos = más paralelismo).
- Usa discos SSD/NVMe para los OSDs.
- Configura el tamaño del journal y database (ver
cluster.yaml). - Ajusta el parámetro
osd_pool_default_sizea 2 si la redundancia no es crítica.
Buenas Prácticas para Producción
- Planifica la capacidad: Ceph se escala horizontalmente añadiendo OSDs. No escatimes en discos.
- Usa nodos dedicados para MONs: Los monitores son críticos. Desplegarlos en nodos separados de los OSDs mejora la resiliencia.
- Implementa backups: Aunque Ceph replica datos, no es un sustituto de backups. Usa herramientas como
rbd exporto soluciones de backup externas. - Monitorea el rendimiento: Utiliza Prometheus y Grafana con los exportadores de Ceph para anticipar cuellos de botella.
- 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.
