Openstack Installation TTNN » Historique » Version 173
Version 172 (Mehdi Abaakouk, 19/09/2014 11:39) → Version 173/252 (Mehdi Abaakouk, 19/09/2014 13:38)
{{>toc}}
h1. Openstack Installation tetaneutral.net
h2. Liens
* http://ceph.com/docs/master/rados/operations/cache-tiering/
* http://ceph.com/docs/master/rados/operations/crush-map/
h2. 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
h2. Installation
Le setup installé est composé 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.
h3. Information sur le puppet master:
La conf et modules puppet utilisé par tetaneutral.net ce trouve 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 c'est 3 classes sont spécifique à tetaneutral, 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
h3. Préparation réseaux des hosts:
Preparation des bridges openvswitch:
<pre>
$ 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
</pre>
_note: Les bridges openvswitch sont mémorisés et recréés automatiquement par le service openvswitch-switch_
On install le fichier attachment:rc.local dans /etc/
Et le fichier attachment:tetaneutral-openstack-routing-daemon.sh dans /root/
On re-charge le fichier attachment:rc.local
<pre>
bash -x /etc/rc.local
</pre>
Sur h7.tetaneutral.net le routage est le suivant
<pre>
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
</pre>
h3. Preparation de la VM de management, le controlleur
h4. Installation des prérequis
<pre>
$ 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
</pre>
h4. Preparation de l'image de la VM
<pre>
$ 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*
</pre>
<pre>
$ 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
</pre>
_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:_
<pre>
+ '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
</pre>
_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.
h4. Installation de la VM
<pre>
$
$ 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
</pre>
Une fois connecté à la VM:
<pre>
$ 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
</pre>
Sur le puppetmaster:
<pre>
$ puppet ca sign openstack.tetaneutral.net
</pre>
_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:
<pre>
$ 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
</pre>
Il ne doit plus y avoir d'erreur la 3°/4° fois.
h3. Configuration des hyperviseurs
Une fois la configuration réseau faite, tout ce fait avec puppet:
<pre>
$ 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
</pre>
Sur le puppetmaster:
<pre>
$ puppet ca sign openstack.tetaneutral.net
</pre>
_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:
<pre>
$ 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
</pre>
Il ne doit plus y avoir d'erreur la 3°/4° fois.
h4. Information sur la configuration d'un hyperviseur sur le puppet master
La configuration puppet ressemble à :
<pre>
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": }
}
</pre>
h3. 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:
<pre>
$ virsh shutdown openstack
$ rbd -p disks import /var/lib/ceph/osd/ceph-0/openstack.raw openstack-disk
$ virsh edit openstack
</pre>
Remplacer:
<pre>
<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>
</pre>
Par:
<pre>
<disk type='network' device='disk'>
<driver name='qemu' type='raw'/>
<source protocol='rbd' name='disks/openstack-disk'>
<host name='192.168.99.101' port='6789'/>
<host name='192.168.99.102' port='6789'/>
<host name='192.168.99.103' port='6789'/>
</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>
</pre>
La clé ceph pour libvirt a déjà été installé par puppet pour avoir sont uuid:
<pre>
$ virsh secret-list
UUID Usage
--------------------------------------------------------------------------------
1fe74663-8dfa-486c-bb80-3bd94c90c967 ceph client.openstack-service secret
</pre>
Puis on démarre
<pre>
$ virsh start openstack
</pre>
Ca marche !
<pre>
$ 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:~#
</pre>
h2. Preparation des OSD pour ceph
h3. Cas général un disque entier:
<pre>
$ ceph-disk prepare /dev/sdb
$ ceph-disk activate /dev/sdb1
$ smartctl --smart=on /dev/sdb # Pour le monitoring.
</pre>
h3. 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
<pre>
$ fdisk /dev/sda
n
p
<enter>
<enter>
<enter>
<enter>
w
$ partprobe
</pre>
On prepare le disk comme normalement
<pre>
ceph-disk prepare /dev/sda2
ceph-disk activate /dev/sda2
</pre>
Le disque n'étant pas utilisé uniquement par ceph, le service ceph ne le chargera pas automatiquement:
Il faut ajouter ceci dans le /etc/rc.local:
<pre>
ceph-disk activate /dev/sda2
</pre>
h3. Suppression OSD:
<pre>
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
</pre>
h2. 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:
<pre>
(OSDs * 100)
Total PGs = ( ------------ )
OSD per object
</pre>
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:
<pre>
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
</pre>
_ref: http://ceph.com/docs/master/rados/operations/placement-groups/_
h2. 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).
h3. 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):
<pre>
[global]
osd crush update on start = false
</pre>
Création de l'arbre de rangement physique des SSD, l'arbre nommé 'default' sera donc celui des disques durs
<pre>
$ 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
</pre>
On range les osd qui ont des disques SSD dans ce nouvel arbre.
<pre>
$ ceph osd crush add osd.3 1 root=ssd host=g1-ssd
$ ceph osd crush add osd.4 1 root=ssd host=g2-ssd
$ ceph osd crush add osd.5 1 root=ssd host=g3-ssd
# Ou si l'osd a déjà éte positionné une fois
$ ceph osd crush set osd.3 1 root=ssd host=g1-ssd
$ ceph osd crush set osd.4 1 root=ssd host=g2-ssd
$ ceph osd crush set osd.5 1 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
</pre>
h3. Definition de la crushmap de ttnn
Une fois la crushmap modifié on créée et applique la règle sur le pool ssds:
<pre>
$ 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
</pre>
Il faut ensuite attendre que ceph redistribue les data comme on lui a demandé, on peut suivre l'avancement avec :
<pre>
ceph -s
</pre>
h2. Activer le cache-tiering
http://ceph.com/docs/master/rados/operations/cache-tiering/
<pre>
ceph mkpool ssd-cache
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]
# 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 8
ceph osd pool set ssd-cache hit_set_period 3600
</pre>
h2. Migration IP ceph
Au besoin pour passer cluster de test a dev
* http://ceph.com/docs/master/rados/operations/add-or-rm-mons/#changing-a-monitor-s-ip-address-the-messy-way
* http://ceph.com/docs/master/rados/operations/add-or-rm-mons/#changing-a-monitor-s-ip-address-the-right-way
h2. Management d'openstack
h3. Exemple de migration de ganeti à openstack:
Sur h4:
<pre>
$ gnt-instance stop VMNAME.tetaneutral.net
$ gnt-instance activate-disks VMNAME.tetaneutral.net
h5.tetaneutral.net:disk/0:/dev/drbd34
</pre>
Sur g1, mettre l'image dans glance
<pre>
name=VMNAME.tetaneutral.net
</pre>
Crée un volume (remplacer 20 par la taille du disque désiré):
<pre>
cinder create --volume_type ceph --display-name ${name}-bootdisk 20 # mettre ici un peu plus grand que le vrai disque.
volume_id=$(cinder show ${name}-bootdisk | awk '/ id /{print $4}')
</pre>
On remplace le volume rbd par le disque de la VM:
<pre>
rbd -p disks mv volume-$volume_id disks/volume-${volume_id}.old
socat -u tcp4-listen:505555 - | rbd -p disks import - volume-$volume_id
</pre>
Sur la machine hX qui as le disque (ici h5 et le disque drbd34)
<pre>
cat /dev/drbd34 | socat -u - tcp4:g1:505555
# ou avec une bar de progression
apt-get install pv
pv /dev/drbd34 | socat -u - tcp4:g1:505555
</pre>
<pre>
# On peut voir l'avancement via:
watch -n1 -- rbd -p disks info volume-$volume_id
</pre>
On change la taille de l'image pour mettre la meme que le volume créé par openstack
<pre>
rbd -p disks info volume-$volume_id.old
rbd image 'volume-$volume_id.old':
size 20480 MB in 5120 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.752a15a94252f
format: 2
features: layering
rbd -p disks resize --size 20480 volume-$volume_id
</pre>
Booter la VM avec ce disque (le disque existant déjà le script l'utilisera):
<pre>
./boot-vm.sh --ip 91.224.149.253 ${name}
</pre>
_Note: Si le disque a été agrandi, on peut utiliser dans la VM "growpart /dev/vda 1" pour récupérer l'espace disponible_
Supprimer l'image d'origine
<pre>
glance image-delete temp-$name
</pre>
Quand c'est fini sur h4:
<pre>
gnt-instance deactivate-disks VMNAME.tetaneutral.net
</pre>
h2. Maintenance de la VM de management
h3. Live Migration d'un host à l'autre
Cela fait tout à notre place niveau kvm/libvirt/ceph
<pre>
virsh migrate --persistent --undefinesource --live --p2p openstack qemu+ssh://g2:2222/system
</pre>
Pour le réseau le service/script 'tetaneutral-openstack-routing-daemon.sh' s'occupe de basculer les routes automatiquement.
h3. Recover depuis une perte de la machine hote:
Créé un fichier openstack.xml à partir d'un backup de '/etc/libvirt/qemu/openstack.xml' ou utiliser l'exemple ici: attachment:openstack.xml
_Note: il faut surement viré les uuid des interfaces openvswitch qui sont différent suivant le hosts_
Puis on recréé la VM
<pre>
$ virsh create openstack.xml
$ virsh start openstack.xml
</pre>
h3. Opération sur les VMs
h4. Ajout d'une interface réseau à une VM:
<pre>
$ neutron net-list | grep vlan3199
| 460f49ce-f5ed-449e-9e0f-7626bcee4379 | vlan3199 | ba3f12af-074a-4a31-9a7c-a621993e13bb 192.168.99.0/24 |
$ neutron port-create 460f49ce-f5ed-449e-9e0f-7626bcee4379 --name nagios-eth2 --fixed-ips type=dict list=true ip_address=192.168.99.248
Created a new port:
+-----------------------+---------------------------------------------------------------------------------------+
| Field | Value |
+-----------------------+---------------------------------------------------------------------------------------+
| admin_state_up | True |
| allowed_address_pairs | |
| binding:host_id | |
| binding:profile | {} |
| binding:vif_details | {} |
| binding:vif_type | unbound |
| binding:vnic_type | normal |
| device_id | |
| device_owner | |
| fixed_ips | {"subnet_id": "ba3f12af-074a-4a31-9a7c-a621993e13bb", "ip_address": "192.168.99.248"} |
| id | 918e0ec7-0909-423c-9a67-15b5ef7c7ae0 |
| mac_address | fa:16:3e:6b:32:07 |
| name | nagios-eth2 |
| network_id | 460f49ce-f5ed-449e-9e0f-7626bcee4379 |
| security_groups | b6d5b5fb-a053-4f97-b964-9e1a12d243b1 |
| status | DOWN |
| tenant_id | ed980105f9d047e2bee738b3f261f126 |
+-----------------------+---------------------------------------------------------------------------------------+
$ nova interface-attach --port-id 918e0ec7-0909-423c-9a67-15b5ef7c7ae0 nagios.tetaneutral.net
</pre>
Dans la VM:
<pre>
$ dmesg | tail
[ 1315.826088] virtio-pci 0000:00:06.0: using default PCI settings
[ 1315.826102] virtio-pci 0000:00:07.0: no hotplug settings from platform
[ 1315.826102] virtio-pci 0000:00:07.0: using default PCI settings
[ 1315.826116] pci 0000:00:08.0: no hotplug settings from platform
[ 1315.826117] pci 0000:00:08.0: using default PCI settings
[ 1315.826382] virtio-pci 0000:00:08.0: enabling device (0000 -> 0003)
[ 1315.829281] virtio-pci 0000:00:08.0: setting latency timer to 64
[ 1315.829535] virtio-pci 0000:00:08.0: irq 50 for MSI/MSI-X
[ 1315.829555] virtio-pci 0000:00:08.0: irq 51 for MSI/MSI-X
[ 1315.829563] virtio-pci 0000:00:08.0: irq 52 for MSI/MSI-X
$ ip l show dev eth2
4: eth2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000
link/ether fa:16:3e:6b:32:07 brd ff:ff:ff:ff:ff:ff
$ tail -4 /etc/network/interfaces
auto eth2
iface eth2 inet static
address 192.168.99.248
netmask 255.255.255.0
$ ifup eth2
$ ping 192.169.99.250
PING 192.169.99.250 (192.169.99.250) 56(84) bytes of data.
64 bytes from 192.169.99.250: icmp_req=1 ttl=119 time=170 ms
64 bytes from 192.169.99.250: icmp_req=2 ttl=119 time=204 ms
^C
</pre>
</pre>
h1. Openstack Installation tetaneutral.net
h2. Liens
* http://ceph.com/docs/master/rados/operations/cache-tiering/
* http://ceph.com/docs/master/rados/operations/crush-map/
h2. 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
h2. Installation
Le setup installé est composé 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.
h3. Information sur le puppet master:
La conf et modules puppet utilisé par tetaneutral.net ce trouve 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 c'est 3 classes sont spécifique à tetaneutral, 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
h3. Préparation réseaux des hosts:
Preparation des bridges openvswitch:
<pre>
$ 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
</pre>
_note: Les bridges openvswitch sont mémorisés et recréés automatiquement par le service openvswitch-switch_
On install le fichier attachment:rc.local dans /etc/
Et le fichier attachment:tetaneutral-openstack-routing-daemon.sh dans /root/
On re-charge le fichier attachment:rc.local
<pre>
bash -x /etc/rc.local
</pre>
Sur h7.tetaneutral.net le routage est le suivant
<pre>
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
</pre>
h3. Preparation de la VM de management, le controlleur
h4. Installation des prérequis
<pre>
$ 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
</pre>
h4. Preparation de l'image de la VM
<pre>
$ 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*
</pre>
<pre>
$ 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
</pre>
_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:_
<pre>
+ '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
</pre>
_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.
h4. Installation de la VM
<pre>
$
$ 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
</pre>
Une fois connecté à la VM:
<pre>
$ 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
</pre>
Sur le puppetmaster:
<pre>
$ puppet ca sign openstack.tetaneutral.net
</pre>
_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:
<pre>
$ 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
</pre>
Il ne doit plus y avoir d'erreur la 3°/4° fois.
h3. Configuration des hyperviseurs
Une fois la configuration réseau faite, tout ce fait avec puppet:
<pre>
$ 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
</pre>
Sur le puppetmaster:
<pre>
$ puppet ca sign openstack.tetaneutral.net
</pre>
_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:
<pre>
$ 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
</pre>
Il ne doit plus y avoir d'erreur la 3°/4° fois.
h4. Information sur la configuration d'un hyperviseur sur le puppet master
La configuration puppet ressemble à :
<pre>
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": }
}
</pre>
h3. 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:
<pre>
$ virsh shutdown openstack
$ rbd -p disks import /var/lib/ceph/osd/ceph-0/openstack.raw openstack-disk
$ virsh edit openstack
</pre>
Remplacer:
<pre>
<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>
</pre>
Par:
<pre>
<disk type='network' device='disk'>
<driver name='qemu' type='raw'/>
<source protocol='rbd' name='disks/openstack-disk'>
<host name='192.168.99.101' port='6789'/>
<host name='192.168.99.102' port='6789'/>
<host name='192.168.99.103' port='6789'/>
</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>
</pre>
La clé ceph pour libvirt a déjà été installé par puppet pour avoir sont uuid:
<pre>
$ virsh secret-list
UUID Usage
--------------------------------------------------------------------------------
1fe74663-8dfa-486c-bb80-3bd94c90c967 ceph client.openstack-service secret
</pre>
Puis on démarre
<pre>
$ virsh start openstack
</pre>
Ca marche !
<pre>
$ 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:~#
</pre>
h2. Preparation des OSD pour ceph
h3. Cas général un disque entier:
<pre>
$ ceph-disk prepare /dev/sdb
$ ceph-disk activate /dev/sdb1
$ smartctl --smart=on /dev/sdb # Pour le monitoring.
</pre>
h3. 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
<pre>
$ fdisk /dev/sda
n
p
<enter>
<enter>
<enter>
<enter>
w
$ partprobe
</pre>
On prepare le disk comme normalement
<pre>
ceph-disk prepare /dev/sda2
ceph-disk activate /dev/sda2
</pre>
Le disque n'étant pas utilisé uniquement par ceph, le service ceph ne le chargera pas automatiquement:
Il faut ajouter ceci dans le /etc/rc.local:
<pre>
ceph-disk activate /dev/sda2
</pre>
h3. Suppression OSD:
<pre>
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
</pre>
h2. 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:
<pre>
(OSDs * 100)
Total PGs = ( ------------ )
OSD per object
</pre>
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:
<pre>
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
</pre>
_ref: http://ceph.com/docs/master/rados/operations/placement-groups/_
h2. 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).
h3. 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):
<pre>
[global]
osd crush update on start = false
</pre>
Création de l'arbre de rangement physique des SSD, l'arbre nommé 'default' sera donc celui des disques durs
<pre>
$ 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
</pre>
On range les osd qui ont des disques SSD dans ce nouvel arbre.
<pre>
$ ceph osd crush add osd.3 1 root=ssd host=g1-ssd
$ ceph osd crush add osd.4 1 root=ssd host=g2-ssd
$ ceph osd crush add osd.5 1 root=ssd host=g3-ssd
# Ou si l'osd a déjà éte positionné une fois
$ ceph osd crush set osd.3 1 root=ssd host=g1-ssd
$ ceph osd crush set osd.4 1 root=ssd host=g2-ssd
$ ceph osd crush set osd.5 1 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
</pre>
h3. Definition de la crushmap de ttnn
Une fois la crushmap modifié on créée et applique la règle sur le pool ssds:
<pre>
$ 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
</pre>
Il faut ensuite attendre que ceph redistribue les data comme on lui a demandé, on peut suivre l'avancement avec :
<pre>
ceph -s
</pre>
h2. Activer le cache-tiering
http://ceph.com/docs/master/rados/operations/cache-tiering/
<pre>
ceph mkpool ssd-cache
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]
# 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 8
ceph osd pool set ssd-cache hit_set_period 3600
</pre>
h2. Migration IP ceph
Au besoin pour passer cluster de test a dev
* http://ceph.com/docs/master/rados/operations/add-or-rm-mons/#changing-a-monitor-s-ip-address-the-messy-way
* http://ceph.com/docs/master/rados/operations/add-or-rm-mons/#changing-a-monitor-s-ip-address-the-right-way
h2. Management d'openstack
h3. Exemple de migration de ganeti à openstack:
Sur h4:
<pre>
$ gnt-instance stop VMNAME.tetaneutral.net
$ gnt-instance activate-disks VMNAME.tetaneutral.net
h5.tetaneutral.net:disk/0:/dev/drbd34
</pre>
Sur g1, mettre l'image dans glance
<pre>
name=VMNAME.tetaneutral.net
</pre>
Crée un volume (remplacer 20 par la taille du disque désiré):
<pre>
cinder create --volume_type ceph --display-name ${name}-bootdisk 20 # mettre ici un peu plus grand que le vrai disque.
volume_id=$(cinder show ${name}-bootdisk | awk '/ id /{print $4}')
</pre>
On remplace le volume rbd par le disque de la VM:
<pre>
rbd -p disks mv volume-$volume_id disks/volume-${volume_id}.old
socat -u tcp4-listen:505555 - | rbd -p disks import - volume-$volume_id
</pre>
Sur la machine hX qui as le disque (ici h5 et le disque drbd34)
<pre>
cat /dev/drbd34 | socat -u - tcp4:g1:505555
# ou avec une bar de progression
apt-get install pv
pv /dev/drbd34 | socat -u - tcp4:g1:505555
</pre>
<pre>
# On peut voir l'avancement via:
watch -n1 -- rbd -p disks info volume-$volume_id
</pre>
On change la taille de l'image pour mettre la meme que le volume créé par openstack
<pre>
rbd -p disks info volume-$volume_id.old
rbd image 'volume-$volume_id.old':
size 20480 MB in 5120 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.752a15a94252f
format: 2
features: layering
rbd -p disks resize --size 20480 volume-$volume_id
</pre>
Booter la VM avec ce disque (le disque existant déjà le script l'utilisera):
<pre>
./boot-vm.sh --ip 91.224.149.253 ${name}
</pre>
_Note: Si le disque a été agrandi, on peut utiliser dans la VM "growpart /dev/vda 1" pour récupérer l'espace disponible_
Supprimer l'image d'origine
<pre>
glance image-delete temp-$name
</pre>
Quand c'est fini sur h4:
<pre>
gnt-instance deactivate-disks VMNAME.tetaneutral.net
</pre>
h2. Maintenance de la VM de management
h3. Live Migration d'un host à l'autre
Cela fait tout à notre place niveau kvm/libvirt/ceph
<pre>
virsh migrate --persistent --undefinesource --live --p2p openstack qemu+ssh://g2:2222/system
</pre>
Pour le réseau le service/script 'tetaneutral-openstack-routing-daemon.sh' s'occupe de basculer les routes automatiquement.
h3. Recover depuis une perte de la machine hote:
Créé un fichier openstack.xml à partir d'un backup de '/etc/libvirt/qemu/openstack.xml' ou utiliser l'exemple ici: attachment:openstack.xml
_Note: il faut surement viré les uuid des interfaces openvswitch qui sont différent suivant le hosts_
Puis on recréé la VM
<pre>
$ virsh create openstack.xml
$ virsh start openstack.xml
</pre>
h3. Opération sur les VMs
h4. Ajout d'une interface réseau à une VM:
<pre>
$ neutron net-list | grep vlan3199
| 460f49ce-f5ed-449e-9e0f-7626bcee4379 | vlan3199 | ba3f12af-074a-4a31-9a7c-a621993e13bb 192.168.99.0/24 |
$ neutron port-create 460f49ce-f5ed-449e-9e0f-7626bcee4379 --name nagios-eth2 --fixed-ips type=dict list=true ip_address=192.168.99.248
Created a new port:
+-----------------------+---------------------------------------------------------------------------------------+
| Field | Value |
+-----------------------+---------------------------------------------------------------------------------------+
| admin_state_up | True |
| allowed_address_pairs | |
| binding:host_id | |
| binding:profile | {} |
| binding:vif_details | {} |
| binding:vif_type | unbound |
| binding:vnic_type | normal |
| device_id | |
| device_owner | |
| fixed_ips | {"subnet_id": "ba3f12af-074a-4a31-9a7c-a621993e13bb", "ip_address": "192.168.99.248"} |
| id | 918e0ec7-0909-423c-9a67-15b5ef7c7ae0 |
| mac_address | fa:16:3e:6b:32:07 |
| name | nagios-eth2 |
| network_id | 460f49ce-f5ed-449e-9e0f-7626bcee4379 |
| security_groups | b6d5b5fb-a053-4f97-b964-9e1a12d243b1 |
| status | DOWN |
| tenant_id | ed980105f9d047e2bee738b3f261f126 |
+-----------------------+---------------------------------------------------------------------------------------+
$ nova interface-attach --port-id 918e0ec7-0909-423c-9a67-15b5ef7c7ae0 nagios.tetaneutral.net
</pre>
Dans la VM:
<pre>
$ dmesg | tail
[ 1315.826088] virtio-pci 0000:00:06.0: using default PCI settings
[ 1315.826102] virtio-pci 0000:00:07.0: no hotplug settings from platform
[ 1315.826102] virtio-pci 0000:00:07.0: using default PCI settings
[ 1315.826116] pci 0000:00:08.0: no hotplug settings from platform
[ 1315.826117] pci 0000:00:08.0: using default PCI settings
[ 1315.826382] virtio-pci 0000:00:08.0: enabling device (0000 -> 0003)
[ 1315.829281] virtio-pci 0000:00:08.0: setting latency timer to 64
[ 1315.829535] virtio-pci 0000:00:08.0: irq 50 for MSI/MSI-X
[ 1315.829555] virtio-pci 0000:00:08.0: irq 51 for MSI/MSI-X
[ 1315.829563] virtio-pci 0000:00:08.0: irq 52 for MSI/MSI-X
$ ip l show dev eth2
4: eth2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000
link/ether fa:16:3e:6b:32:07 brd ff:ff:ff:ff:ff:ff
$ tail -4 /etc/network/interfaces
auto eth2
iface eth2 inet static
address 192.168.99.248
netmask 255.255.255.0
$ ifup eth2
$ ping 192.169.99.250
PING 192.169.99.250 (192.169.99.250) 56(84) bytes of data.
64 bytes from 192.169.99.250: icmp_req=1 ttl=119 time=170 ms
64 bytes from 192.169.99.250: icmp_req=2 ttl=119 time=204 ms
^C
</pre>
</pre>