Projet

Général

Profil

Openstack Installation TTNN » Historique » Version 243

« Précédent - Version 243/252 (diff) - Suivant » - Version actuelle
Laurent GUERBY, 25/03/2015 10:23


Openstack Installation tetaneutral.net

A FIXER

Le virsh secret-set-value bla bla, n'est pas fait par libvirt

Liens

Pending upstream fixes:

La liste à jour est ici:
http://chiliproject.tetaneutral.net/projects/git-tetaneutral-net/repository/puppetmaster/revisions/master/entry/manifests/nodes/openstack.pp#L27

Installation

L'installation initiale est composée de :

  • 3 hyperviseurs (compute node) qui contiendront 1 ceph-mon, N ceph-osd, nova-compute (qui lance les VM), neutron-openvswitch-agent (qui configure le réseau des vms)
  • 1 VM (controler node), qui contient tous les services de management d'openstack (nova, cinder, glance, neutron)
Les étapes d'installation sont les suivantes:
  • Préparation manuelle de la VM de management sur un des hyperviseurs
  • Installation de ceph et openstack sur toutes les machines avec puppet
  • Déplacement de la VM de management d'openstack dans openstack.

Information sur le puppet master:

La configuration et les modules puppet utilisés par tetaneutral.net se trouvent la:

http://chiliproject.tetaneutral.net/projects/git-tetaneutral-net/repository/puppetmaster
http://chiliproject.tetaneutral.net/projects/git-tetaneutral-net/repository/puppetmaster/revisions/master/entry/manifests/nodes/openstack.pp

Seulement les 3 classes suivantes sont spécifique à http://tetaneutral.net, le reste est réutilisable à condition de changer les ip, hostname, uuid et password :

class { 'ttnn::server': }
class { 'backup::client': }
class { 'sexymotd': }

Les modules qui sont nécessaire pour openstack pour le reste du fichier sont :

https://github.com/puppetlabs/puppetlabs-apache.git
https://github.com/puppetlabs/puppetlabs-apt
https://github.com/stackforge/puppet-ceph.git
https://github.com/stackforge/puppet-cinder.git
https://github.com/puppetlabs/puppetlabs-concat.git
https://github.com/stackforge/puppet-glance.git
https://github.com/stackforge/puppet-horizon.git
https://github.com/puppetlabs/puppetlabs-inifile.git
https://github.com/stackforge/puppet-keystone.git
https://github.com/camptocamp/puppet-kmod.git
https://github.com/saz/puppet-memcached.git
https://github.com/puppetlabs/puppetlabs-mysql.git
https://github.com/stackforge/puppet-neutron.git
https://github.com/stackforge/puppet-nova.git
https://github.com/puppetlabs/puppetlabs-rabbitmq.git
https://github.com/nanliu/puppet-staging.git
https://github.com/puppetlabs/puppetlabs-stdlib.git
https://github.com/duritong/puppet-sysctl.git
https://github.com/puppetlabs/puppetlabs-vcsrepo.git
https://github.com/stackforge/puppet-vswitch.git
https://github.com/puppetlabs/puppetlabs-xinetd.git

Préparation réseaux des hosts:

Preparation des bridges openvswitch:

$ apt-get install openvswitch-switch 
$ modprobe vhost-net
$ modprobe tun
$ modprobe loop

# On créé un switch br-eth0
ovs-vsctl add-br br-eth0
# On rajoute une petite bricole pour openstack 
ovs-vsctl br-set-external-id br-eth0 bridge-id br-eth0
# On ajoute le port eth0 dans le switch
ovs-vsctl add-port br-eth0 eth0  # Si aucun trunk vlan n'est spécifié, c'est un trunk avec tous les vlans 

# On créé des interfaces réseau utilisable sur la machine avec des vlans:
ovs-vsctl add-br vlan3132 br-eth0 3132
ovs-vsctl add-br vlan3175 br-eth0 3175
ovs-vsctl add-br vlan3199 br-eth0 3199

# On s'assure que eth0 sera toujours up
ovs-ofctl mod-port br-eth0 eth0 up

note: Les bridges openvswitch sont mémorisés et recréés automatiquement par le service openvswitch-switch

