Saltar a contenido

Integración OpenStack + Ceph

🎯 Introducción

Ceph es el backend de storage más popular para OpenStack en producción, proporcionando:

  • Almacenamiento unificado: Imágenes, volúmenes e instancias efímeras en un solo clúster
  • Alta disponibilidad: Replicación nativa, sin SPOF
  • Escalabilidad: Crece linealmente añadiendo nodos
  • Performance: Copy-on-write, thin provisioning, snapshots instantáneos
  • Integración nativa: Soporte RBD (RADOS Block Device) en OpenStack

Arquitectura de Integración

graph TB
    subgraph OpenStack
        Glance[Glance<br/>Images]
        Cinder[Cinder<br/>Volumes]
        Nova[Nova<br/>Compute]
    end

    subgraph Ceph Cluster
        MON1[MON 1]
        MON2[MON 2]
        MON3[MON 3]
        OSD1[OSD 1<br/>Pool: images]
        OSD2[OSD 2<br/>Pool: volumes]
        OSD3[OSD 3<br/>Pool: vms]
    end

    Glance -->|RBD| OSD1
    Cinder -->|RBD| OSD2
    Nova -->|RBD| OSD3

    MON1 -.->|Cluster Map| OSD1
    MON2 -.->|Cluster Map| OSD2
    MON3 -.->|Cluster Map| OSD3

📋 Requisitos Previos

Ceph Cluster Funcional

  • Versión: Ceph Reef (18.x) o superior
  • Nodos: Mínimo 3 MON + 3 OSD
  • Salud: ceph -s debe mostrar HEALTH_OK
  • Red: 10 Gbps+ recomendado para storage

OpenStack Desplegado

  • Kolla-Ansible con servicios básicos funcionando
  • Acceso desde controllers y computes a la red de Ceph

🔧 Paso 1: Preparar Ceph

1.1 Crear Pools

Desde un nodo MON de Ceph:

# Calcular PGs (Placement Groups)
# Fórmula: (OSDs * 100) / replicas / pools
# Ejemplo: (30 OSDs * 100) / 3 replicas / 3 pools = ~333 PGs
# Redondear a potencia de 2: 256

# Pool para imágenes de Glance
ceph osd pool create images 256
ceph osd pool application enable images rbd

# Pool para volúmenes de Cinder
ceph osd pool create volumes 256
ceph osd pool application enable volumes rbd

# Pool para snapshots de volúmenes
ceph osd pool create backups 128
ceph osd pool application enable backups rbd

# Pool para instancias efímeras de Nova
ceph osd pool create vms 256
ceph osd pool application enable vms rbd

# Configurar replicación (size=3, min_size=2 por defecto)
ceph osd pool set images size 3
ceph osd pool set volumes size 3
ceph osd pool set vms size 3
ceph osd pool set backups size 3

1.2 Configurar CRUSH Rules (Opcional)

Para mejorar performance con SSD/NVMe:

# Crear regla para SSDs (si tienes OSDs con SSD)
ceph osd crush rule create-replicated rule-ssd default host ssd

# Aplicar a pools críticos
ceph osd pool set images crush_rule rule-ssd
ceph osd pool set volumes crush_rule rule-ssd

1.3 Crear Usuarios Cephx

# Usuario para Glance
ceph auth get-or-create client.glance \
  mon 'profile rbd' \
  osd 'profile rbd pool=images' \
  -o /etc/ceph/ceph.client.glance.keyring

# Usuario para Cinder
ceph auth get-or-create client.cinder \
  mon 'profile rbd' \
  osd 'profile rbd pool=volumes, profile rbd pool=backups, profile rbd pool=vms' \
  -o /etc/ceph/ceph.client.cinder.keyring

# Nota: Nova usará el mismo usuario que Cinder

# Verificar permisos
ceph auth get client.glance
ceph auth get client.cinder

1.4 Generar ceph.conf

# Obtener ceph.conf básico
ceph config generate-minimal-conf

# Output esperado:
# [global]
# fsid = a7f64266-0894-4f1e-a635-d0aeaca0e993
# mon_host = [v2:10.0.40.30:3300/0,v1:10.0.40.30:6789/0] [v2:10.0.40.31:3300/0,v1:10.0.40.31:6789/0] [v2:10.0.40.32:3300/0,v1:10.0.40.32:6789/0]

# Guardar en archivo
ceph config generate-minimal-conf > ceph.conf.minimal

🚀 Paso 2: Configurar OpenStack (Kolla-Ansible)

