Skip to content

Nova - Service Compute

Introduction

Nova est le cœur d'OpenStack, responsable de la gestion des instances (machines virtuelles). Il orchestre la création, le scheduling et la gestion du cycle de vie des VMs à travers les nœuds compute.

Prérequis

Points à apprendre

Architecture Nova

graph TB
    subgraph Controller["CONTROLLER NODE"]
        api["Nova API<br/>(8774)"]
        conductor["Conductor"]
        scheduler["Scheduler"]
        rabbitmq["🐰 RabbitMQ"]

        api --> rabbitmq
        conductor --> rabbitmq
        scheduler --> rabbitmq
    end

    subgraph Compute["COMPUTE NODE"]
        nova_compute["Nova Compute"]
        libvirt["libvirt"]

        subgraph VMs["Virtual Machines"]
            vm1["VM1"]
            vm2["VM2"]
            vm3["VM3"]
        end

        nova_compute --> libvirt
        libvirt --> vm1
        libvirt --> vm2
        libvirt --> vm3
    end

    rabbitmq --> nova_compute

Composants Nova

Composant Rôle
nova-api Point d'entrée REST API
nova-scheduler Sélection du compute host
nova-conductor Médiation DB, coordination
nova-compute Agent sur chaque hyperviseur
nova-novncproxy Proxy console VNC
nova-metadata-api Metadata service (169.254.169.254)

Placement Service

Depuis Stein, Placement est un service séparé qui gère l'inventaire des ressources.

# Voir les resource providers (compute nodes)
openstack resource provider list

# Inventaire d'un provider
openstack resource provider inventory list PROVIDER_UUID

# Traits (caractéristiques)
openstack resource provider trait list PROVIDER_UUID

