Skip to content

Cinder - Service Block Storage

Introduction

Cinder fournit le stockage bloc persistant pour OpenStack. Contrairement aux disques éphémères qui disparaissent avec l'instance, les volumes Cinder persistent indépendamment et peuvent être attachés/détachés des instances.

Prérequis

Points à apprendre

Architecture Cinder

graph TB
    subgraph Controller["CONTROLLER NODE"]
        cinder_api["Cinder API<br/>(8776)"]
        scheduler["Scheduler"]
        backup["Backup<br/>(optionnel)"]
        rabbitmq["🐰 RabbitMQ"]
        mariadb[(MariaDB)]

        cinder_api --> rabbitmq
        scheduler --> rabbitmq
        cinder_api --> mariadb
    end

    subgraph Storage["STORAGE NODE(S)"]
        cinder_volume["Cinder Volume"]

        subgraph Backends["Storage Backends"]
            lvm["LVM Backend"]
            ceph["Ceph RBD"]
            nfs["NFS Backend"]
        end

        cinder_volume --> lvm
        cinder_volume --> ceph
        cinder_volume --> nfs
    end

    rabbitmq --> cinder_volume

Composants Cinder

Composant Rôle
cinder-api Point d'entrée REST API
cinder-scheduler Sélection du backend pour les volumes
cinder-volume Gestion des volumes (1 par backend)
cinder-backup Sauvegarde vers Swift/Ceph/NFS

Backends de stockage

Backend Description Cas d'usage
LVM Logical Volume Manager local Lab, petit déploiement
Ceph RBD Stockage distribué Ceph Production, HA
NFS Partage réseau Simplicité, existant
iSCSI Baies SAN Enterprise
FC Fibre Channel Enterprise haute perf
Pure/NetApp/... Baies propriétaires Enterprise

Gestion des volumes

Création de volumes

# Volume vide
openstack volume create --size 50 my-volume

# Volume bootable depuis image
openstack volume create --size 20 \
  --image "Ubuntu 24.04" \
  --bootable \
  boot-volume

# Volume avec type spécifique
openstack volume create --size 100 \
  --type ssd-fast \
  fast-volume

# Volume dans une zone spécifique
openstack volume create --size 50 \
  --availability-zone nova \
  zoned-volume

Gestion du cycle de vie

# Lister volumes
openstack volume list

# Détails
openstack volume show my-volume

# Étendre un volume (doit être détaché ou supporté online)
openstack volume set --size 100 my-volume

# Renommer
openstack volume set --name new-name my-volume

# Mettre en read-only
openstack volume set --read-only my-volume

# Supprimer
openstack volume delete my-volume

Attachement aux instances

# Attacher un volume
openstack server add volume myvm my-volume

# Attacher sur un device spécifique
openstack server add volume myvm my-volume --device /dev/vdb

# Voir les attachements
openstack volume show my-volume -c attachments

# Détacher
openstack server remove volume myvm my-volume

Boot from Volume

# Créer instance bootant depuis volume
openstack server create myvm \
  --flavor m1.small \
  --volume boot-volume \
  --network private

# Créer instance avec nouveau volume boot
openstack server create myvm \
  --flavor m1.small \
  --image "Ubuntu 24.04" \
  --boot-from-volume 50 \
  --network private

# Ne pas supprimer le volume à la suppression de l'instance
openstack server create myvm \
  --flavor m1.small \
  --image "Ubuntu 24.04" \
  --block-device source=image,id=IMAGE_ID,dest=volume,size=50,bootindex=0,delete_on_termination=false \
  --network private

Snapshots

# Créer un snapshot
openstack volume snapshot create --volume my-volume my-snapshot

# Avec force (volume attaché)
openstack volume snapshot create --volume my-volume --force my-snapshot

# Lister snapshots
openstack volume snapshot list

# Créer volume depuis snapshot
openstack volume create --snapshot my-snapshot \
  --size 50 \
  restored-volume

# Supprimer snapshot
openstack volume snapshot delete my-snapshot

Volume Types et QoS

# Lister les types
openstack volume type list

# Créer un type
openstack volume type create ssd-fast \
  --property volume_backend_name=ceph-ssd

# Propriétés de type
openstack volume type set ssd-fast \
  --property provisioning:type=thin

# QoS
openstack volume qos create high-iops \
  --consumer front-end \
  --property read_iops_sec=10000 \
  --property write_iops_sec=10000

# Associer QoS à un type
openstack volume qos associate high-iops ssd-fast

Backup de volumes

# Créer un backup
openstack volume backup create --name my-backup my-volume

# Backup incrémental
openstack volume backup create --name my-backup-incr \
  --incremental my-volume

# Lister backups
openstack volume backup list

# Restaurer
openstack volume backup restore my-backup restored-volume