2.1 Copiar Archivos de Ceph a Controllers y Computes

Desde el nodo deployment:

# Crear directorio para configs de Ceph
sudo mkdir -p /etc/kolla/config/glance
sudo mkdir -p /etc/kolla/config/cinder
sudo mkdir -p /etc/kolla/config/nova

# Copiar ceph.conf y keyrings desde Ceph MON
# (Asumiendo que tienes acceso SSH a storage01)

# ceph.conf
scp storage01:/etc/ceph/ceph.conf /tmp/ceph.conf
sudo cp /tmp/ceph.conf /etc/kolla/config/glance/
sudo cp /tmp/ceph.conf /etc/kolla/config/cinder/
sudo cp /tmp/ceph.conf /etc/kolla/config/nova/

# Keyrings
scp storage01:/etc/ceph/ceph.client.glance.keyring /tmp/
scp storage01:/etc/ceph/ceph.client.cinder.keyring /tmp/

sudo cp /tmp/ceph.client.glance.keyring /etc/kolla/config/glance/
sudo cp /tmp/ceph.client.cinder.keyring /etc/kolla/config/cinder/
sudo cp /tmp/ceph.client.cinder.keyring /etc/kolla/config/nova/ceph.client.cinder.keyring

# Ajustar permisos
sudo chown -R kolla:kolla /etc/kolla/config/

2.2 Configurar globals.yml

Editar /etc/kolla/globals.yml:

# Habilitar Ceph
enable_ceph: "no"  # Dejarlo en "no" si Ceph está externo

# Backend Ceph para servicios
glance_backend_ceph: "yes"
glance_backend_file: "no"
cinder_backend_ceph: "yes"
nova_backend_ceph: "yes"

# Configuración de Ceph
ceph_glance_user: "glance"
ceph_glance_keyring: "ceph.client.glance.keyring"
ceph_glance_pool_name: "images"

ceph_cinder_user: "cinder"
ceph_cinder_keyring: "ceph.client.cinder.keyring"
ceph_cinder_pool_name: "volumes"
ceph_cinder_backup_pool_name: "backups"

ceph_nova_user: "cinder"  # Nova usa mismo usuario que Cinder
ceph_nova_keyring: "ceph.client.cinder.keyring"
ceph_nova_pool_name: "vms"

# FSID del clúster Ceph (obtener con: ceph -s)
ceph_cluster_fsid: "a7f64266-0894-4f1e-a635-d0aeaca0e993"

# Configuración de RBD
ceph_rbd_cache: "true"
ceph_rbd_cache_writethrough_until_flush: "true"
ceph_rbd_cache_size: "67108864"  # 64 MB
ceph_rbd_cache_max_dirty: "50331648"  # 48 MB

2.3 Configurar Cinder con Backend Ceph

Crear /etc/kolla/config/cinder/cinder-volume.conf:

[DEFAULT]
enabled_backends = rbd-1

[rbd-1]
volume_driver = cinder.volume.drivers.rbd.RBDDriver
volume_backend_name = rbd-1
rbd_pool = volumes
rbd_ceph_conf = /etc/ceph/ceph.conf
rbd_flatten_volume_from_snapshot = false
rbd_max_clone_depth = 5
rbd_store_chunk_size = 4
rados_connect_timeout = -1
rbd_user = cinder
rbd_secret_uuid = {{ cinder_rbd_secret_uuid }}  # Kolla lo genera automáticamente

2.4 Configurar Glance con Backend Ceph

Crear /etc/kolla/config/glance/glance-api.conf:

[glance_store]
stores = rbd
default_store = rbd
rbd_store_pool = images
rbd_store_user = glance
rbd_store_ceph_conf = /etc/ceph/ceph.conf
rbd_store_chunk_size = 8

2.5 Configurar Nova para Usar Ceph

Crear /etc/kolla/config/nova/nova-compute.conf:

[libvirt]
images_type = rbd
images_rbd_pool = vms
images_rbd_ceph_conf = /etc/ceph/ceph.conf
rbd_user = cinder
rbd_secret_uuid = {{ cinder_rbd_secret_uuid }}
disk_cachemodes = "network=writeback"
hw_disk_discard = unmap

🔄 Paso 3: Desplegar Configuración

3.1 Reconfiguraciones

# Activar virtualenv
source ~/kolla-venv/bin/activate

# Verificar configuración
kolla-ansible -i /etc/kolla/multinode prechecks

# Reconfigura servicios
kolla-ansible -i /etc/kolla/multinode reconfigure --tags glance,cinder,nova