Flavors (Types d'instances)

Les flavors définissent les ressources allouées aux instances.

# Lister les flavors
openstack flavor list

# Créer un flavor
openstack flavor create m1.small \
  --vcpus 1 \
  --ram 2048 \
  --disk 20 \
  --ephemeral 0 \
  --swap 0

# Flavor avec propriétés avancées
openstack flavor create m1.gpu \
  --vcpus 4 \
  --ram 8192 \
  --disk 40 \
  --property hw:cpu_policy=dedicated \
  --property hw:mem_page_size=large \
  --property pci_passthrough:alias=gpu:1

Propriétés de flavor importantes

# CPU
--property hw:cpu_policy=dedicated     # CPU pinning
--property hw:cpu_thread_policy=prefer # Hyperthreading
--property hw:numa_nodes=2             # NUMA topology

# Mémoire
--property hw:mem_page_size=large      # Huge pages (2MB)
--property hw:mem_page_size=1GB        # 1GB pages

# Disque
--property hw:disk_bus=scsi
--property hw:scsi_model=virtio-scsi

# Réseau
--property hw:vif_multiqueue_enabled=true

# GPU/PCI
--property pci_passthrough:alias=gpu:1

Gestion des instances

Création d'instance

# Instance basique
openstack server create myvm \
  --flavor m1.small \
  --image "Ubuntu 24.04" \
  --network private \
  --key-name mykey

# Instance complète
openstack server create webserver \
  --flavor m1.medium \
  --image "Ubuntu 24.04" \
  --network private \
  --network management \
  --security-group web-sg \
  --security-group ssh-sg \
  --key-name mykey \
  --availability-zone nova:compute-01 \
  --user-data cloud-init.yaml \
  --property env=production \
  --boot-from-volume 50 \
  --wait

Cycle de vie

# États de l'instance
openstack server list

# Arrêter / Démarrer
openstack server stop myvm
openstack server start myvm

# Redémarrer
openstack server reboot myvm           # Soft reboot
openstack server reboot --hard myvm    # Hard reboot

# Pause / Unpause (RAM préservée)
openstack server pause myvm
openstack server unpause myvm

# Suspend / Resume (état sauvegardé)
openstack server suspend myvm
openstack server resume myvm

# Shelve (libère ressources compute)
openstack server shelve myvm
openstack server unshelve myvm

# Supprimer
openstack server delete myvm
openstack server delete --force myvm   # Force

Console et accès

# URL console VNC
openstack console url show myvm

# Console log
openstack console log show myvm
openstack console log show myvm --lines 50

# Accès SSH (si floating IP)
ssh -i ~/.ssh/mykey.pem ubuntu@FLOATING_IP

Scheduler Nova

Le scheduler sélectionne le meilleur host pour une instance.

Filtres

Filtre Description
AvailabilityZoneFilter Respecte la zone demandée
ComputeFilter Host compute actif
RamFilter RAM suffisante
DiskFilter Espace disque suffisant
ComputeCapabilitiesFilter Capabilities du host
ImagePropertiesFilter Compatibilité image
ServerGroupAntiAffinityFilter Anti-affinité
ServerGroupAffinityFilter Affinité
AggregateInstanceExtraSpecsFilter Host aggregates
# /etc/nova/nova.conf
[filter_scheduler]
enabled_filters = AvailabilityZoneFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,ServerGroupAntiAffinityFilter,ServerGroupAffinityFilter,PciPassthroughFilter,NUMATopologyFilter

Weights

[filter_scheduler]
weight_classes = nova.scheduler.weights.all_weighers
ram_weight_multiplier = 1.0
disk_weight_multiplier = 1.0
io_ops_weight_multiplier = -1.0  # Préférer hosts moins chargés

Host Aggregates et Availability Zones

# Créer un aggregate
openstack aggregate create fast-storage \
  --zone nova

# Ajouter des propriétés
openstack aggregate set --property ssd=true fast-storage

# Ajouter un host
openstack aggregate add host fast-storage compute-01

# Créer une availability zone
openstack aggregate create az-1 --zone az-1
openstack aggregate add host az-1 compute-01

# Lister
openstack aggregate list
openstack availability zone list

Server Groups (Anti-Affinité)

# Créer un group anti-affinity
openstack server group create --policy anti-affinity web-servers

# Créer instances dans le groupe
openstack server create web-1 \
  --flavor m1.small \
  --image "Ubuntu 24.04" \
  --hint group=GROUP_UUID

openstack server create web-2 \
  --flavor m1.small \
  --image "Ubuntu 24.04" \
  --hint group=GROUP_UUID
# -> sera placé sur un host différent

Migration d'instances

# Live migration (pas d'interruption)
openstack server migrate --live compute-02 myvm

# Cold migration (instance arrêtée)
openstack server migrate myvm

# Confirmer/Annuler migration
openstack server resize confirm myvm
openstack server resize revert myvm

# Evacuer (host en panne)
openstack server evacuate myvm --host compute-02

Resize d'instance

# Changer de flavor
openstack server resize myvm --flavor m1.large

# Confirmer
openstack server resize confirm myvm

# Annuler
openstack server resize revert myvm

Quotas

# Voir les quotas d'un projet
openstack quota show PROJECT_ID

# Modifier quotas
openstack quota set --instances 100 \
  --cores 200 \
  --ram 512000 \
  --floating-ips 50 \
  PROJECT_ID

# Voir l'utilisation
openstack limits show --absolute

Cells v2

Architecture de scaling pour très grands déploiements.

graph TB
    subgraph API["API LAYER"]
        nova_api["nova-api"]
        nova_scheduler["nova-scheduler"]
        placement["placement"]

        nova_api <--> nova_scheduler
        nova_scheduler <--> placement
    end

    subgraph Cell1["Cell 1"]
        c1_conductor["conductor"]
        c1_compute["compute 1-N"]
        c1_db[(database)]
        c1_mq["rabbitmq"]
    end

    subgraph Cell2["Cell 2"]
        c2_conductor["conductor"]
        c2_compute["compute 1-N"]
        c2_db[(database)]
        c2_mq["rabbitmq"]
    end

    subgraph Cell3["Cell 3"]
        c3_conductor["conductor"]
        c3_compute["compute 1-N"]
        c3_db[(database)]
        c3_mq["rabbitmq"]
    end

    API --> Cell1
    API --> Cell2
    API --> Cell3

Exemples pratiques

Script création d'infrastructure

#!/bin/bash
# Création d'une stack web haute disponibilité

# Variables
PREFIX="webapp"
FLAVOR="m1.small"
IMAGE="Ubuntu 24.04"
NETWORK="private"
KEY="mykey"

# Créer security group
openstack security group create ${PREFIX}-sg
openstack security group rule create --protocol tcp --dst-port 22 ${PREFIX}-sg
openstack security group rule create --protocol tcp --dst-port 80 ${PREFIX}-sg
openstack security group rule create --protocol tcp --dst-port 443 ${PREFIX}-sg

# Créer server group anti-affinity
SG_ID=$(openstack server group create --policy anti-affinity ${PREFIX}-group -f value -c id)

# Créer les instances
for i in 1 2 3; do
  openstack server create ${PREFIX}-web-${i} \
    --flavor $FLAVOR \
    --image "$IMAGE" \
    --network $NETWORK \
    --security-group ${PREFIX}-sg \
    --key-name $KEY \
    --hint group=$SG_ID \
    --wait &
done
wait

# Assigner floating IPs
for i in 1 2 3; do
  FIP=$(openstack floating ip create external -f value -c floating_ip_address)
  openstack server add floating ip ${PREFIX}-web-${i} $FIP
  echo "${PREFIX}-web-${i}: $FIP"
done

Monitoring des hyperviseurs

# Liste des hyperviseurs
openstack hypervisor list

# Stats détaillées
openstack hypervisor show compute-01

# Stats globales
openstack hypervisor stats show

# Serveurs par hypervisor
openstack server list --host compute-01 --all-projects

Ressources

Checkpoint

  • Je comprends l'architecture Nova et ses composants
  • Je peux créer et gérer des flavors
  • Je sais créer des instances avec différentes options
  • Je comprends le fonctionnement du scheduler
  • Je peux configurer des server groups (anti-affinité)
  • Je sais effectuer des migrations d'instances
  • Je comprends les quotas et leur gestion