On install le fichier rc.local dans /etc/

On re-charge le fichier rc.local

bash -x /etc/rc.local

Sur h7.tetaneutral.net le routage est le suivant

ip route add 89.234.156.249/32 dev eth0.3132
ip route add 89.234.156.251/32 dev eth0.3132
ip route add 89.234.156.252/32 dev eth0.3132
ip route add 89.234.156.253/32 dev eth0.3132
ip route add 2a01:6600:8083:f900::/56 dev eth0.3132
ip route add 2a01:6600:8083:fb00::/56 dev eth0.3132
ip route add 2a01:6600:8083:fc00::/56 dev eth0.3132
ip route add 2a01:6600:8083:fd00::/56 dev eth0.3132

Preparation de la VM de management, le controlleur

Installation des prérequis

$ apt-get install libvirt-bin openstack-debian-images virtinst
#NOTE(sileht): temporairement récupérer la dernière version:
$ curl -# http://anonscm.debian.org/cgit/openstack/openstack-debian-images.git/plain/build-openstack-debian-image > /usr/sbin/build-openstack-debian-image

Preparation de l'image de la VM

$ vim hook.sh
set -xv

echo "openstack" > $BODI_CHROOT_PATH/etc/hostname

cat > $BODI_CHROOT_PATH/etc/resolv.conf <<EOF
domain tetaneutral.net
search tetaneutral.net
nameserver 8.8.8.8
EOF

cat > $BODI_CHROOT_PATH/etc/network/interfaces <<EOF
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet manual
  pre-up /sbin/sysctl -w net.ipv6.conf.eth0.accept_ra=0
  pre-up /sbin/sysctl -w net.ipv6.conf.eth0.autoconf=0
  up ip link set eth0 up
  up ip addr add 89.234.156.249/32 dev eth0
  up ip route add 91.224.149.0/24 dev eth0
  up ip route add default via 91.224.149.254

iface eth0 inet6 static
    pre-up /sbin/sysctl -w net.ipv6.conf.eth0.accept_ra=0
    pre-up /sbin/sysctl -w net.ipv6.conf.eth0.autoconf=0
    address 2a01:6600:8083:f900::1
    netmask 56
    gateway fe80::31

auto eth1
iface eth1 inet static
  pre-up /sbin/sysctl -w net.ipv6.conf.eth1.accept_ra=0
  pre-up /sbin/sysctl -w net.ipv6.conf.eth1.autoconf=0
  address 192.168.3.100
  netmask 255.255.255.0
EOF

mkdir -p $BODI_CHROOT_PATH/root/.ssh
chmod 600 $BODI_CHROOT_PATH/root/.ssh
cat >> $BODI_CHROOT_PATH/root/.ssh/authorized_keys <<EOF
ssh-dss AAAAB3NzaC1kc3MAAACBAJtnGLvuz4uVD6fnERDxDi/C0UyzwCiKmgNtEessopREYasAX4Gu6Fg10jAyIL5Nuc7YDnqj//pOfxNjD7hp99a2ZmkRQgh/ltClxYML9fqhBHgsUCpVse9nOYDHDnDgvXIPRSDUHat2UFpdchHVrFURNLIlZnBztsr+GCDURTV/AAAAFQD9SrBcH49ltaKOm6V5ssCPmgs1SwAAAIAbAvkQ3/tMzzdACO5B9s5Yb3ZuM7XImm0iqufivVf2Xy39g8HOBulUsN7eKEGPhVriqNolgIO7q7tVgYAff4/NE4yDP0Kp0SPg4tjt2yFJuL31Y3wzwHjnKrjgNlDSLl3uZnRXSipwUMwGKbdHB6NZSqlq192VKbHilQ00pbiMlAAAAIB5dfB1lVHkJ0o5CcaVQRPbca9DvbbRwnoTSmKHc5DUcqsPqDhS07CkM9ZcJuY1Nh4wGl4Q9kArj7Tnsvvygf/HReSUcIk4+nbDytJ8/pca/Qx4fzQQyppa94TylN62LSFT6MIJKLoMwYa0dQURT7Mv5+9Qj2vk5pZ38w2iQ9zVCg== root@h1
EOF