# Esperar a que los contenedores se recreen (~2-5 minutos)
watch docker ps

3.2 Verificar Integración

source /etc/kolla/admin-openrc.sh

# Verificar servicios Cinder
openstack volume service list

# Output esperado:
# +------------------+------------------+------+---------+-------+----------------------------+
# | Binary           | Host             | Zone | Status  | State | Updated At                 |
# +------------------+------------------+------+---------+-------+----------------------------+
# | cinder-scheduler | controller01     | nova | enabled | up    | 2026-01-25T10:30:45.000000 |
# | cinder-volume    | controller01@rbd-1 | nova | enabled | up    | 2026-01-25T10:30:42.000000 |
# +------------------+------------------+------+---------+-------+----------------------------+

# Verificar backend Cinder
openstack volume type list

# Crear volume type para Ceph
openstack volume type create ceph-rbd
openstack volume type set ceph-rbd --property volume_backend_name=rbd-1

# Verificar Glance
openstack image list

✅ Paso 4: Pruebas de Funcionalidad

4.1 Probar Glance (Imágenes en Ceph)

# Descargar imagen de prueba
wget http://download.cirros-cloud.net/0.6.2/cirros-0.6.2-x86_64-disk.img

# Subir a Glance
openstack image create "cirros-ceph" \
  --file cirros-0.6.2-x86_64-disk.img \
  --disk-format qcow2 \
  --container-format bare \
  --public

# Verificar en Ceph
# Desde nodo Ceph:
rbd ls images
rbd info images/<UUID-de-la-imagen>

# Output esperado:
# rbd image 'a7f64266-0894-...':
#     size 117 MiB in 15 objects
#     order 23 (8 MiB objects)
#     snapshot_count: 0
#     block_name_prefix: rbd_data.123456789
#     format: 2

4.2 Probar Cinder (Volúmenes en Ceph)

# Crear volumen
openstack volume create --size 10 --type ceph-rbd test-volume

# Verificar estado
openstack volume list

# Verificar en Ceph
# Desde nodo Ceph:
rbd ls volumes
rbd info volumes/volume-<UUID>

# Output esperado:
# rbd image 'volume-a7f64266...':
#     size 10 GiB in 2560 objects
#     order 22 (4 MiB objects)

4.3 Probar Nova (Instancias Efímeras en Ceph)

# Crear instancia desde imagen Ceph
openstack server create \
  --flavor m1.small \
  --image cirros-ceph \
  --network demo-net \
  test-instance-ceph

# Verificar en Ceph (puede tardar unos segundos)
# Desde nodo Ceph:
rbd ls vms

# Output esperado:
# <UUID-de-la-instancia>_disk

4.4 Probar Snapshots

# Crear snapshot de volumen
openstack volume snapshot create --volume test-volume test-snapshot

# Verificar en Ceph
rbd snap ls volumes/volume-<UUID>

# Crear volumen desde snapshot
openstack volume create --snapshot test-snapshot --size 10 test-volume-from-snap

# Verificar que usa CoW (copy-on-write)
rbd info volumes/volume-<UUID-nuevo>
# Debe mostrar: parent: volumes/volume-<UUID-original>@snapshot-<UUID>

🔍 Operaciones Comunes

Monitorizar Uso de Pools

# Desde nodo Ceph
ceph df

# Output:
# --- RAW STORAGE ---
# CLASS     SIZE    AVAIL     USED  RAW USED  %RAW USED
# ssd      30 TiB  25 TiB  5.0 TiB   5.0 TiB      16.67
# TOTAL    30 TiB  25 TiB  5.0 TiB   5.0 TiB      16.67
#
# --- POOLS ---
# POOL        ID  PGS  STORED  OBJECTS  USED    %USED  MAX AVAIL
# images       1  256  500 GiB    12.5k  1.5 TiB   6.00     8.3 TiB
# volumes      2  256  2.0 TiB      50k  6.0 TiB  24.00     8.3 TiB
# vms          3  256  1.5 TiB      37k  4.5 TiB  18.00     8.3 TiB
# backups      4  128  100 GiB     2.5k  300 GiB   1.20     8.3 TiB

Ajustar Quotas de Pools

# Limitar tamaño máximo de pool
ceph osd pool set-quota volumes max_bytes $((10 * 1024**4))  # 10 TB

# Limitar número de objetos
ceph osd pool set-quota images max_objects 100000

Limpiar Imágenes Huérfanas

