Installation d’un cluster multi-noeuds OpenStack Victoria sur des serveurs dédiés avec le backend Ceph
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
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
[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 partfdisk /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) : 31Type 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 LinuxLes 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.SwiftBackupDriverenabled_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