sed -i -e 's/^.*Port.*$/Port 2222/' -e 's/^[# ]*PasswordAuthentication.*$/PasswordAuthentication no/' $BODI_CHROOT_PATH/etc/ssh/sshd_config
chroot $BODI_CHROOT_PATH dpkg-reconfigure openssh-server
chroot $BODI_CHROOT_PATH apt-get purge -y cloud-init*
$ chmod +x hook.sh
$ build-openstack-debian-image --image-size 20  --release jessie -u http://apt.tetaneutral.net/debian/ -s http://apt.tetaneutral.net/debian/ --hook-script $(pwd)/hook.sh -e acpi-support
$ mv debian-jessie-7.0.0-3-amd64.raw /openstack.raw 
$ rm debian-jessie-7.0.0-3-amd64.qcow2

note: la derniere commande lancée par le script doit être 'qemu-img convert -c -f raw .... , sinon l'image de bootera pas
note(jessie): si l'erreur est celle ci-dessous, relancer manuellement 'kpartx -d debian-jessie-7.0.0-3-amd64.raw' jusqu'a ce que l'erreur disparaissent et le .raw est utilisable:

+ 'kpartx -d debian-jessie-7.0.0-3-amd64.raw'
device-mapper: remove ioctl on loop0p1 failed: Device or resource busy
loop deleted : /dev/loop0

note: si parted freeze -> lancer /etc/init.d/udev restart

On garde l'image raw qui sera importable dans ceph plus tard et on la mets à la racine pour qui l'utilisateur libvirt puisse y accéder.

Installation de la VM

$
$ virt-install --name openstack --ram 2048 --network bridge=br-eth0,model=virtio --network bridge=br-eth0,model=virtio --network bridge=br-eth0,model=virtio --nographics --serial pty --wait -1 --noreboot --autostart --disk /openstack.raw,bus=virtio,cache=none,io=native --import

$ virsh edit openstack

# Pour chaque bridge ajouter, le vlan et openvswitch comme ceci:
#    <vlan><tag id='3132'/></vlan><virtualport type='openvswitch'/>

$ virsh  start openstack
$ ssh root@89.234.156.249 -p 2222

Une fois connecté à la VM:

$ apt-get install puppet
$ puppet agent --enable
$ puppet agent -vt --server puppet.tetaneutral.net --certname openstack.tetaneutral.net --pluginsync 
Info: Caching certificate for ca
Info: csr_attributes file loading from /etc/puppet/csr_attributes.yaml
Info: Creating a new SSL certificate request for openstack.tetaneutral.net
Info: Certificate Request fingerprint (SHA256): AE:72:47:40:A0:E2:F4:59:BA:39:FA:3D:C2:A7:C9:1B:9F:87:A5:B7:65:3A:F9:D4:DE:AF:E2:A3:02:41:0F:2E
Info: Caching certificate for ca
Exiting; no certificate found and waitforcert is disabled

Sur le puppetmaster:

$ puppet ca sign openstack.tetaneutral.net 

note: si un vieux cert existe: puppet ca revoke openstack.tetaneutral.net ; puppet cert clean openstack.tetaneutral.net; puppet node clean openstack.tetaneutral.net

De nouveau sur la VM:

$ puppet agent -vt --server puppet.tetaneutral.net --certname openstack.tetaneutral.net --pluginsync 
$ puppet agent -vt --server puppet.tetaneutral.net --certname openstack.tetaneutral.net --pluginsync 
$ puppet agent -vt --server puppet.tetaneutral.net --certname openstack.tetaneutral.net --pluginsync 

Il ne doit plus y avoir d'erreur la 3°/4° fois.

Configuration des hyperviseurs

Une fois la configuration réseau faite, tout ce fait avec puppet:

$ apt-get install puppet
$ puppet agent --enable
$ puppet agent -vt --server puppet.tetaneutral.net --certname openstack.tetaneutral.net --pluginsync 
Info: Caching certificate for ca
Info: csr_attributes file loading from /etc/puppet/csr_attributes.yaml
Info: Creating a new SSL certificate request for openstack.tetaneutral.net
Info: Certificate Request fingerprint (SHA256): AE:72:47:40:A0:E2:F4:59:BA:39:FA:3D:C2:A7:C9:1B:9F:87:A5:B7:65:3A:F9:D4:DE:AF:E2:A3:02:41:0F:2E
Info: Caching certificate for ca
Exiting; no certificate found and waitforcert is disabled

