Ironic

Réseau

Pré-requis

Le réseau bare metal doit permettre :

  • Le provisionnement des machines avec le DHCP et le PXE
  • La gestion de l’alimentation des machines grâce à l’IPMI
  • L’accès aux machines physiques par les utilisateurs

Le réseau doit être acheminé aux machines physiques cible grâce à un VLAN natif (pas de trunk).

Les machines dans ce réseau doivent pouvoir joindre l’API d’Ironic.

Réseau de provisioning

Créer ensuite le bridge correspondant et connecter le au réseau physique :

$ ovs-vsctl add-br br-baremetal
$ ovs-vsctl add-port br-baremetal IRONIC_PROVISIONING_NIC

Modifier ensuite la configuration de neutron :

[ovs]
bridge_mappings = baremetal:br-baremetal

Pour appliquer les modifications :

$ systemctl restart neutron-openvswitch-agent.service

Un réseau dédié doit être créé pour les noeuds bare-metal. Le réseau provider correspondant soit être ajouté :

$ neutron net-create --shared --provider:physical_network baremetal \
    --provider:network_type flat baremetal
$ neutron subnet-create --name baremetal --enable-dhcp \
    --allocation-pool start=192.168.100.1,end=192.168.100.63 \
    --gateway 192.168.100.254 baremetal 192.168.100.0/24
$ neutron router-create ROUTER_NAME
$ neutron router-gateway-set ROUTER_NAME EXTERNAL_NETWORK
$ neutron router-interface-add ROUTER_NAME BAREMETAL_SUBNET

Ajouter l’UUID du réseau créé dans le fichier /etc/ironic/ironic.conf :

[neutron]
cleaning_network_uuid = NETWORK_UUID

Note : le compute-node utilisé pour délivrer le service bare-metal doit avoir une adresse IP dans ce réseau.

Ironic Python Agent (IPA)

Créer les images de déploiement :

$ glance image-create --name deploy-kernel --visibility public \
    --disk-format aki --container-format aki < deploy.vmlinuz
$ glance image-create --name deploy-initramfs --visibility public \
    --disk-format ari --container-format ari < deploy.initrd

Note : les images de déploiement doivent être configurées au niveau du noeud.

Débugguer l’IPA :

[pxe]
pxe_append_params = sshkey="ssh-rsa AAAA..."

Gestion des noeuds

Enrollement

Création du noeud :

$ ironic node-create -d pxe_ipmitool -n NODE_NAME

Ajout des informations sur l’IPMI :

$ ironic node-update NODE_UUID add \
    driver_info/ipmi_username=USER \
    driver_info/ipmi_password=PASS \
    driver_info/ipmi_address=ADDRESS

Ajout des informations sur les ressources du noeud :

$ ironic node-update NODE_UUID add \
    properties/cpus=CPU \
    properties/memory_mb=RAM_MB \
    properties/local_gb=DISK_GB \
    properties/cpu_arch=ARCH

Quand plusieurs disques sont disponibles sur la machine, il faut configurer l’option root_device :

$ ironic node-update NODE_UUID add properties/root_device='{"size": ">= 80"}'

Ajout des informations sur le déploiement du noeud :

$ ironic node-update NODE_UUID add \
    driver_info/deploy_kernel=DEPLOY_VMLINUZ_UUID \
    driver_info/deploy_ramdisk=DEPLOY_INITRD_UUID

Ajout d’un port pour le noeud :

$ ironic port-create -n NODE_UUID -a MAC_ADDRESS

Création des flavors

Création de la flavor associée :

$ nova flavor-create my-baremetal-flavor auto RAM_MB DISK_GB CPU
$ nova flavor-key my-baremetal-flavor set cpu_arch=x86_64

A partir de Queens, ce mode ne sera plus suffisant. Il faudra utiliser les resource classes1.

Désactivation du scheduling basé sur les propriétés standarts :

$ nova flavor-key my-baremetal-flavor set resources:VCPU=0
$ nova flavor-key my-baremetal-flavor set resources:MEMORY_MB=0
$ nova flavor-key my-baremetal-flavor set resources:DISK_GB=0

On associe les noeuds baremetal à une resource class :

openstack baremetal node set --os-baremetal-api-version 1.21 --resource-class "baremetal.20CPU32G" "$NODE_UUID"

Enfin, on modifie la flavor pour lui ajouter la custom resource :

$ nova flavor-key bm-20-32G set resources:CUSTOM_BAREMETAL_20CPU32G=1

Note : la prise en compte de la resource class se fait lors de la création du noeud. Pour vérifier qu’elle existe :

$ curl -s -H "OpenStack-API-Version: placement 1.2" -H "X-Auth-Token: $OS_TOKEN" http://controller:8778/resource_classes | jq '.resource_classes[].name'

Déploiement manuel

$ openstack baremetal node set $NODE_UUID \
    --instance-info image_source=$IMG \
    --instance-info image_checksum=$MD5HASH \
    --instance-info kernel=$KERNEL \
    --instance-info ramdisk=$RAMDISK \
    --instance-info root_gb=25

$ openstack baremetal node deploy $NODE_UUID

$ neutron port-create baremetal --mac-address $MAC
$ ironic port-update $NODE_PORT_ID add extra/vif_port_id=$NEUTRON_PORT_ID

Adoption

Ajouter du matériel déjà provisionné à Ironic avec l'adoption.

Etats

Graph des états d’un noeud dans Ironic

Remettre un noeud au status available :

$ ironic node-set-provision-state NODE_UUID deleted
$ ironic node-set-provision-state NODE_UUID manage
$ ironic node-set-provision-state NODE_UUID provide

Si le noeud reste dans l’état clean wait :

$ ironic --ironic-api-version 1.16 node-set-provision-state NODE_UUID abort

Pour que le noeud puisse être provisionné de nouveau :

$ ironic node-set-maintenance NODE_UUID off

IPMI

Gestion de l’énergie d’un noeud :

$ ipmitool -I lanplus -H <ip> -U <username> -P <password> chassis power <status|on|off|cycle|reset>

Cloud Hybrid

Pour qu’OpenStack soit capable de créer des VM ou des noeuds baremetal en fonction de la flavor sélectionnée, il faut utiliser les agrégats.

Création de deux agrégats, un pour les machines virtuelles et l’autre pour les machies baremetal :

$ openstack aggregate create --property baremetal=true baremetal-hosts
$ openstack aggregate create --property baremetal=false virtual-hosts

Note : pour que les propriétés des agrégats soient pris en compte, il faut que le filtre AggregateInstanceExtraSpecsFilter soit présent dans le paramètre scheduler_default_filters.

Répartir ensuite les hôtes dans les deux agrégats :

$ openstack aggregate add host baremetal-hosts COMPUTE_BM
$ openstack aggregate add host virtual-hosts COMPUTE_VM

Pour changer toutes les flavors déjà présentes :

for i in $(openstack flavor list -c ID -f value); do openstack flavor set $i --property baremetal=false; done

Les flavors doivent ensuite être toutes modifiées pour être associées à l’un ou l’autre des agrégats par le biais des property :

$ openstack flavor set FLAVOR_VM --property baremetal=false
$ openstack flavor set FLAVOR_BM --property baremetal=true

Création des images

$ disk-image-create centos7 baremetal dhcp-all-interfaces grub2 -o centos-image

Documentation


  1. Create flavors for use with the Bare Metal service ↩︎