33-Installation Open Stack
33-Installation Open Stack
Installation OpenStack
Une fois le système d’exploitation installé, il faut procéder au paramétrage réseau des interfaces réseau
des machines virtuelles. Attention, cette opération est simple mais peut être fastidieuse en cas de
manque de méthodologie.
1. Configuration réseau
Configuration du hostname
Le Controller node aura pour nom srv-openstack-controller. Il faut donc modifier le fichier /etc/hostname
en ce sens.
# vi /etc/hostname
srv-openstack-controller
Interface de management
La configuration de l’interface de management s’effectue soit par mode graphique (déconseillé sur un
serveur), soit en modifiant le fichier de paramétrage de l’interface (ici enps08).
# vi /etc/sysconfig/network-script/ifcfg-enps08
TYPE=Ethernet
NAME=enps08
UUID=dc309b02-9610-47d2-b4a0 -6 a55279e5e18
ONBOOT=yes
HWADDR=08:00:27:DB:67:E2
BOOTPROTO=none
IPADDR0 = 10.0.0 .11
© Editions ENI - Tous droits réservés - Copie personnelle de kokou Agbedanou -1-
kokou Agbedanou
PREFIX0 = 24
GATEWAY0 = 10.0.0 .1
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=no
Fichier /etc/hosts
Les machines virtuelles doivent effectuer des résolutions de noms car OpenStack utilise des noms de
machines dans de nombreux fichiers de configuration.
# vi /etc/hosts
# srv-openstack-controller
10.0.0.11 srv-openstack-controller
# srv-openstack-netword
10.0.0.21 srv-openstack-network
# srv-openstack-compute
10.0.0.31 src-openstack-compute
Toute modification liée aux paramètres réseau doit être validée par un redémarrage des services réseau.
# /etc/init.d/network restart
© Editions ENI - Tous droits réservés - Copie personnelle de kokou Agbedanou -2-
kokou Agbedanou
Configuration du hostname
Le Network node aura pour nom srv-openstack-network. Il faut donc modifier le fichier /etc/hostname en
ce sens.
# vi /etc/hostname
srv-openstack-network
# vi /etc/sysconfig/network-script/ifcfg-enps08
HWADDR=08:00:27:B9:F7:5 D
TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=no
NAME=enp0s8
UUID=124c5077-3 fa4-4330-b06b-f0e981d3339f
ONBOOT=yes
© Editions ENI - Tous droits réservés - Copie personnelle de kokou Agbedanou -3-
kokou Agbedanou
# vi /etc/sysconfig/network-scripts/ifcfg-enp0s3
HWADDR=08:00:27:BA:B0 :EA
TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=no
NAME=enp0s3
UUID=23ab7239-15d5-47a3-9 e7d-9 e840c3d6551
ONBOOT=yes
IPADDR0 = 10.0.1.21
PREFIX=24
GATEWAY0 = 10.0.1.1
Fichier /etc/hosts
# vi /etc/hosts
# srv-openstack-controller
10.0.0.11 srv-openstack-controller
# srv-openstack-network
10.0.0.21 srv-openstack-network
# srv-openstack-compute
10.0.0.31 src-openstack-compute
© Editions ENI - Tous droits réservés - Copie personnelle de kokou Agbedanou -4-
kokou Agbedanou
# /etc/init.d/network restart
Configuration du hostname
Le Compute node aura pour nom srv-openstack-compute. Il faut donc modifier le fichier /etc/hostname en
ce sens.
# vi /etc/hostname
srv-openstack-compute
# vi /etc/sysconfig/network-script/ifcfg-enps08
HWADDR=08:00:27:C1:B8:EE
TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=no
NAME=enp0s8
UUID=a3f35a9b-c041-461d-ad09-8046c98870e0
ONBOOT=yes
IPADDR0 = 10.0.0 .31
PREFIX=24
GATEWAY0 = 10.0.0 .1
© Editions ENI - Tous droits réservés - Copie personnelle de kokou Agbedanou -5-
kokou Agbedanou
# vi /etc/sysconfig/network-scripts/ifcfg-enp0s3
HWADDR=08:00:27:2 B:64:70
TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=no
NAME=enp0s3
UUID=26483aa9-9924-48ca-9 a2a-2 c221c1d51c0
ONBOOT=yes
IPADDR0 = 10.0.1.31
PREFIX=24
GATEWAY0 = 10.0.1.1
Fichier /etc/hosts
# vi /etc/hosts
# srv-openstack-controller
10.0.0.11 srv-openstack-controller
# srv-openstack-network
10.0.0.21 srv-openstack-network
# srv-openstack-compute
10.0.0.31 src-openstack-compute
# /etc/init.d/network restart
© Editions ENI - Tous droits réservés - Copie personnelle de kokou Agbedanou -6-
kokou Agbedanou
Avant d’aller plus loin, il faut vérifier que les machines communiquent entre elles sur les interfaces de
management, sur les interfaces réseau et sur les interfaces d’accès à Internet. Pour cela, il faut utiliser la
commande ping.
3. Paquets OpenStack
L’étape suivante consiste à installer des paquets permettant d’accéder à des dépôts d’OpenStack.
# Installation de yum-plugin-priorities
# yum install yum-plugin-priorities
# Installation de rdo-release-juno
# yum install http://rdo.fedorapeople.org/openstack-juno/rdo-
release-juno.rpm
Le repository EPEL (Extra Packages for Enterprise Linux) est un dépôt donnant
accès à des paquets supplémentaires aux distributions RHEL, CentOS, Oracle
Linux, Scientific Linux...
© Editions ENI - Tous droits réservés - Copie personnelle de kokou Agbedanou -7-
kokou Agbedanou
# yum upgrade
( 70/ 73): glibc-common-2.17-55.el7_0.5.x86_64.rpm |
11 MB 01:00
( 71/ 73): kernel-3.10.0-123.20.1.el7.x86_64.rpm |
29 MB 02:06
Finishing delta rebuilds of 15 package(s) (26 M)
5. Installation de SELinux
Il est nécessaire d’installer un paquet spécifique à OpenStack pour SELinux ; cela va permettre de gérer la
politique de sécurité des services OpenStack.
© Editions ENI - Tous droits réservés - Copie personnelle de kokou Agbedanou -8-
kokou Agbedanou
a. Service NTP
Le service NTP doit être installé sur tous les nœuds de la plate-forme afin de permettre une
synchronisation parfaite du temps. Il est possible de configurer NTP pour que le
© Editions ENI - Tous droits réservés - Copie personnelle de kokou Agbedanou -9-
kokou Agbedanou
Vérifiez que le fichier /etc/ntp.conf a bien été créé et qu’il contient les éléments suivants concernant les
serveurs de temps :
Vérifiez que le firewall central dispose de la règle permettant le flux NTP en sortie.
Le service NTP est fondamental dans toute plate-forme de cloud computing : tous
les serveurs doivent être à la même heure.
b. Service database
OpenStack a besoin de stocker de nombreuses informations dans une base de données qu’il faut installer
sur un serveur de management. Habituellement, c’est le serveur Controller qui est choisi pour héberger le
service database.
Ce service peut fonctionner avec un back-end de type MySQL (MySQL historique, le fork MariaDB ou
PostgreSQL).
Installation de MariaDB
Par défaut, le fichier /etc/my.cnf ne possède pas de configuration. Il faut donc partir d’une configuration
exemple.
# mv /etc/my.cnf /etc/my.bak
# cp /usr/share/mysql/my-medium.cnf /etc/my.cnf
# vi /etc/my.cnf
...
# plate-forme openstack
bind-address = 10.0.0.11
default-storage-engine = innodb
innodb_file_per_table
collation-server = utf8_general_ci
init-connect = 'SET NAMES utf8'
character-set-server = utf8
Sécurisation de l’installation
Il est nécessaire de protéger la base de données avec des éléments de sécurité. Il faut lancer la base de
données au préalable.
# /usr/bin/mysql_secure_installation
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL
MariaDB SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP
CAREFULLY!
In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB,
and you haven't set the root password yet, the password will be
blank, so you should just press enter here.
Setting the root password ensures that nobody can log into the
MariaDB root user without the proper authorisation.
Reloading the privilege tables will ensure that all changes made
so far will take effect immediately.
Cleaning up...
Opérations post-installation
Les opérations suivantes permettent d’activer le service mariadb au démarrage de la machine virtuelle et
de démarrer le service.
# mysql -u root -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 14
Server version: 5.5.41-MariaDB-log MariaDB Server
Type 'help;' or '\h' for help. Type '\c' to clear the current
input statement.
MariaDB [(none)]>
c. Broker de message
OpenStack a besoin d’échanger des messages entre les différents composants ; pour cela, un système
MOM (Middleware-Oriented Message) est utilisé et permet à chaque composant de dialoguer via ce bus de
message.
OpenStack peut utiliser les services comme RabbitMQ, Qpid ou ZeroMQ pour réaliser cette fonctionnalité
qui est installée sur le serveur de management Controller.
Dans la suite de l’installation, c’est RabbitMQ qui est utilisé et qui doit être installé de la façon suivante :
Par défaut, le mot de passe du compte guest est "guest". Il est possible de changer
ce mot de passe en fournissant une valeur à la place de RABBIT_PASS à l’aide de
la commande rabbitmqctl change_password guest RABBIT_PASS
.
Le service Keystone est le service de gestion des identités d’OpenStack. Il doit être installé sur le serveur
de management Controller. La suite de ce paragraphe présente les différentes étapes permettant de
disposer d’un service d’identité opérationnel.
La première étape consiste à créer une base de données nommée Keystone et d’y affecter des droits
d’accès à l’utilisateur keystoneUser.
# mysql -u root -p
MariaDB [(none)]>
CREATE DATABASE keystone;
GRANT ALL PRIVILEGES ON keystone.* TO 'keystoneUser'@'localhost'
IDENTIFIED BY 'keystonePass';
GRANT ALL PRIVILEGES ON keystone.* TO 'keystoneUser'@'%'
IDENTIFIED BY 'keystonePass';
FLUSH PRIVILEGES;
Quit;
À cet instant, la base de données keystone est vide. Une commande de peuplement de tables sera
effectuée ultérieurement.
Fichier /etc/keystone/keystone.conf
admin_token= a091b6d26450985c32dc
ˇ
Dans la section [database] :
connection=mysql://keystoneUser:keystonePass@srv-openstack-
controller/keystone
ˇ
Dans la section [default] :
verbose = True
Peuplement de la base
À cet instant, la base keystone est pourvue des tables nécessaires à son fonctionnement (credentials, role,
service, token, user...).
L’utilisation d’OpenStack génère de nombreux tokens ; il faut donc penser à purger les tokens expirés à
l’aide de la commande cron.
ˇ
Opérations préalables
Il faut créer les variables pour le service_token et le service_endpoint et les exporter dans l’environnement
de travail.
ˇ
Vérification de l’export :
$ env
XDG_SESSION_ID=11
HOSTNAME=srv-openstack-controller
SELINUX_ROLE_REQUESTED=
OS_SERVICE_TOKEN=a091b6d26450985c32dc
SHELL=/bin/bash
TERM=xterm
HISTSIZE=1000
SSH_CLIENT=192.168.0.20 52081 22
SELINUX_USE_CURRENT_RANGE=
SSH_TTY=/dev/pts/2
USER=sdeon
LS_COLORS=rs=0 :di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do= 01;35:bd
= 40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:c
a=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:
*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;
31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip
= 01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;
31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=
01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:
*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;
31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=
01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.
tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;
35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=
01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.
mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:
*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;
35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;
35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=
01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.
midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:
*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
MAIL=/var/spool/mail/root
OS_SERVICE_ENDPOINT=http://srv-openstack-controller:35357/v2.0
PWD=/etc/keystone
LANG=fr_FR.UTF-8
SELINUX_LEVEL_REQUESTED=
HISTCONTROL=ignoredups
HOME=/home/sdeon
SHLVL=2
OS_TENANT_NAME=admin
LOGNAME=sdeon
SSH_CONNECTION=192.168.0.20 52081 192.168.0.21 22
LESSOPEN=||/usr/bin/lesspipe.sh %s
XDG_RUNTIME_DIR=/run/user/0
_=/usr/bin/env
ˇ
Création du tenant admin :
ˇ
Création du user admin :
ˇ
Création du rôle admin :
ˇ
Ajout du rôle admin au tenant admin et à l’utilisateur admin :
Les commandes suivantes permettent de créer un compte utilisateur qui servira aux opérations non
administratives :
Un compte de service est nécessaire pour les opérations qui sont réalisées entre les services
d’OpenStack.
ˇ
Création du tenant service :
ˇ
Vérification en interrogeant directement l’API Keystone :
ˇ
Affichage de la liste des utilisateurs :
# keystone user-list
+ ----------------------------------+-------+---------+---------
------------+
| id | name | enabled |
email |
+ ----------------------------------+-------+---------+---------
------------+
| df220efb4d234f958dd2b3ec76f775de | admin | True |
[email protected]|
| 3b8418988c8d4235b089030206c6d037 | sdeon | True |
[email protected] |
+ ----------------------------------+-------+---------+---------
------------+
ˇ
Affichage de la liste des tenants :
# keystone tenant-list
+----------------------------------+---------+---------+
| id | name | enabled |
+----------------------------------+---------+---------+
| 4864d3fff7f445d696e52aa77f728734 | admin | True |
| fe54853ceac346b3a55400453ede1caf | sdeon | True |
| ca408342c1cf4b97ad47780827412b7e | service | True |
+----------------------------------+---------+---------+
Le service identity keystone doit être créé, ainsi que le point d’entrée (endpoint) au service à l’aide des
deux commandes suivantes :
ˇ
Test de fonctionnement
En supprimant les variables d’export du token et du endpoint, l’accès à l’API keystone retourne
une erreur.
env[OS_AUTH_URL]
Pour accéder à l’API keystone, il est possible de lancer une commande keystone en passant
manuellement les arguments liés au token et à l’endpoint.
ˇ
Création du fichier de credentials pour admin : /root/admin_creds
# vi /root/admin_creds
export OS_TENANT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=ADMIN_PASS
export OS_AUTH_URL=http://10.0.0.11:35357/v2.0
ˇ
Sourcing du fichier :
# source ~/admin_creds
ˇ
Vérification des variables d’environnement :
# env
...
OS_PASSWORD=ADMIN_PASS
LANG=fr_FR.UTF-8
SELINUX_LEVEL_REQUESTED=
OS_AUTH_URL=http://srv-openstack-controller:35357/v2.0
HISTCONTROL=ignoredups
OS_USERNAME=admin
SHLVL=1
HOME=/root
OS_TENANT_NAME=admin
LOGNAME=root
SSH_CONNECTION=192.168.0.20 62132 192.168.0.21 22
LESSOPEN=||/usr/bin/lesspipe.sh %s
XDG_RUNTIME_DIR=/run/user/0
_=/usr/bin/env
Il faut procéder de même avec chaque utilisateur (exemple : sdeon) en créant un fichier de credentials
spécifique ; il faut aussi prendre un port différent (c’est le port 5000 qui est choisi pour les autres
utilisateurs).
Le service Glance est installé sur le Controller node et les images sont installées sur un répertoire local ; il
est possible d’utiliser un serveur spécifique à Glance ainsi qu’un SAN pour stocker les images.
$ mysql -u root -p
MariaDB [(none)]> CREATE DATABASE glance;
MariaDB [(none)]> GRANT ALL PRIVILEGES ON glance.* TO
'glanceUser'@ 'localhost' IDENTIFIED BY 'GlancePass';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON glance.* TO
'glanceUser'@ '%' IDENTIFIED BY 'glandPass';
MariaDB [(none)]> exit;
Au cas où elles ne sont plus présentes (par exemple, déconnexion de session shell, utilisation d’un autre
utilisateur...), il faut sourcer à nouveau le fichier admin_creds.
$ source ~/admin_creds
+ ----------+----------------------------------+
| Property | Value |
+ ----------+----------------------------------+
| email | |
| enabled | True |
| id | 83cc34ee30cf47aebbfb386c3622d9c3 |
| name | glanceUser |
| username | glanceUser |
+ ----------+----------------------------------+
Il est possible de vérifier le résultat de cette commande dans la table MySQL keystone en vérifiant le
contenu de la table user :
# mysql -u root -p
> use keystone
> select * from user;
| id | 39e9c7f319ff4a3abd825c38597dbe10 |
| name | glance |
| type | image |
+-------------+----------------------------------+
Un port spécifique est utilisé (différent de celui utilisé par keystone) : 9292.
--role admin
h. Paramétrage de Glance
Fichier glance-api.conf
[default]
default_store = file
[database]
connection = mysql://glanceUser:glancePass@srv-openstack-
controller/glance
[keystone_authtoken]
auth_uri = http://srv-openstack-controller:5000/v2.0
identity_uri = http://srv-openstack-controller:35357
admin_tenant_name = service
admin_user = glanceUser
admin_password = glancePass
[paste_deploy]
flavor = keystone
[glance_store]
filesystem_store_datadir = /var/lib/glance/images
Fichier glance-registry.conf
Treize tables sont créées dans la base glance dont la table images qui va contenir
les informations liées aux images chargées dans glance.
k. Upload d’images
Une fois le service glance en état de fonctionnement, il est temps de s’occuper du chargement des
images. Pour cela, deux images seront utilisées :
ˇ
Cirros : c’est une petite distribution Linux (communautaire) faite pour le cloud mais pas
vraiment pour la production.
ˇ
Fedora : c’est une distribution Linux (communautaire) faite pour les environnements de poste
de travail mais aussi pour des serveurs.
# mkdir /root/images
# cd /root/images
Upload de Cirros
# wget http://download.cirros-cloud.net/0.3.3/cirros-0.3.3-
x86_64-disk.img
# source ~/admin_creds
Afin de tester le bon fonctionnement du service Glance, il faut uploader l’image dans le service glance en
utilisant la commande glance image-create:
ˇ
--name : il s’agit du nom visible de l’image.
ˇ
--container-format: il s’agit du format du container de l’image (ici bare).
ˇ
--disk-format: il s’agit du format du disque (ici qcow2).
ˇ
--file : il s’agit de l’emplacement de l’image.
À ce stade, il est nécessaire de vérifier que l’image est disponible à travers le service glance avec la
commande glance image-list:
$ cd /var/lib/glance/images
$ ll
total 12892
-rw-r-----. 1 glance glance 13200896 14 févr. 21:27 2cddb75f-
d3f-4cfb-b09f-7e75a0033115
$ wget
http://download.fedoraproject.org/pub/fedora/linux/releases/21/
Cloud/Images/x86_64/Fedora-Cloud-Base-20141203-21.x86_64.qcow2
L’exécution de la commande glance image-listpermet de lister les images qui sont disponibles
dans OpenStack.
$ glance image-list
+ --------------------------------------+---------------------+----
---------------------------+-----------+--------+
| ID | Name |
Le service Nova compute est un composant majeur d’OpenStack permettant d’instancier des machines
virtuelles à partir d’images.
nova-api-metadata API
nova-compute Compute Création des instances via les API des Compute
hyperviseurs (libvirt pour KVM et QEMU,
VMare API pour VMware...)
nova-novncproxy Console Gestion des accès via une connection VNC Controller
(Virtual Network Computing)
a. Gestion de la base de données, des credentials et des API endpoints sur le serveur
Controller
Différentes étapes d’installation et de paramétrage des composants Nova sont nécessaires sur le
Controller node.
$ mysql -u root -p
MariaDB [(none)]> CREATE DATABASE nova;
GRANT ALL PRIVILEGES ON nova.* TO 'novaUser'@ 'localhost'
IDENTIFIED BY 'novaPass';
GRANT ALL PRIVILEGES ON nova.* TO 'novaUser'@ '%' IDENTIFIED BY
'novaPass';
QUIT;
Au cas où les variables d’environnement ne seraient pas positionnées, il faut sourcer le fichier
admin_creds.
$ source ~/admin_creds.sh
+ ----------+----------------------------------+
| Property | Value |
+ ----------+----------------------------------+
| email | |
| enabled | True |
| id | 2015aa4e7a0a4319a0674d1b42ac0f03 |
| name | novaUser |
| username | novaUser |
+ ----------+----------------------------------+
Une fois la partie base de données et credentials installée, il faut procéder à l’installation des paquets
nova sur le Controller node.
L’adaptation du fichier nova.conf permet notamment la connexion avec RabbitMQ et avec la base MySQL
nova, ainsi que la connexion à Glance.
[database]
connection = mysql://novaUser:novaPass@srv-openstack-controller/nova
# Si la section n'existe pas, il faut la créer. Remplacer NOVA_DBPASS
# par le vrai mot de passe
[DEFAULT]
verbose = True
auth_strategy = keystone
my_ip = 10.0.0.11
vncserver_listen = 10.0.0.11
vncserver_proxyclient_address = 10.0.0.11
[keystone_authtoken]
auth_uri = http://srv-openstack-controller:5000/v2.0
identity_uri = http://srv-openstack-controller:35357
admin_tenant_name = service
admin_user = novaUser
admin_password = novaPass
# Remplacer novaPass par le vrai mot de passe
[glance]
host = srv-openstack-controller
/usr/bin/nova-conductor
root 9854 7510 0 00:31 pts/1 00:00:00 grep --color=auto nova
Sur srv-openstack-compute (et sur tous les nœuds dédiés au compute), il est nécessaire d’installer le
service Nova. En effet, l’action de compute (création des instances) est effectuée sur le Compute node.
L’accès au Controller node est nécessaire afin de vérifier les credentials et stocker les informations sur les
instances dans la table MySQL nova.
Installation préalable
Lancez les commandes décrites dans les sections Paquets OpenStack (repo yum), Mise à jour du système
(yum upgrade) et Intallation de SELinux (selinux).
[DEFAULT]
...
rpc_backend = rabbit
rabbit_host = srv-openstack-controller
rabbit_password = RABBIT_PASS
[DEFAULT]
#my_ip = adresse IP du management
my_ip = 10.0.0.31
verbose = True
vnc_enabled = True
vncserver_listen = 0.0.0.0
vncserver_proxyclient_address = 10.0.0.31
novncproxy_base_url = http://srv-openstack-
controller:6080/vnc_auto.html
auth_strategy = keystone
[keystone_authtoken]
auth_uri = http://srv-openstack-controller:5000/v2.0
identity_uri = http://srv-openstack-controller:35357
admin_tenant_name = service
admin_user = novaUser
admin_password = novaPass
# Remplacer novaPass par le vrai mot de passe
[glance]
...
host = srv-openstack-controller
Dans le cas d’un host ne supportant pas l’accélération hardware, il faut modifier le champ virt_type et
choisir qemu.
[libvirt]
virt_type = qemu
Dans le cas où l’accélération hardware est possible, il ne faut pas modifier ce fichier.
$ source ~/admin_creds.sh
ˇ
Affichage de la liste des VM :
Il s’agit des VM instanciées avec leur statut (active, error, poweroff, ...) :
$ nova list
+ ----+------+--------+------------+-------------+----------+
| ID | Name | Status | Task State | Power State | Networks |
+ ----+------+--------+------------+-------------+----------+
+ ----+------+--------+------------+-------------+----------+
ˇ
Affichage de la liste des services :
$ nova service-list
+ ----+------------------+--------------------------+----------+--
------- -------+----------------------------+-----------------+
| Id | Binary | Host | Zone |
Status | State | Updated_at | Disabled Reason |
+ ----+------------------+--------------------------+----------+--
-------+-------+----------------------------+-----------------+
| 1 | nova-consoleauth | srv-openstack-controller | internal |
enabled | up | 2015-02-15T19:06:51.000000 | - |
| 2 | nova-cert | srv-openstack-controller | internal |
enabled | up | 2015-02-15T19:06:51.000000 | - |
| 3 | nova-scheduler | srv-openstack-controller | internal |
enabled | up | 2015-02-15T19:06:51.000000 | - |
| 4 | nova-conductor | srv-openstack-controller | internal |
enabled | up | 2015-02-15T19:06:51.000000 | - |
| 5 | nova-compute | srv-openstack-compute | nova |
enabled | up | 2015-02-15T19:06:53.000000 | - |
+ ----+------------------+--------------------------+----------+--
-------+-------+----------------------------+-----------------+
ˇ
Affichage de la liste des images :
$ nova image-list
+ --------------------------------------+---------------------+---
-----+--------+
| ID | Name |
Status | Server |
+ --------------------------------------+---------------------+---
-----+--------+
| ae83804d-5e9e-487e-806b-1b0f5851900e | Fedora21_x86_64 |
ACTIVE | |
| 2cddb75f-5d3f-4cfb-b09f-7e75a0033115 | cirros-0.3.3-x86_64 |
ACTIVE | |
+ --------------------------------------+---------------------+---
-----+--------+
ˇ
Affichage de la liste des flavors :
$ nova flavor-list
+----+-----------+-----------+------+-----------+------+-------+-
-----------------------+
| ID | Name | Memory_MB | Disk | Ephemeral | Swap | VCPUs |
RXTX_Factor | Is_Public |
+----+-----------+----------+------+-----------+------+-------+-
------------+----------+
| 1 | m1.tiny | 512 |1 |0 | |1 |
1.0 | True |
| 2 | m1.small | 2048 | 20 | 0 | |1 |
1.0 | True |
| 3 | m1.medium | 4096 | 40 | 0 | |2 |
1.0 | True |
| 4 | m1.large | 8192 | 80 | 0 | |4 |
1.0 | True |
| 5 | m1.xlarge | 16384 | 160 | 0 | |8 |
1.0 | True |
+----+-----------+-----------+------+-----------+------+-------+--
+-----------+
a. Introduction
Neutron est une des briques les plus délicates à installer et paramétrer dans la galaxie des services
OpenStack. Ce service peut être installé de deux façons :
ˇ
En mode legacy (composant nova-network) : ce mode implique la configuration du réseau sur
le contrôleur et sur les hosts de compute. Il n’y a pas de Network node. Ce mode est réservé à
des installations simples avec des possibilités d’utiliser des bridges, des VLAN et du firewalling
avec iptables.
ˇ
En mode OpenStack Networking (composant Neutron) : ce mode est géré sur un host dédié, le
Network node. Il permet de disposer de nombreuses fonctionnalités de réseau et des plug-ins
de matériels de réseau. Ce composant s’appelait Quantum dans les distributions précédentes
(jusqu’à la version Grizzly).
$ mysql -u root -p
MariaDB [(none)]> CREATE DATABASE neutron;
MariaDB [(none)]> GRANT ALL PRIVILEGES ON neutron.* TO
'neutronUser'@ 'localhost' IDENTIFIED BY 'neutronPass';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON neutron.* TO
'neutronUser'@ '%' IDENTIFIED BY 'neutronPass';
MariaDB [(none)]> EXIT;
$ source ~/admin_creds.sh
[DEFAULT]
...
Verbose = True
rpc_backend = rabbit
rabbit_host = srv-openstack-controller
rabbit_password = RABBIT_PASS
auth_strategy = keystone
core_plugin = ml2
service_plugins = router
allow_overlapping_ips = True
nova_region_name = regionOne
nova_admin_username = novaUser
nova_admin_tenant_id = SERVICE_TENANT_ID
nova_admin_password = novaPass
[keystone_authtoken]
...
auth_uri = http://srv-openstack-controller:5000/v2.0
identity_uri = http://srv-openstack-controller:35357
admin_tenant_name = service
admin_user = neutronUser
admin_password = neutronPass
[database]
...
connection = mysql://neutronUser:neutronPass@srv-openstack-
controller/neutron
[ml2]
...
type_drivers = flat,gre
# GRE = generic routing encapsulation
tenant_network_types = gre
mechanism_drivers = openvswitch
[ml2_type_gre]
...
tunnel_id_ranges = 1 :1000
[securitygroup]
...
enable_security_group = True
enable_ipset = True
firewall_driver = neutron.agent.linux.iptables_firewall.
OVSHybridIptablesFirewallDriver
Le plug-in ML2 nécessite la description du type_drivers (ici, c’est flat et gre qui
sont utilisés), qui permet de préciser le type de driver à utiliser et du type
mechanism_drivers (ici, c’est le switch virtuel Open vSwitch qui est utilisé) qui
permet d’effectuer le lien avec les matériels réseau.
Toujours sur le Controller node, il faut modifier le fichier /etc/nova/nova.conf pour configurer la gestion du
compute avec le networking :
[DEFAULT]
...
network_api_class = nova.network.neutronv2.api.API
security_group_api = neutron
linuxnet_interface_driver =
nova.network.linux_net.LinuxOVSInterfaceDriver
firewall_driver = nova.virt.firewall.NoopFirewallDriver
[neutron]
...
url = http://srv-openstack-controller:9696
auth_strategy = keystone
admin_auth_url = http://srv-openstack-controller:35357/v2.0
admin_tenant_name = service
admin_username = neutronUser
admin_password = neutronPass
Modifications post-installation
Différentes opérations sont nécessaires pour finaliser l’installation de Neutron sur le Controller node :
ˇ
Ajout d’un lien symbolique du chemin de ml2_conf.ini et de /etc/neutron/plugin.ini.
# ln -s /etc/neutron/plugins/ml2/ml2_conf.ini
/etc/neutron/plugin.ini
ˇ
Peuplement de la base Neutron dans MySQL (commande neutron-db-manage) permettant
la création des tables MySQL de la base Neutron sur le Controller node.
ˇ
Redémarrage des services nova*.
ˇ
Démarrage du service neutron-server.
$ source ~/admin_creds.sh
Si l’installation s’est bien déroulée, la commande neutron ext-listpermet d’afficher tous les
composants Neutron installés sur le Compute node.
$ neutron ext-list
+ -----------------------+-----------------------------------------------+
| alias | name |
+ -----------------------+-----------------------------------------------+
| security-group | security-group |
| l3_agent_scheduler | L3 Agent Scheduler |
| ext-gw-mode | Neutron L3 Configurable external gateway mode |
| binding | Port Binding |
| provider | Provider Network |
| agent | agent |
| quotas | Quota management support |
| dhcp_agent_scheduler | DHCP Agent Scheduler |
| l3-ha | HA Router extension |
| multi-provider | Multi Provider Network |
| external-net | Neutron external network |
| router | Neutron L3 Router |
| allowed-address-pairs | Allowed Address Pairs |
| extraroute | Neutron Extra Route |
| extra_dhcp_opt | Neutron Extra DHCP opts |
| dvr | Distributed Virtual Router |
+ ---------------------+-------------------------------------------------+
Le Network node assure le routage entre les subnets internes et les subnets externes mais également
assure un service de DHCP.
net.ipv4.ip_forward=1
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.default.rp_filter=0
Pour valider les modifications, il faut lancer la commande suivante (l’option -p de la commande sysctl
permet de lire les valeurs du fichier) :
# sysctl -p
net.ipv4.ip_forward = 1
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0
Si les paquets ne s’installent pas, il faut vérifier que le serveur dispose bien des
paquets yum-plugin-priorities, epel-release et rd-release-juno (voir la section
Paquets OpenStack de ce chapitre).
[DEFAULT]
...
verbose = True
rpc_backend = rabbit
rabbit_host = srv-openstack-controller
rabbit_password = RABBIT_PASS
auth_strategy = keystone
core_plugin = ml2
service_plugins = router
allow_overlapping_ips = True
[keystone_authtoken]
...
auth_uri = http://srv-openstack-controller:5000/v2.0
identity_uri = http://srv-openstack-controller:35357
admin_tenant_name = service
admin_user = neutronUser
admin_password = NEUTRON_PASS
[database]
# laisser en commentaire la connexion mysql
# connection = mysql://root:[email protected]:3306/neutron
[ml2]
...
type_drivers = flat,gre
tenant_network_types = gre
mechanism_drivers = openvswitch
[ml2_type_flat]
...
flat_networks = external
[ml2_type_gre]
...
tunnel_id_ranges = 1 :1000
[securitygroup]
...
enable_security_group = True
enable_ipset = True
firewall_driver = neutron.agent.linux.iptables_firewall.
OVSHybridIptablesFirewallDriver
[ovs]
...
# local_ip = INSTANCE_TUNNELS_INTERFACE_IP_ADDRESS
local_ip = 10.0.1.21
enable_tunneling = True
bridge_mappings = external:br-ex
[agent]
...
tunnel_types = gre
b. Configuration de l’agent L3
L’agent L3 (Layer-3) fournit des services de routage et de NAT pour les réseaux virtuels créés dans
OpenStack. L3 est un composant de la logique Neutron et intervient au niveau de la couche 3 (couche
réseau, routage des données) du modèle OSI (Open Systems Interconnection).
[DEFAULT]
...
verbose = True
interface_driver =
neutron.agent.linux.interface.OVSInterfaceDriver
use_namespaces = True
external_network_bridge = br-ex
L’agent DHCP (Dynamic Host Configuration Protocol) permet de disposer de services DHCP pour les
réseaux virtuels.
[DEFAULT]
...
verbose = True
interface_driver =
neutron.agent.linux.interface.OVSInterfaceDriver
dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq
use_namespaces = True
dnsmasq_config_file = /etc/neutron/dnsmasq-neutron.conf
L’agent metadata fournit des informations de configuration aux machines virtuelles (exemple : les
credentials qui sont fournis par le contrôleur).
[DEFAULT]
...
verbose = True
auth_url = http://srv-openstack-controller:5000/v2.0
auth_region = regionOne
admin_tenant_name = service
admin_user = neutronUser
admin_password = neutronPass
nova_metadata_ip = srv-openstack-controller
metadata_proxy_shared_secret = METADATA_SECRET
[neutron]
...
service_metadata_proxy = True
metadata_proxy_shared_secret = METADATA_SECRET
e. Post-installation de Neutron
commandes suivantes :
Ici, eth0 est l’interface connectée sur le réseau physique externe (accès Internet).
L’accès via SSH (putty) sur le serveur network via l’interface externe sera coupé !
Pour le rétablir, il faut supprimer le bridge externe (commande ovs-vsctl del-
br br-ex).
f. Finalisation de l’installation
Il faut terminer avec différentes opérations (lien symbolique, résolution d’un bug dans Juno et démarrage
des services Neutron comme l’agent Open vSwitch, l’agent L3, l’agent DHCP et l’agent metadata).
# ln -s /etc/neutron/plugins/ml2/ml2_conf.ini
/etc/neutron/plugin.ini
# cp /usr/lib/systemd/system/neutron-openvswitch-agent.service /usr/lib/systemd/system/neutron-openvswitch-agent.service.or
# sed -i
's,plugins/openvswitch/ovs_neutron_plugin.ini,plugin.ini,g'
/usr/lib/systemd/system/neutron-openvswitch-agent.service
$ source ~/admin_creds.sh
$ neutron agent-list
+ --------------------------------------+------------------+----
------------------------+-------+----------------+-------------
-------+
| id | agent_type |
host | alive | admin_state_up | binary
|
+ --------------------------------------+------------------+----
-----------------------+-------+----------------+--------------
-------+
Enfin, après avoir procédé à l’installation de Neutron sur le Controller node et sur le Network node, il est
nécessaire de configurer la partie Neutron sur le Compute node (et sur chaque autre serveur de compute).
Prérequis
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.default.rp_filter=0
Installation de Neutron
Configuration de Neutron
[DEFAULT]
...
Verbose = True
rpc_backend = rabbit
rabbit_host = srv-openstack-controller
rabbit_password = RABBIT_PASS
auth_strategy = keystone
[keystone_authtoken]
auth_uri = http://srv-openstack-controller:5000/v2.0
identity_uri = http://srv-openstack-controller:35357
admin_tenant_name = service
admin_user = neutronUser
admin_password = neutronPass
core_plugin = ml2
service_plugins = router
allow_overlapping_ips = True
[ml2]
...
type_drivers = flat,gre
tenant_network_types = gre
mechanism_drivers = openvswitch
[ml2_type_gre]
...
tunnel_id_ranges = 1 :1000
[securitygroup]
...
enable_security_group = True
enable_ipset = True
firewall_driver =
neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver
[ovs]
...
#local_ip = INSTANCE_TUNNELS_INTERFACE_IP_ADDRESS
local_ip = 10.0.1.31
enable_tunneling = True
[agent]
...
tunnel_types = gre
Configuration de Nova
[DEFAULT]
...
network_api_class = nova.network.neutronv2.api.API
security_group_api = neutron
linuxnet_interface_driver = nova.network.linux_net.
LinuxOVSInterfaceDriver
# Désactivation du service de firewal interne du compute
firewall_driver = nova.virt.firewall.NoopFirewallDriver
[neutron]
...
url = http://srv-openstack-controller:9696
auth_strategy = keystone
admin_auth_url = http://srv-openstack-controller:35357/v2.0
admin_tenant_name = service
admin_username = neutronUser
admin_password = neutronPass
Opérations post-installation
# ln -s /etc/neutron/plugins/ml2/ml2_conf.ini
/etc/neutron/plugin.ini
# cp /usr/lib/systemd/system/neutron-openvswitch-agent.service
/usr/lib/systemd/system/neutron-openvswitch-agent.service.orig
# sed -i
's,plugins/openvswitch/ovs_neutron_plugin.ini,plugin.ini,g'
/usr/lib/systemd/system/neutron-openvswitch-agent.service
# source ~/admin_creds
$ neutron agent-list
...
d1134e1e-dbba-422f -90b5-ce477daeb193 | Open vSwitch agent | srv-
openstack-compute | :-) | True | neutron-openvswitch-agent
Il faut bien s’assurer de la présence d’une nouvelle ligne concernant l’agent OVS installé sur le serveur de
compute.
a. Schéma de fonctionnement
$ source ~/admin_creds.sh
$ neutron net-create ext-net --router:external True
--provider:physical_network external --provider:network_type flat
Created a new network:
+ ---------------------------+-------------------------------------+
| Field | Value
+ ---------------------------+-------------------------------------+
| admin_state_up | True
| id | 8935ce5f-2011-4f8d-8586-4bbd1ff98a2f
| name | ext-net
| provider:network_type | flat
| provider:physical_network | external
| provider:segmentation_id |
| router:external | True
| shared | False
| status | ACTIVE
| subnets |
| tenant_id | 4864d3fff7f445d696e52aa77f728734
+ ---------------------------+----------------------------------+
On affecte ici le subnet 192.168.0.0/24 sur le réseau ext-net et le pool d’IP flottante va de 192.168.0.100 à
192.168.0.200. La gateway du subnet est 192.168.0.254. Ces IP sont privées mais, en production, il faut
utiliser un subnet d’IP publiques, celui attribué par le FAI de la ligne Internet. Cela signifie qu’une IP
publique sera attribuée de façon statique (disable-dhcp) à chaque VM produite.
+ -------------------+--------------------------------------------+
| Field | Value |
+ -------------------+--------------------------------------------+
| allocation_pools | {"start": "10.5.1.2", "end": "10.5.1.254"} |
| cidr | 10.5.1.0/ 24 |
| dns_nameservers | |
| enable_dhcp | True |
| gateway_ip | 10.5.1.1 |
| host_routes | |
| id | 25779013-fcdd-44e8-b04c-13b5a4ccab35 |
| ip_version |4 |
| ipv6_address_mode | |
| ipv6_ra_mode | |
| name | int-subnet |
| network_id | 5 ed881ff-77fe-4276-9c8b-b9fb0657d5d4 |
| tenant_id | 4864d3fff7f445d696e52aa77f728734 |
+ -------------------+--------------------------------------------+
Les VM peuvent obtenir une IP privée via DHCP, qui est activé par défaut.
Le routeur virtuel effectue le routage de paquets entre le réseau externe et le réseau interne.
| routes | |
| status | ACTIVE |
| tenant_id | 4864d3fff7f445d696e52aa77f728734 |
+ -----------------------+--------------------------------------+
i. Vérification réseau
$ neutron net-list
+ --------------------------------------+---------+--------------+
| id | name | subnets |
+ --------------------------------------+---------+--------------+
| 5ed881ff-77fe-4276-9c8b-b9fb0657d5d4 | int-net | 25779013-fcdd-
44e8-b04c-13b5a4ccab35 10.5.1.0/24 |
| 8935ce5f-2011-4f8d-8586-4bbd1ff98a2f | ext-net | 53063f06-900f-
4994-a520-e3d205c9bb31 192.168.0.0/24 |
+ --------------------------------------+---------+--------------+
Horizon est le composant permettant, via une interface web, d’administrer la plate-forme de cloud
computing (provisionner des VM, stopper des VM, charger des images, ...), tant du point de vue
administrateur qu’utilisateur, dans un projet (client).
Prérequis
Pour être totalement opérationnel, Horizon a besoin de disposer des éléments suivants :
ˇ
Les trois serveurs (a minima) :
ˇ
Le serveur Controller node.
ˇ
Le server Network node.
ˇ
Le serveur Compute node.
ˇ
Un serveur web Apache, installé sur le Controller node.
ˇ
Un service d’indentité Keystone sur le Controller node.
ˇ
Le middleware Python 2.6 ou 2.7 (support de Django) sur le Controller node.
ˇ
Un accès Web via un browser supportant HTML5, et l’activation des cookies et de JavaScript.
a. Installation et configuration
Configuration
OPENSTACK_HOST = "srv-openstack-controller"
ALLOWED_HOSTS = '*'
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': '127.0.0.1:11211',
}
}
TIME_ZONE = "UTC"
Il faut bien faire attention à ne pas laisser de caractère blanc avant le mot-clé
CACHES, sinon l’accès au dashboard provoquera une erreur du type Internal error.
Les erreurs sont visibles dans le fichier /var/log/httpd/error.log mais ne sont pas
très explicites.
Opérations post-installation
Autoriser SELinux pour que le serveur web se connecte aux services OpenStack.
# setsebool -P httpd_can_network_connect on
Modification de droits
b. Lancement du dashboard
http://srv-openstack-controller/dashboard
Le login est admin et le mot de passe est celui affecté à l’utilisateur admin dans les étapes d’installation
de Keystone.
Interface Horizon