Installation d’un cluster multi-noeuds OpenStack Victoria sur des serveurs dédiés avec le backend Ceph

Merouane Agar
14 min readFeb 24, 2021

RDO offre la possibilité de créer un cluster multi-noeuds OpenStack avec packstack

Packstack fournit un déploiement OpenStack à un ou plusieurs nœuds qui peut s’exécuter directement sur votre poste de travail.

Architecture cible

3 x Serveurs dédiés kimsufi KS-6 :

  • CPU : Intel i5–750 4c/4t 2,67GHz
  • RAM : 16Go DDR3 1333 MHz
  • 1x NIC: 100 Mbps
  • 1x Disc : 2To hdd

Système d’exploitation : CentOS Linux release 8.3.2011

openstack multi-node single nic

Provisionner 3 serveurs dédiés (CPU 4c/4t, RAM 16G , Disc 2T, 1xNic) avec Centos 8

Repartions du disque

  • 100 Go => /
  • 4 Go => swap
  • 1,7 To vide

Objectif :

Installer un Cluster OpenStack Multi-node (1 collector et 2 computer)

Créer un bridge local sur br-ex

Installer un Cluster Ceph sur l’espace disque restant

Configurer Openstack pour utiliser Ceph

Installer OpenStack

1. Préparation

  • Activer le repo powertools, et installer les dépendances. (Tous les nodes)
[root@all] dnf config-manager --enable powertools
[root@all] dnf install -y \
centos-release-openstack-victoria \
bash-completion \
iptables \
network-scripts \
net-tools \
bind-utils \
iptables-services \
git sudo vim tree wget
[root@all] dnf update -y
  • Désactiver NetworkManager et activer network
[root@all] systemctl stop NetworkManager
[root@all] systemctl disable NetworkManager
[root@all] systemctl start network.service
[root@all] systemctl enable network.service
  • Désactiver firewalld et activer iptables
[root@all] systemctl stop  firewalld.service
[root@all] systemctl disable firewalld.service
[root@all] systemctl start iptables.service
[root@all] systemctl enable iptables.service
  • Fixer le hostname et le fqdn avec l’ip pubilque dans l’ /etc/hosts (ex: openstack)
[root@openstack] HOSTNAME=openstack
[root@openstack] hostnamectl set-hostname ${HOSTNAME}.mandem-it.com
[root@openstack] echo "$(hostname -i) $(hostname) $(hostname -s)" >> /etc/hosts
  • Générer une clé ssh sur le controller node (ex: openstack)
[root@openstack ~]# ssh-keygen
enerating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
....
[root@openstack ~]# cat .ssh/id_rsa.pub >> .ssh/authorized_key
[root@openstack ~]# chmod 600 .ssh/authorized_keys
  • Ajouter les empreintes digitale SSH distante (fingerprint) à la machine locale
[root@openstack ~]# ssh-keyscan openstack 91.121.85.XX 91.121.184.XX 91.121.222.XXX > ~/.ssh/known_host[root@openstack ~]# tree .ssh/
.ssh/
├── authorized_keys
├── id_rsa
├── id_rsa.pub
└── known_hosts
  • Copier le répertoire ~root/.ssh sur les autre nodes
[root@openstack ~]#  for host in 91.121.184.XX 91.121.222.XXX; do
tar cf - ~root/.ssh | ssh $host "cd /; tar xf -"
done

2. Installation d’Openstack

  • Installer openstack-packstack
[root@openstack] dnf install -y openstack-packstack bridge-utils
  • Générer le fichier de réponse openstack-answer.txt
[root@openstack ~]# packstack --gen-answer-file /root/openstack-answer.txt
  • Modifier le openstack-answer.txt pour activé les services optionnel et surtout ajouté les autre nodes dans le CONFIG_COMPUTE_HOSTS