Sur le puppetmaster:

$ puppet ca sign openstack.tetaneutral.net 

note: si un vieux cert existe: puppet ca revoke openstack.tetaneutral.net ; puppet cert clean openstack.tetaneutral.net; puppet node clean openstack.tetaneutral.net

De nouveau sur la VM:

$ puppet agent -vt --server puppet.tetaneutral.net --certname openstack.tetaneutral.net --pluginsync 
$ puppet agent -vt --server puppet.tetaneutral.net --certname openstack.tetaneutral.net --pluginsync 
$ puppet agent -vt --server puppet.tetaneutral.net --certname openstack.tetaneutral.net --pluginsync 

Il ne doit plus y avoir d'erreur la 3°/4° fois.

Information sur la configuration d'un hyperviseur sur le puppet master

La configuration puppet ressemble à :

node "gX.tetaneutral.net" inherits openstack_node_common {
  # Configuration du routerid et de l'AS number de cette machine
  # Il faut aussi mettre la conf bgp de h7 ainsi que les fichiers 
  # /etc/puppet/manifests/files/openstack-bird.conf.erb et
  # /etc/puppet/manifests/files/openstack-bird6.conf.erb
  # pour ajouter cette AS interne
  ttnn_os_bird {'198.51.100.1': asnum => "65001"}

  # Dans le cas d'une moniteur ceph, mais uniquement 3 suffissent, on a déjà g1,g2,g3
  ttnn_ceph_mon {$::hostname:}
  # Sinon utilisait:
  # class{"ttnn_ceph_osd_only": }

  # La partie Openstack, l'uuid doit être unique par machine (générer avec uuid-gen)
  ttnn_os_compute {"9d26ec10-a48b-4f0f-a122-f10ed16d270f": }
}

Déplacement du disk du controlleur dans le cluster ceph

Les recettes puppet on créé un pool disks pour les mettres les VMs et volumes de VM

Sur g1, on import le disque de la VM dans ceph et on modifie la conf libvirt:

$ virsh shutdown openstack
$ rbd -p disks import /var/lib/ceph/osd/ceph-0/openstack.raw  openstack-disk
$ virsh edit openstack

Remplacer:

    <disk type='file' device='disk'>
      <driver name='qemu' type='raw' cache='none' io='native'/>
      <source file='/var/lib/ceph/osd/ceph-0/openstack.raw'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
    </disk>

Par:

    <disk type='network' device='disk'>
        <driver name='qemu' type='raw'/>
        <source protocol='rbd' name='disks/openstack-disk' />
        </source>
        <auth username='openstack-service'>
            <secret type='ceph' uuid='1fe74663-8dfa-486c-bb80-3bd94c90c967'/>
        </auth>
        <target dev='vda' bus='virtio'/>
        <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
    </disk>

La clé ceph pour libvirt a déjà été installé par puppet pour avoir sont uuid:

$ virsh secret-list
 UUID                                  Usage
--------------------------------------------------------------------------------
 1fe74663-8dfa-486c-bb80-3bd94c90c967  ceph client.openstack-service secret

Puis on démarre

$ virsh start openstack

Ca marche !

