Skip to content

Glance - Service d'Images

Introduction

Glance gère le catalogue et le stockage des images de machines virtuelles. Il permet de télécharger, stocker et distribuer les images vers les nœuds compute lors de la création d'instances.

Prérequis

Points à apprendre

Architecture Glance

graph TB
    subgraph Glance["GLANCE"]
        subgraph API["Glance API (Port 9292)"]
            upload["Upload/Download images"]
            metadata["Metadata management"]
            discovery["Image discovery"]
        end

        subgraph Backend["Storage Backend"]
            filesystem["📁 File System"]
            swift["📦 Swift Object"]
            ceph["💿 Ceph RBD"]
            s3["☁️ S3"]
        end
    end

    API --> Backend

Formats d'images supportés

Format Extension Description
qcow2 .qcow2 QEMU Copy-On-Write, snapshots, compression
raw .raw, .img Image brute, performance max
vmdk .vmdk VMware
vhd/vhdx .vhd Hyper-V
iso .iso CD/DVD (pour boot)
ami/aki/ari - Format Amazon EC2 legacy

Container formats

Format Description
bare Pas de conteneur, image brute
ovf Open Virtualization Format
ami Amazon Machine Image
docker Image Docker

Gestion des images

Télécharger des images cloud

# Ubuntu Cloud Image
wget https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img

# Debian Cloud
wget https://cloud.debian.org/images/cloud/bookworm/latest/debian-12-generic-amd64.qcow2

# Rocky Linux
wget https://download.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-GenericCloud.latest.x86_64.qcow2

# CirrOS (image de test légère)
wget http://download.cirros-cloud.net/0.6.2/cirros-0.6.2-x86_64-disk.img

Créer une image

# Image basique
openstack image create "Ubuntu 24.04" \
  --file noble-server-cloudimg-amd64.img \
  --disk-format qcow2 \
  --container-format bare \
  --public

# Avec métadonnées
openstack image create "Ubuntu 24.04 LTS" \
  --file noble-server-cloudimg-amd64.img \
  --disk-format qcow2 \
  --container-format bare \
  --public \
  --property os_distro=ubuntu \
  --property os_version=24.04 \
  --property hw_disk_bus=scsi \
  --property hw_scsi_model=virtio-scsi \
  --property hw_qemu_guest_agent=yes \
  --min-disk 10 \
  --min-ram 512

Lister et gérer

# Lister images
openstack image list

# Détails
openstack image show "Ubuntu 24.04"

# Télécharger une image
openstack image save --file ubuntu.qcow2 "Ubuntu 24.04"

# Modifier métadonnées
openstack image set --property os_type=linux "Ubuntu 24.04"

# Supprimer
openstack image delete "Ubuntu 24.04"

Propriétés d'image importantes

# Propriétés hardware
--property hw_disk_bus=scsi           # Bus disque (scsi/virtio/ide)
--property hw_scsi_model=virtio-scsi  # Modèle SCSI
--property hw_vif_model=virtio        # Modèle réseau
--property hw_qemu_guest_agent=yes    # QEMU guest agent

# Propriétés OS
--property os_distro=ubuntu           # Distribution
--property os_version=24.04           # Version
--property os_type=linux              # Type (linux/windows)
--property os_admin_user=ubuntu       # User par défaut

# Contraintes
--min-disk 10                         # Espace disque minimum (GB)
--min-ram 512                         # RAM minimum (MB)

# Propriétés Ceph (si backend RBD)
--property hw_rng_model=virtio        # Random number generator

Visibilité des images

Visibilité Description
public Visible par tous les projets
private Visible uniquement par le propriétaire
shared Partagée avec des projets spécifiques
community Visible par tous, mais non listée par défaut
# Partager une image avec un projet
openstack image add project "Ubuntu 24.04" project-id

# Accepter le partage (côté destinataire)
openstack image set --accept "Ubuntu 24.04"

# Lister les membres
openstack image member list "Ubuntu 24.04"

Backends de stockage

Filesystem (défaut)

# /etc/glance/glance-api.conf
[glance_store]
stores = file
default_store = file
filesystem_store_datadir = /var/lib/glance/images/

Ceph RBD