[root@openstack ~]# vi /root/openstack-answer.txt
..............
CONFIG_MANILA_INSTALL=y
CONFIG_SAHARA_INSTALL=y
CONFIG_MAGNUM_INSTALL=y
CONFIG_TROVE_INSTALL=y
CONFIG_HEAT_INSTALL=y
CONFIG_COMPUTE_HOSTS=91.121.85.XX,91.121.184.XX,91.121.222.XXX
CONFIG_PROVISION_DEMO=n
CONFIG_KEYSTONE_ADMIN_PW=P@ssw0rd
..............
  • Démarrer l’installation (time ~ 45 min)
[root@openstack ~]# packstack --answer-file /root/openstack-answer.txt

http://openstack/dashboard/

[root@openstack ~]# source keystonerc_admin
[root@openstack ~(keystone_admin)]# openstack service list
+----------------------------------+------------+-----------------+
| ID | Name | Type |
+----------------------------------+------------+-----------------+
| 11185b34436b48879dcc3705cb04128a | cinderv2 | volumev2 |
| 16fb460d7b924e328c2612e1437b8c04 | nova | compute |
| 22781e559c9f4fe8adeec149c2b93ca8 | trove | database |
| 289d45934b024f4797dbce83f754f7ea | heat-cfn | cloudformation |
| 32d97f98a26145e183195a12dce50866 | sahara | data-processing |
| 556ed149449c4b379edec7cc33e37e63 | gnocchi | metric |
| 5b85b6a627424b84923e9c5ca9731089 | neutron | network |
| 5c1cdd1b9743420789edca2f0037bef0 | manila | share |
| 6174f11c326145a3bbcf719005ef7118 | cinderv3 | volumev3 |
| 7f0410199ec146e0933f95af6a17abbb | aodh | alarming |
| 897c53cec88b4b90aea98d059ec32e67 | swift | object-store |
| 90227da7d6d749ff8c1061b481207305 | ceilometer | metering |
| b2650293e2f247d89c790250e6ec10fa | keystone | identity |
| d47d549bd71a460ebfdc187c360b86da | glance | image |
| de7edf32682547fca0a92ea00776aa68 | heat | orchestration |
| e6b8aca5ed4e41d9bdb0252e9bff9337 | manilav2 | sharev2 |
| f1311133592d43aab13682f39c59a803 | magnum | container-infra |
| f94154fa9ae041e7a993fa1f60c0fd4b | placement | placement |
+----------------------------------+------------+-----------------+

[root@openstack ~(keystone_admin)]# openstack hypervisor list
+----+-------------------------+-----------------+----------------+-
| ID | Hypervisor Hostname | Hypervisor Type | Host IP |
+----+-------------------------+-----------------+----------------+-
| 1 | openstack | QEMU | 91.121.85.XX |
| 2 | nova1 | QEMU | 91.121.184.XX |
| 3 | nova2 | QEMU | 91.121.222.XXX |
+----+-------------------------+-----------------+----------------+-

3. Configurer le réseau externe

Le but maintenant et de créer un Bridge vrbt0 sur le réseau externe d’Openstack vue qu’on possède d’une seul IP public et une seul interface.