# A veces quedan imágenes en Ceph sin referencia en Glance
# Listar imágenes en Glance
openstack image list -f value -c ID > /tmp/glance_images.txt

# Listar imágenes en Ceph
rbd ls images > /tmp/ceph_images.txt

# Comparar y eliminar huérfanas (¡CON CUIDADO!)
# Revisar manualmente antes de borrar

Migrar Volumen entre Backends

# Si tienes múltiples backends (e.g., LVM + Ceph)
openstack volume migrate <volume-id> --host controller01@rbd-1

🛡️ Mejores Prácticas

1. Configuración de Performance

# En cinder-volume.conf y nova-compute.conf
rbd_cache = true
rbd_cache_writethrough_until_flush = true
rbd_cache_max_dirty = 50331648  # 48 MB
rbd_cache_target_dirty = 33554432  # 32 MB

2. Networking

  • Separar redes: Storage front-end (client) y back-end (OSD replication)
  • MTU jumbo frames: 9000 para redes de storage
  • Bonding: LACP o activo-pasivo para redundancia

3. Sizing de Pools

# Regla general para PGs:
# Total PGs = (Total OSDs * 100) / Replicas
# Luego dividir entre número de pools

# Ejemplo con 30 OSDs, 3 replicas, 4 pools:
# (30 * 100) / 3 = 1000 PGs total
# 1000 / 4 pools = 250 PGs por pool
# Redondear a potencia de 2 más cercana: 256

4. Backups

# Habilitar backups de Cinder a Ceph
# En /etc/kolla/config/cinder/cinder-backup.conf
[DEFAULT]
backup_driver = cinder.backup.drivers.ceph.CephBackupDriver
backup_ceph_conf = /etc/ceph/ceph.conf
backup_ceph_user = cinder
backup_ceph_chunk_size = 134217728  # 128 MB
backup_ceph_pool = backups
backup_ceph_stripe_unit = 0
backup_ceph_stripe_count = 0

5. Monitorización

# Prometheus exporters
# Activar en globals.yml:
enable_prometheus_ceph_mgr_exporter: "yes"

# Dashboard Grafana preconfigurado:
# - Ceph Cluster Overview
# - Ceph Pools
# - Ceph OSDs

🐛 Troubleshooting Común

Problema: Cinder-volume no arranca

# Verificar logs
docker logs cinder_volume

# Error común: "No secret with matching uuid"
# Solución: Verificar que cinder_rbd_secret_uuid esté en libvirt
# En cada compute node:
docker exec nova_libvirt virsh secret-list

# Si no existe, recrear:
kolla-ansible -i /etc/kolla/multinode reconfigure --tags nova

Problema: Glance no puede subir imágenes

# Verificar permisos de keyring
docker exec glance_api ls -la /etc/ceph/
docker exec glance_api cat /etc/ceph/ceph.client.glance.keyring

# Verificar conectividad a Ceph
docker exec glance_api ceph -s --id glance

Problema: Instancias no arrancan

# Verificar logs de Nova
docker logs nova_compute

# Error común: "Permission denied on RBD"
# Verificar que el usuario cinder tenga permisos en pool vms
ceph auth get client.cinder

# Debe incluir:
# osd 'profile rbd pool=vms'

Problema: Performance lenta

# Verificar latencia de Ceph
ceph osd perf

# Verificar PGs balanceados
ceph pg dump pgs | awk '{print $1, $15}'

# Ajustar cache de RBD
# Ver configuración actual:
docker exec nova_compute cat /etc/nova/nova.conf | grep rbd_cache

📊 Métricas de Referencia

Performance Esperada (SSD)

  • IOPS (4K random read): 20,000+ por OSD
  • Throughput (seq read): 500+ MB/s por OSD
  • Latencia (avg): <1ms para lectura, <5ms para escritura

Sizing de Ejemplo

Entorno VMs Volúmenes OSDs Capacidad Raw RAM Ceph
Pequeño 50 100 6 12 TB 48 GB
Mediano 200 500 15 45 TB 120 GB
Grande 1000 3000 30 120 TB 240 GB

📚 Referencias

🎓 Próximos Pasos

  1. Optimización: Ver Ceph Tuning
  2. Troubleshooting: Ver Problemas Comunes Ceph
  3. Day-2 Operations: Ver Operaciones Avanzadas

Integración Completada

Si llegaste hasta aquí, ¡tienes OpenStack + Ceph completamente funcional! 🎉

Performance Tuning

Para cargas de trabajo intensivas, revisa la configuración de Ceph Tuning.