Démarrez rapidement une infrastructure OpenStack dans la Baie Virtuelle.

Introduction

Il s'agit d'une version minimale d'OpenStack : pas d'IP publique sur les VMs et uniquement le stockage local.
Ce guide ne traite pas non plus de la partie "Object Storage" (Swift).

Pré-requis

2 serveurs dédiés minimum dans une Baie Virtuelle :
  • 1 serveur dédié (avec tagged vlan, soit EG/MG/HG) pour le contrôle, les VMs (Compute) et le stockage des images (Glance)
  • 1 serveur dédié ou plus pour les noeuds (Compute), EG/MG/HG recommandé (ça sera le cas dans ce guide)

Chacun des serveurs sera fraîchement (ré)installé en Ubuntu Server 11.10 64bit, avec un partitionnement personnalisé :
  • / d'environ 20 Go
  • swap (quelques Go)
  • /var (l'espace restant)
Vous pouvez utiliser la fonction 'Gabarit de réinstallation' pour facilement réutiliser le même partitionnement pour tous les serveurs.

Préparation des serveurs

.

Mise à jour de la distribution et du noyau Ubuntu

~# apt-get update
...
~# apt-get dist-upgrade
...
~# mv /etc/grub.d/06_OVHkernel /etc/grub.d/99_OVHkernel
~# apt-get install -y bridge-utils ntp pwgen linux-image-server
...
~# reboot

~# uname -a
Linux ns208499.ovh.net 3.0.0-14-server #23-Ubuntu SMP Mon Nov 21 20:49:05 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux
.

Configuration de la Baie Virtuelle

Sur le serveur de contrôle :
Ajouter la configuration suivante au fichier /etc/network/interfaces
auto eth0.2367
iface eth0.2367 inet manual
    vlan-raw-device eth0

auto br100
iface br100 inet static
    address 172.16.0.1
    netmask 255.240.0.0
    broadcast 172.31.255.255
    bridge_ports eth0.2367

auto br100:0
iface br100:0 inet static
    address 10.10.10.1
    netmask 255.255.255.0
    broadcast 10.10.10.255
Sur le premier node :
Ajouter la configuration suivante au fichier /etc/network/interfaces
auto eth0.2367
iface eth0.2367 inet manual
    vlan-raw-device eth0

auto br100 
iface br100 inet static
    address 172.16.0.11
    netmask 255.240.0.0
    broadcast 172.31.255.255
    bridge_ports eth0.2367
Démarrage du vlan (sur tous les serveurs)
~# ifup eth0.2367
Set name-type for VLAN subsystem. Should be visible in /proc/net/vlan/config
Added VLAN with VID == 2367 to IF -:eth0:-
ssh stop/waiting
ssh start/running, process 11220
~# ifup br100
Set name-type for VLAN subsystem. Should be visible in /proc/net/vlan/config
ERROR: trying to add VLAN #2367 to IF -:eth0:-  error: File exists
Waiting for br100 to get ready (MAXWAIT is 32 seconds).
ssh stop/waiting
ssh start/running, process 7001
Test
Depuis tous les serveurs, tester l'accès au routeur OVH :
~# ping 172.31.255.254
PING 172.31.255.254 (172.31.255.254) 56(84) bytes of data.
64 bytes from 172.31.255.254: icmp_req=1 ttl=255 time=4.50 ms
64 bytes from 172.31.255.254: icmp_req=2 ttl=255 time=0.466 ms
64 bytes from 172.31.255.254: icmp_req=3 ttl=255 time=0.387 ms
64 bytes from 172.31.255.254: icmp_req=4 ttl=255 time=0.416 ms
^C
--- 172.31.255.254 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2999ms
rtt min/avg/max/mdev = 0.387/1.442/4.501/1.766 ms

Depuis le serveur de contrôle, tester l'accès au node1 :
~# ping 172.16.0.11
PING 172.16.0.11 (172.16.0.11) 56(84) bytes of data.
64 bytes from 172.16.0.11: icmp_req=1 ttl=64 time=0.163 ms
64 bytes from 172.16.0.11: icmp_req=2 ttl=64 time=0.129 ms
64 bytes from 172.16.0.11: icmp_req=3 ttl=64 time=0.121 ms
^C
--- 172.16.0.11 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 0.121/0.137/0.163/0.022 ms

Installation

.

Serveur de contrôle

Génération des mots de passe
touch /root/.psql /root/.pnova /root/.pglance
chmod 600 /root/.psql /root/.pnova /root/.pglance
pwgen 12 1 > /root/.psql
pwgen 12 1 > /root/.pnova
pwgen 12 1 > /root/.pglance
Installation de MySQL
MYSQL_PASS=`cat /root/.psql`
cat <<MYSQL_PRESEED | debconf-set-selections
mysql-server-5.1 mysql-server/root_password password $MYSQL_PASS
mysql-server-5.1 mysql-server/root_password_again password $MYSQL_PASS
mysql-server-5.1 mysql-server/start_on_boot boolean true
MYSQL_PRESEED
apt-get install -y mysql-server python-mysqldb
sed -i 's/127.0.0.1/0.0.0.0/g' /etc/mysql/my.cnf
service mysql restart
Création des bases de données
NOVA_PASS=`cat /root/.pnova`
GLANCE_PASS=`cat /root/.pglance`
cat <<QUERIES | mysql -uroot -p$MYSQL_PASS
CREATE DATABASE nova;
GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' WITH GRANT OPTION;
SET PASSWORD FOR 'nova'@'%' = PASSWORD('$NOVA_PASS');
CREATE DATABASE glance;
GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'%' WITH GRANT OPTION;
SET PASSWORD FOR 'glance'@'%' = PASSWORD('$GLANCE_PASS');
QUERIES
Tester l'accès à la base :
~# mysql -unova -p$NOVA_PASS nova
...
~# mysql -uglance -p$GLANCE_PASS glance
...
Installation de Glance (pour gérer les images d'OS)
sudo apt-get install -y glance
Configurer Glance pour utiliser la base MySQL
chmod 640 /etc/glance/*.conf
perl -pi -e "s/^sql_connection =.*\$/sql_connection = mysql:\/\/glance:$GLANCE_PASS\@172.16.0.1\/glance/" \
 /etc/glance/glance-registry.conf 
service glance-registry restart
Installation des autres composants (compute, network, volume, ...)
apt-get install -y rabbitmq-server nova-common nova-doc python-nova nova-api nova-network nova-volume \
nova-objectstore nova-scheduler nova-compute euca2ools unzip
stop nova-compute; stop nova-network; stop nova-objectstore
cat <<EOF > /etc/nova/nova.conf
--network_manager=nova.network.manager.FlatDHCPManager
--dhcpbridge_flagfile=/etc/nova/nova.conf
--dhcpbridge=/usr/bin/nova-dhcpbridge
--flat_network_dhcp_start=10.10.10.2
--flat_network_bridge=br100
--flat_injected=False
--public_interface=eth0
--lock_path=/var/lock/nova
--logdir=/var/log/nova
--state_path=/var/lib/nova
--verbose
--sql_connection=mysql://nova:$NOVA_PASS@172.16.0.1/nova
--osapi_host=172.16.0.1
--rabbit_host=172.16.0.1
--ec2_host=172.16.0.1
--s3_host=172.16.0.1
--image_service=nova.image.glance.GlanceImageService
--glance_api_servers=172.16.0.1:9292
EOF

On n'utilise pas la configuration réseau par défaut de QEMU :
mv /etc/libvirt/qemu/networks/default.xml /etc/libvirt/qemu/networks/default.xml.orig
Retarder le démarrage de nova-network et nova-scheduler après celui de MySQL :
vi /etc/init/nova-network.conf /etc/init/nova-scheduler.conf
Et modifier la ligne comme ci-dessous pour les 2 fichiers :
start on (filesystem and net-device-up IFACE!=lo and started mysql)
Finaliser l'installation
Redémarrer les services :
restart libvirt-bin; restart nova-api; restart nova-objectstore; restart nova-scheduler;
restart glance-api; restart glance-registry

Configurer :
nova-manage db sync
nova-manage network create private 10.10.10.0/24 1 256
nova-manage user admin novaadmin
nova-manage project create proj novaadmin

Redémarrage final :
restart libvirt-bin; restart nova-api; restart nova-objectstore; restart nova-scheduler
restart glance-api; restart glance-registry
start nova-network; start nova-compute; start nova-objectstore
Créer les credentials
mkdir /root/creds
chmod 700 /root/creds/
nova-manage project zipfile proj novaadmin /root/creds/novacreds.zip
cd /root/creds/
unzip novacreds.zip

On adapte le format du fichier novarc (paramètre EC2_ACCESS_KEY) qui n'est pas compatible avec les outils euca-* :
mv /root/creds/novarc /root/creds/novarc.orig
grep -v EC2_ACCESS_KEY /root/creds/novarc.orig > /root/creds/novarc
nova-manage user exports novaadmin | grep EC2_ACCESS_KEY | sed 's/$/:proj/' >> /root/creds/novarc

On test qu'on communique avec le serveur de contrôle :
~# source /root/creds/novarc
~# euca-describe-availability-zones verbose
AVAILABILITYZONE	nova	available
AVAILABILITYZONE	|- ns208499.ovh.net	
AVAILABILITYZONE	| |- nova-scheduler	enabled :-) 2012-02-06 02:56:45
AVAILABILITYZONE	| |- nova-compute	enabled :-) 2012-02-06 02:56:49
AVAILABILITYZONE	| |- nova-network	enabled :-) 2012-02-06 02:56:45
.

Serveur node1

Installation de Compute
apt-get install -y nova-common python-nova nova-compute euca2ools unzip
Recopier le fichier nova.conf depuis le serveur de contrôle :
vi /etc/nova/nova.conf
...
Redémarrer :
restart nova-compute

On teste depuis le serveur de contrôle :
~# euca-describe-availability-zones verbose
AVAILABILITYZONE	nova	available
AVAILABILITYZONE	|- ns208499.ovh.net	
AVAILABILITYZONE	| |- nova-scheduler	enabled :-) 2012-02-06 03:05:20
AVAILABILITYZONE	| |- nova-compute	enabled :-) 2012-02-06 03:05:16
AVAILABILITYZONE	| |- nova-network	enabled :-) 2012-02-06 03:05:20
AVAILABILITYZONE	|- ns208012.ovh.net	
AVAILABILITYZONE	| |- nova-compute	enabled :-) 2012-02-06 03:05:19

Utilisation

.

Ajouter une image

Exemple avec une image Ubuntu existante
Depuis le serveur de contrôle (mais peut être exécuté depuis n'importe quel emplacement disposant des credentials)
~# cd /tmp/
~# wget http://cloud-images.ubuntu.com/oneiric/current/oneiric-server-cloudimg-amd64.tar.gz
~# cloud-publish-tarball oneiric-server-cloudimg-amd64.tar.gz dub-bucket amd64
Mon Feb  6 04:16:59 CET 2012: ====== extracting image ======
Warning: no ramdisk found, assuming '--ramdisk none'
kernel : oneiric-server-cloudimg-amd64-vmlinuz-virtual
ramdisk: none
image  : oneiric-server-cloudimg-amd64.img
Mon Feb  6 04:17:08 CET 2012: ====== bundle/upload kernel ======
Mon Feb  6 04:17:10 CET 2012: ====== bundle/upload image ======
Mon Feb  6 04:18:01 CET 2012: ====== done ======
emi="ami-00000002"; eri="none"; eki="aki-00000001";
~# euca-describe-images
...
.

Gérer les clefs SSH

cd /root/creds/
touch mykey.priv
chmod 600 mykey.priv 
euca-add-keypair mykey > mykey.priv

~# euca-describe-keypairs
KEYPAIR	mykey	5b:8b:bc:b3:e0:03:8c:55:5f:c7:f9:88:8e:a7:19:29
.

Démarrer une instance

~# euca-run-instances ami-00000002 -k mykey -t m1.tiny
~# euca-describe-instances
Attendre que l'instance soit dans l'état 'running'
~# euca-describe-instances

~# ssh -i mykey.priv ubuntu@10.10.10.2
Welcome to Ubuntu 11.10 (GNU/Linux 3.0.0-15-virtual x86_64)
...

That's all !

Conclusion

Ce guide est largement inspiré des articles de http://cssoss.files.wordpress.com et de la documentation officielle.

A VENIR : utilisation des IP publiques sur les VMs, support des stockages additionnels (nova-volume en iSCSI), Object Storage.