[root@openstack ~]# ovs-vsctl show
9cf7fbaf-5e8a-4247-978c-18610e6ef4a2
Manager "ptcp:6640:127.0.0.1"
is_connected: true
Bridge br-ex
Port br-ex
Interface br-ex
type: internal
Bridge br-int
fail_mode: secure
Port ovn-5ced38-0
Interface ovn-5ced38-0
type: geneve
options: {csum="true", key=flow, remote_ip="91.121.222.119"}
Port tap275fb4f8-94
Interface tap275fb4f8-94
type: internal
Port br-int
Interface br-int
type: internal
Port ovn-5042aa-0
Interface ovn-5042aa-0
type: geneve
options: {csum="true", key=flow, remote_ip="91.121.184.81"}
ovs_version: "2.13.2"
[root@openstack ~]# ip a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
...
2: enp4s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:30:48:df:3b:dc brd ff:ff:ff:ff:ff:ff
inet 91.121.xx.xx/24 brd 91.121.xx.255 scope global dynamic enp4s0
...
3: ovs-system: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether ce:9f:dd:8e:e1:5a brd ff:ff:ff:ff:ff:ff
4: br-ex: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
link/ether 9e:70:40:9b:29:4e brd ff:ff:ff:ff:ff:ff
inet6 fe80::f4c7:2cff:fed4:294d/64 scope link
valid_lft forever preferred_lft forever
6: br-int: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether f2:64:29:9c:a8:c9 brd ff:ff:ff:ff:ff:ff
8: tap6d1143e1-21: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
link/ether fa:16:3e:a5:a1:23 brd ff:ff:ff:ff:ff:ff
inet6 fe80::f816:3eff:fea5:a123/64 scope link
valid_lft forever preferred_lft forever
9: genev_sys_6081: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 65000 qdisc noqueue master ovs-system state UNKNOWN group default qlen 1000
link/ether ae:f1:d1:c6:9a:c4 brd ff:ff:ff:ff:ff:ff
inet6 fe80::acf1:d1ff:fec6:9ac4/64 scope link
valid_lft forever preferred_lft forever
  • Créer le bridge vbr0 avec l’IP 192.168.60.10/24 sur le bridge br-ex d’openvswith
[root@openstack ~] cat > /etc/sysconfig/network-scripts/ifcfg-br-ex << EOF
DEVICE=br-ex
DEVICETYPE=ovs
TYPE=OVSBridge
BOOTPROTO=static
IPADDR=”192.168.60.10"
NETMASK=”255.255.255.0"
DNS1=8.8.8.8
ONBOOT=”yes”
EOF
[root@openstack ~] cat > /etc/sysconfig/network-scripts/ifcfg-vbr0 << EOF
DEVICE=vbr0
DEVICETYPE=ovs
TYPE=OVSPort
OVS_BRIDGE=br-ex
ONBOOT=yes
BONDING_MASTER=yes
BONDING_OPTS="mode=802.3ad"
EOF
  • Redémarrer le network
[root@openstack ~] systemctl restart network
  • Vérification
[root@openstack ~] ovs-vsctl list-ports br-ex
vbr0
[root@openstack ~]# ip a s br-ex
4: br-ex: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
link/ether 9e:70:40:9b:29:4e brd ff:ff:ff:ff:ff:ff
inet 192.168.60.10/24 brd 192.168.60.255 scope global br-ex
valid_lft forever preferred_lft forever
inet6 fe80::9c70:40ff:fe9b:294e/64 scope link
valid_lft forever preferred_lft forever
  • Ajouter les règles iptables suivante:
[root@openstack ~]# iptables -t nat -A POSTROUTING -s 192.168.60.0/24 -o enp4s0 -j MASQUERADE[root ~]# iptables-save > /etc/sysconfig/iptables
[root@openstack ~]# vi /etc/sysconfig/iptables
...
...
*filter
.
.
.
-A FORWARD -d 192.168.60.0/24 -j ACCEPT
-A FORWARD -s 192.168.60.0/24 -j ACCEPT

-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
  • Recharger le iptables
[root@openstack ~]# systemctl restart iptables.service
  • Activer l’IP forwarding
[root@openstack ~]# echo "net.ipv4.ip_forward = 1" |  tee -a /etc/sysctl.conf
[root ~]# sysctl -p
  • Créer le réseau externe avec le subnet 192.168.60.0/24 et la gateway 192.168.60.10
[root@openstack ~]# source keystonerc_admin
[root ~(keystone_admin)]# neutron net-create external_network \
--provider:network_type flat \
--provider:physical_network extnet \
--router:external

[root ~(keystone_admin)]# neutron subnet-create \
--name public_subnet \
--enable_dhcp=False \
--allocation-pool=start=192.168.60.100,end=192.168.60.200 \
--gateway=192.168.60.10 external_network 192.168.60.0/24

4. Tester

  • Créer un réseaux privé Ex : 10.10.0.0/24
neutron net-create private
neutron subnet-create --name private-subnet private 10.10.0.0/24
  • Créer un router et l’attacher dur les deux réseaux