$ ssh openstack.t
X11 forwarding request failed on channel 0

  server: openstack.tetaneutral.net
  system: Debian jessie/sid, kernel 3.14-2-amd64, puppet 3.6.1
     cpu: 1/1 (QEMU Virtual CPU version 2.1.0)
  memory: 1.96 GB

    eth0: 52:54:00:90:d8:c7 / 89.234.156.249 / 2a01:6600:8083:f900::1
    eth1: 52:54:00:13:fa:13 / 192.168.3.100

 modules: openstack_node_common ttnn::server resolver checkmk::agent checkmk::client rsyslog::client rsyslog apt apt::update puppet nullmailer backup::client sexymotd 
                            _             _    
  ___  _ __   ___ _ __  ___| |_ __ _  ___| | __
 / _ \| '_ \ / _ \ '_ \/ __| __/ _` |/ __| |/ /
| (_) | |_) |  __/ | | \__ \ || (_| | (__|   < 
 \___/| .__/ \___|_| |_|___/\__\__,_|\___|_|\_\
      |_|                                      
Last login: Wed Aug 27 08:10:02 2014 from atoulouse-652-1-119-50.w2-6.abo.wanadoo.fr
root@openstack:~# 

Preparation des OSD pour ceph

Cas général un disque entier:

$ ceph-disk prepare --zap-disk --cluster-uuid 1fe74663-8dfa-486c-bb80-3bd94c90c967 --fs-type=ext4 /dev/sdX
$ smartctl --smart=on /dev/sdX  # Pour le monitoring.
$ ceph osd crush add osd.<ID> 0 root=default host=g3
ou pour les ssds:
$ ceph osd crush add osd.<ID> 0 root=ssd host=g3-ssd

$ /root/tools/ceph-reweight-osds.sh osd.<ID>

Cas particulier du SSD ou ce trouve l'OS

En général avec ceph, on donne un disque, ceph créé 2 partitions une pour le journal de l'OSD, l'autre pour les datas
mais pour le SSD de tetaneutral qui a aussi l'OS, voici la méthode

Création manuelle de la partition de data ceph /dev/sda2 ici

apt-get install partprobe
fdisk /dev/sda

n
p
<enter>
<enter>
<enter>
<enter>
w

$ partprobe

On prepare le disk comme normalement

ceph-disk prepare /dev/sda2
ceph-disk activate --fs-type=ext4 /dev/sda2

Le disque n'étant pas utilisé uniquement par ceph, le service ceph ne le chargera pas automatiquement:
Il faut ajouter le nom du device dans le /etc/rc.local pour qu'il lance:

ceph-disk activate /dev/sda2

Suppression OSD:

name="osd.2" 
ceph osd out ${name}
/etc/init.d/ceph stop ${name}
ceph osd crush remove ${name}
ceph auth del ${name}
ceph osd rm ${name}
ceph osd tree

Configuration des Placements Groups des pools:

Par défaut les pools sont créés avec des placements groups à 8 (pg_num=8), 3 replicats, avec un tolérance à 2, si il manque des OSDs"

Mais cette valeur (pg_num) défini le bon fonctionnement de ceph. Dans le cas standard (ie: 1 seul pool) la recette est facile:

               (OSDs * 100)
Total PGs = (  ------------  )
              OSD per object

On arrondi à la puissance de 2 supérieurs. Mais dans notre cas 3 pools ce n'est pas si simple, les pools auront des cas d'utilisation différent:

Ma proposition de configuration:
  • Pool ssds: il a 3 OSDs pour lui tout seul, on applique la recette magique: 3*100/3 ~= 128 pgs
  • Pools images et disks: ils ont 3 OSDs à ce partager donc il faut répartir les 128 pgs. soit 32pgs et 96pgs (PS: il faut au moins 20pgs pour 3 réplicats)

Soit:

ceph osd pool set ssds pg_num 128
ceph osd pool set images pg_num 32
ceph osd pool set disks pg_num 96

# attendre un peu qu'il y est plus de pg_create dans 'ceph -s'
ceph osd pool set ssds pgp_num 128  
ceph osd pool set images pgp_num 32
ceph osd pool set disks pgp_num 96

ref: http://ceph.com/docs/master/rados/operations/placement-groups/

Preparation du Pool SSD pour ceph

Chaque machine se trouve dans 2 hosts, un host SSD et un host HARDDISK (même si en réalité les deux sont sur la même machine physique),

Ensuite on créé 2 object root un pour les hosts SSD et un autre pour les host HARDDISK

On créé ensuite 2 règles de stockage une qui envoie les objects vers le root SSD et l'autre vers le root HARDDISK

Cela permettra d'avoir de définir une règle différente suivant les pools ceph.

Niveau Openstack nous avons 3 pools:
  • disks: Ce pool aura les disques de VM et les volumes attaché
  • ssds: Ce pool contiendra les volumes sur ssd
  • images: c'est la que seront stocké les images de VMs (glance).

Configuration de la crushmap de ceph:

Il faut s'assurer que la crushmap n'est pas en mode automatique (c'est déjà configuré par puppet):

[global]
osd crush update on start = false

Création de l'arbre de rangement physique des SSD, l'arbre nommé 'default' sera donc celui des disques durs

$ ceph osd crush add-bucket ssd root
$ ceph osd crush add-bucket g1-ssd host
$ ceph osd crush add-bucket g2-ssd host
$ ceph osd crush add-bucket g3-ssd host
$ ceph osd crush move g1-ssd root=ssd
$ ceph osd crush move g2-ssd root=ssd
$ ceph osd crush move g3-ssd root=ssd
$ ceph osd tree
# id    weight    type name    up/down    reweight
-5    0    root ssd
-6    0        host g1-ssd
-7    0        host g2-ssd
-8    0        host g3-ssd
-1    3    root default
-2    1        host g1
0    1            osd.0    up    1    
3    1            osd.3    up    1    
-3    1        host g2
1    1            osd.1    up    1    
4    1            osd.4    up    1    
-4    1        host g3
2    1            osd.2    up    1    
5    1            osd.5    up    1    

On range les osd qui ont des disques SSD dans ce nouvel arbre.

$ ceph osd crush add osd.3 0  root=ssd host=g1-ssd
$ ceph osd crush add osd.4 0  root=ssd host=g2-ssd
$ ceph osd crush add osd.5 0  root=ssd host=g3-ssd

# Ou si l'osd a déjà éte positionné une fois
$ ceph osd crush set osd.3 0  root=ssd host=g1-ssd
$ ceph osd crush set osd.4 0  root=ssd host=g2-ssd
$ ceph osd crush set osd.5 0  root=ssd host=g3-ssd

# Vérifier le résultat
$ ceph osd tree
# id    weight    type name    up/down    reweight
-5    3    root ssd
-6    1        host g1-ssd
3    1            osd.3    up    1    
-7    1        host g2-ssd
4    1            osd.4    up    1    
-8    1        host g3-ssd
5    1            osd.5    up    1    
-1    3    root default
-2    1        host g1
0    1            osd.0    up    1    
-3    1        host g2
1    1            osd.1    up    1    
-4    1        host g3
2    1            osd.2    up    1

Puis recalculer les poids des OSD:
$ /root/tools/ceph-reweight-osds.sh

Definition de la crushmap de ttnn

Une fois la crushmap modifié on créée et applique la règle sur le pool ssds:

$ ceph osd crush rule create-simple ssd_replicated_ruleset ssd host firstn
$ ceph osd crush rule dump
[
    { "rule_id": 0,
      "rule_name": "replicated_ruleset",
      "ruleset": 0,
      "type": 1,
      "min_size": 1,
      "max_size": 10,
      "steps": [
            { "op": "take",
              "item": -1,
              "item_name": "default"},
            { "op": "chooseleaf_firstn",
              "num": 0,
              "type": "host"},
            { "op": "emit"}]},
    { "rule_id": 1,
      "rule_name": "ssd_replicated_ruleset",
      "ruleset": 1,
      "type": 1,
      "min_size": 1,
      "max_size": 10,
      "steps": [
            { "op": "take",
              "item": -5,
              "item_name": "ssd"},
            { "op": "chooseleaf_firstn",
              "num": 0,
              "type": "host"},
            { "op": "emit"}]}]

$ ceph osd pool set ssds crush_ruleset 1

Il faut ensuite attendre que ceph redistribue les data comme on lui a demandé, on peut suivre l'avancement avec :

ceph -s

Pool ceph replicated

Creation via ceph :

ceph osd pool create r2 12 12 replicated
ceph osd pool set r2 size 2
ceph osd pool set r2 min_size 1

Puis ajout des pools via puppet
https://chiliproject.tetaneutral.net/projects/git-tetaneutral-net/repository/puppetmaster/revisions/master/entry/manifests/nodes/openstack.pp#L21

$os_cinder_ceph_pools = ...
"ceph-r2" => "r2",
...

Sur openstack ou attendre le cron ou "puppet agent -vt"

Puis :

cinder create --volume-type ceph-r2 --display-name utopialab.tetaneutral.net-disk-2 4096
nova volume-attach utopialab.tetaneutral.net xxxVolumeIDxxx

Pool ceph erasure coding

Creation erasure coded pool

En pratique on a 5 machines avec chacune au moins un rotationnel (le plus petit = 2 TB sur g3), on va creer un 4+1 qui devrait permettre le fonctionnement continu malgré la perte d'une machine :

Ajout des pools via puppet
https://chiliproject.tetaneutral.net/projects/git-tetaneutral-net/repository/puppetmaster/revisions/master/entry/manifests/nodes/openstack.pp#L21

$os_cinder_ceph_pools = ...
"ceph-ec4p1" => "ec4p1",
...

Apres sur la VM openstack

puppet agent -vt
cinder type-list
# verifier que ceph-ec4p1 est bien present
# pool erasure code
ceph osd erasure-code-profile set ec4p1profile k=4 m=1 ruleset-failure-domain=host
# Note: ruleset-failure-domain cannot be changed after creation, host will choose only one disk per host, other option is osd whith no such constraint
ceph osd pool create ec4p1 4096 4096 erasure ec4p1profile

# cache avec ec4p1c pool "normal" car le pool erasure code n'implémente pas les write partiels.
ceph osd pool create ec4p1c 4096 4096 replicated

# mise en place du cache tier writeback overlay
ceph osd tier add ec4p1 ec4p1c
ceph osd tier cache-mode ec4p1c writeback
ceph osd tier set-overlay ec4p1 ec4p1c

# tuning du pool cache
ceph osd pool set ec4p1c size 3 
ceph osd pool set ec4p1c min_size 2
ceph osd pool set ec4p1c cache_target_dirty_ratio 0.4 # begin flushing modified (dirty) objects when they reach 40% of the cache pool’s capacity
ceph osd pool set ec4p1c cache_target_full_ratio 0.8 # begin flushing unmodified (clean) objects when they reach 80% of the cache pool’s capacity
ceph osd pool set ec4p1c target_max_bytes 100000000000 # to flush or evict at 100 GB = 100e9 bytes
ceph osd pool set ec4p1c target_max_objects 100000000000 # ?
ceph osd pool set ec4p1c hit_set_type bloom
ceph osd pool set ec4p1c hit_set_count 1
ceph osd pool set ec4p1c hit_set_period 3600

# creation et attach d'un disque sur une VM
cinder create --volume-type ceph-ec4p1 --display-name apt.tetaneutral.net-disk-1 1024
nova volume-attach apt.tetaneutral.net 4663c1c1-e5e9-4684-9e55-bb2d9cc18ac8

Exemple de creation de ec3p1 avec cache 500G ec3p1c

ceph osd erasure-code-profile set ec3p1profile k=3 m=1 ruleset-failure-domain=host
ceph osd pool create ec3p1 12 12 erasure ec3p1profile

ceph osd tier add ec3p1 ec3p1c
ceph osd tier cache-mode ec3p1c writeback
ceph osd tier set-overlay ec3p1 ec3p1c

ceph osd pool create ec3p1c 12 12 replicated
ceph osd pool set ec3p1c size 3 
ceph osd pool set ec3p1c min_size 2
ceph osd pool set ec3p1c cache_target_dirty_ratio 0.4 
ceph osd pool set ec3p1c cache_target_full_ratio 0.8 
ceph osd pool set ec3p1c target_max_bytes 500000000000 
ceph osd pool set ec3p1c target_max_objects 500000000000 
ceph osd pool set ec3p1c hit_set_type bloom
ceph osd pool set ec3p1c hit_set_count 1
ceph osd pool set ec3p1c hit_set_period 3600

cinder create --volume-type ceph-ec3p1 --display-name utopialab.tetaneutral.net-disk-1 8192
nova volume-attach utopialab.tetaneutral.net xxxVolumeIDxxx

Effacer des profiles

# ceph osd erasure-code-profile ls
default
ec3p1profile
ec4p1profile
# ceph osd erasure-code-profile get ec4p1profile
directory=/usr/lib/x86_64-linux-gnu/ceph/erasure-code
k=4
m=1
plugin=jerasure
ruleset-failure-domain=osd
technique=reed_sol_van
# ceph osd erasure-code-profile rm ec3p1profile
# ceph osd erasure-code-profile rm ec4p1profile

Erasure URL

http://www.spinics.net/lists/ceph-devel/msg20920.html
http://ceph.com/docs/master/rados/operations/cache-tiering/

An erasure encoded pool cannot be accessed directly using rbd. For this
reason we need a cache pool and an erasure pool. This not only allows
supporting rbd but increases performance.

http://ceph.com/docs/master/dev/erasure-coded-pool/#interface

Creation "ecpool" "ecruleset" "myprofile"

ceph osd pool create ecpool 12 12 erasure
ceph osd crush rule create-erasure ecruleset
ceph osd pool create ecpool 12 12 erasure default ecruleset
ceph osd erasure-code-profile set myprofile ruleset-failure-domain=osd
ceph osd erasure-code-profile get myprofile
ceph osd pool create ecpool 12 12 erasure myprofile
ceph osd erasure-code-profile set myprofile k=3 m=1
ceph osd erasure-code-profile get myprofile
ceph osd pool create ecpool 12 12 erasure myprofile

ceph osd erasure-code-profile ls
ceph osd erasure-code-profile get default
ceph osd erasure-code-profile rm myprofile
ceph osd erasure-code-profile set myprofile ruleset-root=ssd

Remove erasure coded pool

root@g1:~# ceph osd tier remove-overlay ec3p1c
there is now (or already was) no overlay for 'ec3p1c'
root@g1:~# ceph osd tier remove-overlay ec3p1
there is now (or already was) no overlay for 'ec3p1'
root@g1:~# ceph osd tier remove ec3p1 ec3p1c
pool 'ec3p1c' is now (or already was) not a tier of 'ec3p1'
root@g1:~# ceph osd pool delete ec3p1c ec3p1c --yes-i-really-really-mean-it
pool 'ec3p1c' removed
root@g1:~# ceph osd pool delete ec3p1 ec3p1 --yes-i-really-really-mean-it
pool 'ec3p1' removed

Activer le cache-tiering /!\/!\ Plus utilisé pas encore assez stable /!\/!\

http://ceph.com/docs/master/rados/operations/cache-tiering/

Preparation

ceph mkpool ssd-cache
ceph osd pool set ssd-cache pg_num 128
ceph osd pool set ssd-cache pgp_num 128
ceph osd pool set ssds crush_ruleset 1
ceph osd tier add disks ssd-cache
ceph osd tier cache-mode ssd-cache writeback
ceph osd tier set-overlay disks ssd-cache
ceph osd pool set ssd-cache target_max_bytes $[15 * 1024 * 1024 * 1024]
ceph osd pool set ssd-cache target_max_objects 3000000

# http://lists.ceph.com/pipermail/ceph-users-ceph.com/2014-August/042174.html
ceph osd pool set ssd-cache cache_target_dirty_ratio 0.4
ceph osd pool set ssd-cache cache_target_full_ratio 0.8
ceph osd pool set ssd-cache hit_set_type bloom
ceph osd pool set ssd-cache hit_set_count 1
ceph osd pool set ssd-cache hit_set_period 3600

ceph osd dump -f json-pretty | grep ssd-cache -A40 -B1

Gestion du cache

http://lists.ceph.com/pipermail/ceph-users-ceph.com/2014-August/042018.html

rados -p ssd-cache cache-flush-evict-all
# puis control-c
ceph df|grep ssd-cache

Optimisations

via Loic :
http://ceph.com/docs/giant/rados/configuration/osd-config-ref/
dans /etc/ceph/ceph.conf
osd-disk-thread-ioprio-class = idle
osd-disk-thread-ioprio-priority = 7
de façon hebdomadaire ceph va examiner l'etat des objets (scrub) et faire plein d'IO pour ça. Ce parametre dit que ces IO passent en dernier. Ca n'affecte pas les IO normales faites via rbd.

Migration IP ceph

Au besoin pour passer cluster de test a dev

Configuration des Policies

Les rules modifiées /etc/{nova,cinder,neutron,glance}/policy.json sont ici:

http://chiliproject.tetaneutral.net/projects/git-tetaneutral-net/repository/openstack-tools/revisions/master/show/policy