# Supprimer backup
openstack volume backup delete my-backup

Transfer de volumes

Permet de transférer un volume entre projets.

# Créer une demande de transfert
openstack volume transfer request create my-volume

# Résultat
+------------+--------------------------------------+
| Field      | Value                                |
+------------+--------------------------------------+
| auth_key   | abc123...                            |
| id         | transfer-id                          |
| name       | None                                 |
| volume_id  | volume-id                            |
+------------+--------------------------------------+

# Accepter le transfert (autre projet)
openstack volume transfer request accept --auth-key abc123 transfer-id

Configuration multi-backend

# /etc/cinder/cinder.conf

[DEFAULT]
enabled_backends = lvm-backend,ceph-backend,nfs-backend

[lvm-backend]
volume_driver = cinder.volume.drivers.lvm.LVMVolumeDriver
volume_group = cinder-volumes
volume_backend_name = LVM
target_protocol = iscsi

[ceph-backend]
volume_driver = cinder.volume.drivers.rbd.RBDDriver
rbd_pool = volumes
rbd_ceph_conf = /etc/ceph/ceph.conf
rbd_user = cinder
volume_backend_name = CEPH

[nfs-backend]
volume_driver = cinder.volume.drivers.nfs.NfsDriver
nfs_shares_config = /etc/cinder/nfs_shares
volume_backend_name = NFS

Configuration Ceph RBD (détaillée)

# /etc/cinder/cinder.conf
[ceph]
volume_driver = cinder.volume.drivers.rbd.RBDDriver
volume_backend_name = ceph
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 = UUID_DU_SECRET
# Créer pool Ceph pour Cinder
ceph osd pool create volumes 128
ceph osd pool application enable volumes rbd

# Créer utilisateur Ceph
ceph auth get-or-create client.cinder \
  mon 'profile rbd' \
  osd 'profile rbd pool=volumes, profile rbd pool=vms, profile rbd pool=images'

Encryption des volumes

# Créer type avec encryption
openstack volume type create encrypted-volumes
openstack volume type set --encryption-provider luks \
  --encryption-cipher aes-xts-plain64 \
  --encryption-key-size 256 \
  --encryption-control-location front-end \
  encrypted-volumes

# Créer volume encrypté
openstack volume create --size 50 \
  --type encrypted-volumes \
  secure-volume

Quotas de stockage

# Voir quotas
openstack quota show PROJECT_ID

# Modifier quotas volumes
openstack quota set --volumes 100 \
  --gigabytes 10000 \
  --snapshots 200 \
  --backups 50 \
  PROJECT_ID

# Quotas par type de volume
openstack quota set --volume-type ssd-fast \
  --volumes 20 \
  --gigabytes 2000 \
  PROJECT_ID

Troubleshooting

# État des services Cinder
openstack volume service list

# Logs
tail -f /var/log/cinder/cinder-volume.log
tail -f /var/log/cinder/cinder-scheduler.log

# Debug volume en erreur
openstack volume show ERROR_VOLUME_ID
openstack volume set --state available ERROR_VOLUME_ID  # Reset état

# Dans Kolla
docker logs cinder_volume
docker exec -it cinder_volume bash

# Vérifier backend Ceph
ceph -s
rbd ls volumes
rbd info volumes/volume-UUID

Exemples pratiques

Stack avec volumes persistants

#!/bin/bash
# Création d'une stack avec DB persistante

# Variables
PROJECT="webapp"
NETWORK="private"

# Volume pour la base de données
openstack volume create --size 100 \
  --type ssd-fast \
  ${PROJECT}-db-data

# Instance DB
openstack server create ${PROJECT}-db \
  --flavor m1.medium \
  --image "Ubuntu 24.04" \
  --network $NETWORK \
  --security-group db-sg \
  --key-name mykey \
  --wait

# Attacher le volume
openstack server add volume ${PROJECT}-db ${PROJECT}-db-data

# Après boot, dans la VM :
# sudo mkfs.ext4 /dev/vdb
# sudo mount /dev/vdb /var/lib/mysql
# echo '/dev/vdb /var/lib/mysql ext4 defaults 0 2' | sudo tee -a /etc/fstab

Migration de volume entre backends

# Retyper un volume (change de backend)
openstack volume set --type new-type --retype-policy on-demand my-volume

# Migration explicite
cinder migrate my-volume target-host

# Vérifier la migration
openstack volume show my-volume -c migration_status

Ressources

Checkpoint

  • Je comprends l'architecture Cinder et ses composants
  • Je peux créer et gérer des volumes
  • Je sais attacher/détacher des volumes aux instances
  • Je comprends le boot from volume
  • Je peux créer des snapshots et backups
  • Je connais les différents backends de stockage
  • Je sais configurer les volume types et QoS