neutron router-create admin-router
neutron router-gateway-set admin-router external_network
neutron router-interface-add admin-router private-subnet
  • Télécharger la dernière image cirros sur glance
[root ~]# curl -L http://download.cirros-cloud.net/0.5.1/cirros-0.5.1-x86_64-disk.img | glance image-create --name='cirros-0.5.1' --visibility=public --container-format=bare --disk-format=qcow2
  • Publier votre clé publique dans Openstack
[root ~]# openstack keypair create --public-key ~/.ssh/id_rsa.pub mykey

Résultat

  • Ajouter l’icmp et le ssh dans la Security Group par default
  • Créer 3 instances cirros
  • Sectionner l’image cirros et ne pas créer de volume
  • Choisir un modèle de VM
  • Et enfin choisir le réseau privé et lancer les instances
  • Associer une Floating IP a chaque instance

Vérifier que les instances tourne sur des 3 hyperviseur (Admin>Compute>Instances)

Vue du réseau

  • Connecter vous sur les VMs et vérifier votre connexion a internet
[root~(keystone_admin)]# ssh cirros@192.168.60.121$ hostname 
cirros-2
$ ping google.fr
PING google.fr (172.217.19.227): 56 data bytes
64 bytes from 172.217.19.227: seq=0 ttl=111 time=6.144 ms
64 bytes from 172.217.19.227: seq=1 ttl=111 time=5.621 ms

Installer Ceph

1.Préparation du disque

  • Créer une partition de type lvm sur l’espace disponible de votre disque (tous les nodes)