[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

Swift

[glance_store]
stores = swift
default_store = swift
swift_store_auth_address = http://controller:5000/v3
swift_store_user = service:glance
swift_store_key = GLANCE_PASS
swift_store_container = glance
swift_store_create_container_on_put = True

Image Caching

Le cache réduit les téléchargements répétés depuis le backend.

# /etc/glance/glance-api.conf
[paste_deploy]
flavor = keystone+caching

[glance_store]
filesystem_store_datadir = /var/lib/glance/images/

# Cache
image_cache_dir = /var/lib/glance/image-cache
image_cache_stall_time = 86400
image_cache_max_size = 10737418240  # 10GB
# Pré-cacher une image
glance-cache-manage --host=controller queue-image IMAGE_ID
glance-cache-manage --host=controller cache-image IMAGE_ID

# Voir le cache
glance-cache-manage --host=controller list-cached

Import d'images (Glance v2)

Méthode moderne pour l'import d'images volumineuses.

# Créer l'image (metadata only)
openstack image create "Large Image" \
  --container-format bare \
  --disk-format qcow2

# Import via web-download
openstack image import "Large Image" \
  --method web-download \
  --uri http://example.com/large-image.qcow2

# Import via glance-direct (upload staging)
openstack image create-via-import "Large Image" \
  --container-format bare \
  --disk-format qcow2 \
  --file large-image.qcow2

Interoperability (Image Signature)

Vérification de l'intégrité des images.

# Signer une image
openstack image create "Signed Ubuntu" \
  --file ubuntu.qcow2 \
  --disk-format qcow2 \
  --container-format bare \
  --property img_signature=SIGNATURE \
  --property img_signature_certificate_uuid=CERT_UUID \
  --property img_signature_hash_method=SHA-256 \
  --property img_signature_key_type=RSA-PSS

Conversion d'images

# Conversion avec qemu-img
qemu-img convert -f vmdk -O qcow2 image.vmdk image.qcow2
qemu-img convert -f raw -O qcow2 image.raw image.qcow2

# Compression qcow2
qemu-img convert -f qcow2 -O qcow2 -c source.qcow2 compressed.qcow2

# Vérifier format
qemu-img info image.qcow2

# Redimensionner
qemu-img resize image.qcow2 +10G

Exemples pratiques

Création d'image custom

#!/bin/bash
# Script création image Ubuntu customisée

# Variables
BASE_IMAGE="noble-server-cloudimg-amd64.img"
CUSTOM_IMAGE="ubuntu-24.04-custom.qcow2"

# Copier image base
cp $BASE_IMAGE $CUSTOM_IMAGE

# Personnaliser avec virt-customize
virt-customize -a $CUSTOM_IMAGE \
  --install qemu-guest-agent,cloud-init,vim \
  --run-command 'systemctl enable qemu-guest-agent' \
  --run-command 'apt-get clean' \
  --selinux-relabel

# Réduire taille
virt-sparsify --in-place $CUSTOM_IMAGE

# Upload vers Glance
openstack image create "Ubuntu 24.04 Custom" \
  --file $CUSTOM_IMAGE \
  --disk-format qcow2 \
  --container-format bare \
  --property hw_qemu_guest_agent=yes \
  --property os_distro=ubuntu \
  --property os_version=24.04 \
  --public

Pipeline d'images automatisé

#!/bin/bash
# Mise à jour automatique des images

IMAGES=(
  "https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img|Ubuntu 24.04"
  "https://cloud.debian.org/images/cloud/bookworm/latest/debian-12-generic-amd64.qcow2|Debian 12"
)

for entry in "${IMAGES[@]}"; do
  URL="${entry%%|*}"
  NAME="${entry##*|}"
  FILENAME=$(basename "$URL")

  echo "Processing $NAME..."

  # Télécharger
  wget -q -N "$URL" -O "/tmp/$FILENAME"

  # Supprimer ancienne image
  openstack image delete "$NAME" 2>/dev/null || true

  # Créer nouvelle
  openstack image create "$NAME" \
    --file "/tmp/$FILENAME" \
    --disk-format qcow2 \
    --container-format bare \
    --public

  rm "/tmp/$FILENAME"
done

Ressources

Checkpoint

  • Je comprends les formats d'images supportés
  • Je peux créer et gérer des images dans Glance
  • Je sais configurer les propriétés d'image importantes
  • Je comprends les différents backends de stockage
  • Je peux convertir des images entre formats
  • Je sais partager des images entre projets