lsblk /dev/sda
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 1,8T 0 disk
├─sda1 8:1 0 987,5K 0 part
├─sda2 8:2 0 512M 0 part /boot
├─sda3 8:3 0 97,7G 0 part /
├─sda4 8:4 0 4G 0 part [SWAP]
└─sda5 8:5 0 2M 0 part
fdisk /dev/sdaCommande (m pour l'aide) : n
Numéro de partition (6-128, 6 par défaut) : <enter>
Premier secteur (214239193-3907025071, 214239232 par défaut) :<enter>
Dernier secteur, +secteurs ou +taille{K,M,G,T,P} (214239232-3907025071, 3907025071 par défaut) :<enter>
Une nouvelle partition 6 de type « Linux filesystem » et de taille 1,7 TiB a été créée.
Commande (m pour l'aide) : t
Numéro de partition (1-6, 6 par défaut) : 6
Type de partition (taper L pour afficher tous les types) : 31
Type de partition « Linux filesystem » modifié en « Linux LVM ».Commande (m pour l'aide) : p
Périphérique Début Fin Secteurs Taille Type
/dev/sda1 34 2008 1975 987,5K Amorçage BIOS
/dev/sda2 2009 1050584 1048576 512M Système EFI
/dev/sda3 1050585 205850584 204800000 97,7G Système de fichiers Linux
/dev/sda4 205850585 214239192 8388608 4G Système de fichiers Linux
/dev/sda5 3907025072 3907029134 4063 2M Système de fichiers Linux
/dev/sda6 214239232 3907025071 3692785840 1,7T LVM Linux
Les entrées de la table de partitions ne sont pas dans l'ordre du disque.Commande (m pour l'aide) : wlsblk /dev/sda
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 1,8T 0 disk
├─sda1 8:1 0 987,5K 0 part
├─sda2 8:2 0 512M 0 part /boot
├─sda3 8:3 0 97,7G 0 part /
├─sda4 8:4 0 4G 0 part [SWAP]
├─sda5 8:5 0 2M 0 part
└─sda6 8:6 0 1,7T 0 part

2.Préparation de l’iptables

vi /etc/sysconfig/iptables
...
...
*filter
.
.
.
-A INPUT -p tcp -m multiport --dports 3300,6789 -m comment --comment "Ceph MON" -j ACCEPT
-A INPUT -p tcp -m multiport --dports 6800:7300 -m comment --comment "Ceph MGR MDS OSD" -j ACCEPT

-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
  • Recharger l’iptables
systemctl restart iptables.service

3.Préparation du déploiement ansible

  • Créer un utilisateur ansible sur tous les nodes
[root@all ~]# useradd ansible
[root@all ~]# echo "ansible ALL=(ALL:ALL) NOPASSWD: ALL" > /etc/sudoers.d/ansible
[root@all ~]# echo P@ssw0rd | passwd ansible --stdin
  • Créer un clé ssh ansible sur le premier node est copier la sur les autres
[root@openstack ~]# su - ansible
[ansible@openstack ~]$ ssh-keygen -t rsa
[ansible@openstack ~]$ ssh-copy-id nova1
[ansible@openstack ~]$ ssh-copy-id nova2
  • Récupérer le repo ceph-ansible, puis faire un checkout sur la brance stable-4.0 qui correspond a la version nautilus
[ansible@openstack ~]# git clone https://github.com/ceph/ceph-ansible.git
[ansible@openstack ~]# cd ceph-ansible/
[ansible@openstack ceph-ansible]# git checkout --track origin/stable-4.0
  • Installer les dépendances
[ansible@openstack ceph-ansible]# sudo python3 -m pip install -r requirements.txt
  • Préparer le fichier d’inventaire avec un monitor et un osd sur chaque node
[ansible@openstack ceph-ansible]# sudo bash -c 'cat > /etc/ansible/hosts' << EOF
[mons]
openstack
nova1
nova2
[osds]
openstack
nova1
nova2
EOF
  • Vérifier le passage en root avec ansible
[ansible@openstack ceph-ansible]# ansible mons -m command -a id -b
nova1 | CHANGED | rc=0 >>
uid=0(root) gid=0(root) groups=0(root)
nova2 | CHANGED | rc=0 >>
uid=0(root) gid=0(root) groups=0(root)
openstack | CHANGED | rc=0 >>
uid=0(root) gid=0(root) groups=0(root)
  • Activer le site.yml
[ansible@openstack ceph-ansible]# cp site.yml.sample site.yml
  • Configurer du Cluster Ceph dans le fichier group_vars/all.yml

On est obligés de mettre un réseau public_network large puisque les 3 nodes ne sont pas dur le même réseau

[ansible@openstack ceph-ansible]# cat > group_vars/all.yml << EOF
---
dummy:
ceph_origin: repository
ceph_repository: community
ceph_stable_release: nautilus
public_network: "91.121.0.0/16"
cluster_network: "{{ public_network }}"
journal_size: 1024
monitor_interface: enp4s0
dashboard_enabled: False
EOF
  • Ajouter la partition /dev/sda6 dans le fichier group_vars/osds.yml
[ansible@openstack ceph-ansible]# cat > group_vars/osds.yml << EOF
---
dummy:
lvm_volumes:
- data: /dev/sda6
EOF

4. Déployer le Cluster Ceph

[ansible@openstack ceph-ansible]# ansible-playbook site.yml
...
...
INSTALLER STATUS ********************************************************************
Install Ceph Monitor : Complete (0:01:40)
Install Ceph OSD : Complete (0:00:59)
  • Vérification du Cluster Ceph
[ansible@openstack ceph-ansible]$ sudo ceph -s
cluster:
id: 37d104da-37b5-4fb1-bf3b-9e4db92acf84
health: HEALTH_OK

services:
mon: 3 daemons, quorum openstack,nova1,nova2 (age 2h)
mgr: nova2(active, since 3h), standbys: nova1, openstack
osd: 3 osds: 3 up (since 2h), 3 in (since 2h)

data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 3.0 GiB used, 5.2 TiB / 5.2 TiB avail
pgs:

Configurer Ceph dans OpenStack

1. Glance

  • Créer le pool images
[root@openstack ~]# ceph osd pool create images 128
[root@openstack ~]# rbd pool init images
  • Configurer les autorisations cephx
root@openstack ~]# ceph auth get-or-create client.glance \
mon 'profile rbd' \
osd 'profile rbd pool=images' \
mgr 'profile rbd pool=images' \
-o /etc/ceph/ceph.client.glance.keyring
[root@openstack ~]# sudo chgrp glance /etc/ceph/ceph.client.glance.keyring
  • Configurer Glance pour utilisé rbd comme backend par défaut
[root@openstack ~]# cp /etc/glance/glance-api.conf /etc/glance/glance-api.conf.ori[root@openstack ~]# vi /etc/glance/glance-api.conf
[DEFAULT]
show_image_direct_url = true
[glance_store]
stores=file,http,swift,rbd
default_store=rbd
rbd_store_chunk_size=8
rbd_store_pool=images
rbd_store_user=glance
rbd_store_ceph_conf=/etc/ceph/ceph.conf
rados_connect_timeout=0
  • Redémarrer Glance
[root@openstack ~]# systemctl restart openstack-glance-api
  • Tester

Télécharger une images dans OpenStack avec le format raw

[root@openstack ~]# wget https://cloud.centos.org/centos/8/x86_64/images/CentOS-8-ec2-8.1.1911-20200113.3.x86_64.qcow2[root@openstack ~]# qemu-img convert -f qcow2 -O raw /tmp/CentOS-8-ec2-8.1.1911-20200113.3.x86_64.qcow2 /tmp/CentOS-8-ec2-8.1.1911-20200113.3.x86_64.raw[root@openstack ~]# openstack image create --container-format bare \
--disk-format raw \
--file /tmp/CentOS-8-ec2-8.1.1911-20200113.3.x86_64.qcow2 "CentOS 8"

Vérifier que l’image est bien présente dans le pool rbd images

[root@openstack tmp(keystone_admin)]# openstack image list
+--------------------------------------+-----------------+--------+
| ID | Name | Status |
+--------------------------------------+-----------------+--------+
| 88d56602-7a4f-4f3d-9d7d-830c32670c8a | CentOS 8 | active |
| 9a031bd4-f7e3-41b7-a551-ab5e325a2f31 | cirros-0.5.1 | active |
+--------------------------------------+-----------------+--------+
[root@openstack tmp(keystone_admin)]# rbd --id glance -p images ls
88d56602-7a4f-4f3d-9d7d-830c32670c8a

2. Cinder & Nova

  • Activer le cache RBD et les sockets admin, sur chaque hyperviseur ceph.conf
[ansible@openstack ceph-ansible]$ vi group_vars/all.yml
---
dummy:
ceph_origin: repository
ceph_repository: community
ceph_stable_release: nautilus
public_network: "91.121.0.0/16"
cluster_network: "{{ public_network }}"
journal_size: 1024
monitor_interface: enp4s0
dashboard_enabled: False
ceph_conf_overrides:
client:
rbd cache: True
rbd cache writethrough until flush: True
rbd concurrent management ops: 20
admin socket: /var/run/ceph/guests/$cluster-$type.$id.$pid.$cctid.asok
log file: /var/log/ceph/qemu-guest-$pid.log
  • Redéployer le Cluster Ceph
[ansible@openstack ceph-ansible]# ansible-playbook site.yml
...
...
INSTALLER STATUS ********************************************************************
Install Ceph Monitor : Complete (0:01:40)
Install Ceph OSD : Complete (0:00:59)
  • Ajouter le répertoires guests avec les autorisations suivantes
[root@all ~]# mkdir -m 775 /var/run/ceph/guests/
[root@all ~]# chown qemu:libvirt /var/run/ceph/guests /var/log/ceph/
  • Créer les pools volumes backups vms
[root@openstack ~]# ceph osd pool create volumes 32
[root@openstack ~]# ceph osd pool create backups 32
[root@openstack ~]# ceph osd pool create vms 32
[root@openstack ~]# rbd pool init volumes
[root@openstack ~]# rbd pool init backups
[root@openstack ~]# rbd pool init vms
  • Configurer les autorisations cephx
[root@openstack ~]# ceph auth get-or-create client.cinder \
mon 'profile rbd' \
osd 'profile rbd pool=volumes, profile rbd pool=vms, profile rbd-read-only pool=images' \
mgr 'profile rbd pool=volumes, profile rbd pool=vms' \
-o /etc/ceph/ceph.client.cinder.keyring
[root@openstack ~]# ceph auth get-or-create client.cinder-backup \
mon 'profile rbd' \
osd 'profile rbd pool=backups' \
mgr 'profile rbd pool=backups' \
-o /etc/ceph/ceph.client.cinder-backup.keyring
[root@openstack ~]# chgrp cinder /etc/ceph/ceph.client.cinder-backup.keyring
[root@openstack ~]# chgrp cinder /etc/ceph/ceph.client.cinder.keyring

Les nœuds exécutant nova-compute ont besoin du fichier de clés pour le processus nova-compute

[root@openstack ~]# ceph auth get-key client.cinder > ~/client.cinder.key[root@openstack ~]# uuidgen | tee ~/cinder-uuid.txt
5fe8f532-3100-4a15-a92e-2421631413a2
[root@openstack ~]# cat > ~/secret.xml <<EOF
<secret ephemeral='no' private='no'>
<uuid>$(cat ~/cinder-uuid.txt)</uuid>
<usage type='ceph'>
<name>client.cinder secret</name>
</usage>
</secret>
EOF
[root@openstack ~]# scp ~/secret.xml \
~/cinder-uuid.txt \
~/client.cinder.key nova1:~

[root@openstack ~]# scp ~/secret.xml \
~/cinder-uuid.txt \
~/client.cinder.key nova2:~
[root@openstack ~]# scp /etc/ceph/ceph.client.cinder.keyring nova1:/etc/ceph/[root@openstack ~]# scp /etc/ceph/ceph.client.cinder.keyring nova2:/etc/ceph/
  • Ajouter la clé secrète à libvirt
[root@all ~]# virsh secret-define --file ~/secret.xml
Secret 5fe8f532-3100-4a15-a92e-2421631413a2 created

[root@all ~]# virsh secret-set-value \
--secret $(cat ~/cinder-uuid.txt) \
--base64 $(cat ~/client.cinder.key)

Secret value set
  • Positionner le groupe libvirt au fichier de keyring cinder
[root@nova ~]# chgrp libvirt /etc/ceph/ceph.client.cinder.keyring
  • Configuration de Nova pour attacher un bloc Ceph rbd
[root@all ~]# vi /etc/nova/nova.conf
[libvirt]
...
images_type = rbd
images_rbd_pool = vms
images_rbd_ceph_conf = /etc/ceph/ceph.conf
rbd_user = cinder
rbd_secret_uuid = 5fe8f532-3100-4a15-a92e-2421631413a2
disk_cachemodes="network=writeback"
inject_password = false
inject_key = false
inject_partition = -2
live_migration_flag="VIR_MIGRATE_UNDEFINE_SOURCE,VIR_MIGRATE_PEER2PEER,VIR_MIGRATE_LIVE,VIR_MIGRATE_PERSIST_DEST,VIR_MIGRATE_TUNNELLED"
hw_disk_discard = unmap
  • Ajouter la section ceph a cinder,
  • Commenter default_volume_type = iscsi
  • Commenter backup_swift
[root@openstack ~]# vi /etc/cinder/cinder.conf
[DEFAULT]
....
backup_driver = cinder.backup.drivers.ceph.CephBackupDriver
backup_ceph_user = cinder-backup
backup_ceph_conf = /etc/ceph/ceph.conf
backup_ceph_chunk_size = 134217728
backup_ceph_pool = backups
backup_ceph_stripe_unit = 0
backup_ceph_stripe_count = 0
restore_discard_excess_bytes = true
# backup_swift_url=http://91.121.85.XX:8080/v1/AUTH_
# backup_swift_container=volumebackups
# backup_driver=cinder.backup.drivers.swift.SwiftBackupDriver
enabled_backends=ceph
glance_api_version = 2
# default_volume_type = iscsi....
[ceph]
volume_driver = cinder.volume.drivers.rbd.RBDDriver
rbd_cluster_name = ceph
rbd_pool = volumes
rbd_user = cinder
rbd_ceph_conf = /etc/ceph/ceph.conf
rbd_flatten_volume_from_snapshot = false
rbd_secret_uuid = 5fe8f532-3100-4a15-a92e-2421631413a2
rbd_max_clone_depth = 5
rbd_store_chunk_size = 4
rados_connect_timeout = -1
  • Activer la sauvegarde Cinder dans openstack-dashboard
[root@openstack ~]# vi /etc/openstack-dashboard/local_settings
....
OPENSTACK_CINDER_FEATURES = {
'enable_backup': True,
}
....
  • Redémarrer les services nova cinder et libvirtd sur le node collecter
[root@openstack ~]# systemctl restart openstack-nova-compute openstack-cinder* libvirtd.service
  • Redémarrer les services nova libvirtd sur les nodes de calcules
[root@nova ~]# systemctl restart openstack-nova-compute libvirtd.service
  • Tester cinder-volumes

Créer un volume avec openstack, et vérifier le dans le pool volumes dans Ceph

[root@openstack ~]# openstack volume create --description "Test Volume" --size 1 testvolume[root@openstack ~]# openstack volume list+--------------------------------------+------------+-----------+---| ID                                   | Name       | Status    | 
+--------------------------------------+------------+-----------+---| 93bda58b-051c-4b3d-9c76-52a6d0e491f5 | testvolume | available | +--------------------------------------+------------+-----------+---
[root@openstack ~]# rbd -p volumes lsvolume-93bda58b-051c-4b3d-9c76-52a6d0e491f5
  • Tester cinder-backup

Créer un backup du volume précédant, et vérifier le dans le pool backups dans Ceph

[root@openstack ~]# openstack volume backup create 93bda58b-051c-4b3d-9c76-52a6d0e491f5
+-------+--------------------------------------+
| Field | Value |
+-------+--------------------------------------+
| id | c3d660c1-8c63-4fbd-a017-543b9ee7eb62 |
| name | None |
+-------+--------------------------------------+
[root@openstack ~]# rbd -p backups ls
volume-93bda58b-051c-4b3d-9c76-52a6d0e491f5.backup.c3d660c1-8c63-4fbd-a017-543b9ee7eb62
  • Tester nova

Créer une instance cirros, et vérifier que le disque et bien dans le pool vms

[root@openstack ~]# openstack server create --flavor m1.tiny \
--image cirros-0.5.1 \
--nic net-id=32288e9e-3ec6-47db-903d-6364f93f0b2a \
--security-group 1dd184a8-3e8c-41e6-a95b-23e04fdf95da \
--key-name mykey cirros
+-----------------+--------------------------------------------+
| Field | Value |
+-----------------+--------------------------------------------+
......
| id | a170838a-584f-4580-98d9-508db7f1386f |
....
[root@openstack ~]# rbd -p vms ls
a170838a-584f-4580-98d9-508db7f1386f
_disk

Bug Live migration

Une erreur dans le fichier /var/log/nova/nova-compute.log

ERROR nova.virt.libvirt.driver [-] [instance: b7098f27–2163–457b-9685-d17305fec60d] Live Migration failure: operation failed: Failed to connect to remote libvirt URI qemu+ssh://nova_migration@nova1/system?keyfile=/etc/nova/migration/identity: Cannot recv data: Load key “/etc/nova/migration/identity”: invalid format

Fix

[root@openstack ~]# cp ~/.ssh/id_rsa.pub /etc/nova/migration/authorized_keys
[root@openstack ~]# cp .ssh/id_rsa /etc/nova/migration/identity
[root@openstack ~]# scp /etc/nova/migration/identity nova1:/etc/nova/migration/identity
[root@openstack ~]# scp /etc/nova/migration/authorized_keys nova1:/etc/nova/migration/authorized_keys
[root@openstack ~]# scp /etc/nova/migration/identity nova2:/etc/nova/migration/identity
[root@openstack ~]# scp /etc/nova/migration/authorized_keys nova2:/etc/nova/migration/authorized_keys

--

--