Openstack Installation TTNN » Historique » Version 112
« Précédent -
Version 112/252
(diff) -
Suivant » -
Version actuelle
Mehdi Abaakouk, 27/08/2014 18:31
- Contenu
- Openstack Installation TTNN
- Liens
- Pending upstream fixes:
- Installation
- Preparation des OSD pour ceph
- Preparation du Pool SSD pour ceph
- Management d'openstack
Openstack Installation TTNN¶
Liens¶
- http://ceph.com/docs/master/rados/operations/cache-tiering/
- http://ceph.com/docs/master/rados/operations/crush-map/
Pending upstream fixes:¶
- build-debian-openstack-images, changes should be in next package version:
- Fix extlinux installation on jessie: http://anonscm.debian.org/cgit/openstack/openstack-debian-images.git/commit/?id=1a4ddceb99fb66f42f79e87a183d8e96952e5ac3
- Fix cloud-init setup with configdrive: http://anonscm.debian.org/cgit/openstack/openstack-debian-images.git/commit/?id=15cce87e2fa15b8952d69fb58711bfa88b21ef87
- Use Configdrive first for cloud-init: http://anonscm.debian.org/cgit/openstack/openstack-debian-images.git/commit/?id=1b1e1093d5ee525426382ad29b8219ab58f6656d
- nova:
- Fix live-migration avec ceph and configdrive:: https://review.openstack.org/#/c/112014/, si la solution est mergé upstream, j'appliquerai le patch au package debian
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)
- 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 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:
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:¶
Voici le fichier rc.local d'un hyperviseur (g1)
#!/bin/sh for i in /proc/sys/net/ipv6/conf/*; do for j in autoconf accept_ra; do echo 0 > $i/$j; done;done # https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt for i in /proc/sys/net/ipv4/conf/*/arp_announce; do echo 2 > $i;done echo 1 > /proc/sys/net/ipv4/ip_forward echo 1 > /proc/sys/net/ipv6/conf/all/forwarding ip link set eth0 up ip link add link eth0 name eth0.3131 type vlan id 3131 ip link set eth0.3131 up ip addr add 89.234.156.251/32 dev eth0.3131 ip route add 91.224.149.0/24 dev eth0.3131 ip route add default via 91.224.149.254 ip addr add 2a01:6600:8083:fb00::1/56 dev eth0.3131 ip route add default via fe80::31 dev eth0.3131 ip route add 89.234.156.250/32 dev eth0.3131 ip route add 89.234.156.252/32 dev eth0.3131 ip route add 89.234.156.253/32 dev eth0.3131 ovs_vlan_attach(){ bridge=$1 interface=$2 vlan=$3 ip=$4 # Clean ovs mess (it create the interface without vlan tag id) ovs-vsctl del-port ${bridge} ${interface}.${vlan} ip link del ${interface}.${vlan} ip link add link ${interface} name ${interface}.${vlan} type vlan id ${vlan} ip link set ${interface}.${vlan} up ovs-vsctl add-port ${bridge} ${interface}.${vlan} ip link set ${bridge} up [ "${ip}" ] && ip addr add ${ip} dev ${bridge} } ovs_vlan_attach br-admin eth0 3175 192.168.3.101/24 ovs_vlan_attach br-tsf eth0 3195 ip link set br-net up ip addr add fe80::31/64 dev br-net ip addr add 91.224.148.0/32 dev br-net for i in /etc/init.d/{ceph,nova-compute,neutron-plugin-*-agent} ; do $i restart done /root/tetaneutral-openstack-routing-daemon.sh -d is_openstack_vm_here=$(virsh list --all | awk '{if ($2 == "openstack") print $0}') if [ "$is_openstack_vm_here" ]; then virsh start openstack ip route add 89.234.156.249/32 dev br-net proto 42 ip -6 route add 2a01:6600:8083:f900::/56 dev br-net proto 42 fi exit 0
note: Les bridges openvswitch sont mémorisés et recréés automatiquement par le service openvswitch-switch
Sur h7.tetaneutral.net le routage est le suivant
ip route add 89.234.156.251/32 dev eth0.3131 ip route add 89.234.156.252/32 dev eth0.3131 ip route add 89.234.156.253/32 dev eth0.3131 ip route add 2a01:6600:8083:fb00::/56 dev eth0.3131 ip route add 2a01:6600:8083:fc00::/56 dev eth0.3131 ip route add 2a01:6600:8083:fd00::/56 dev eth0.3131
Ainsi que ceci le temps de l'installation
ip route add 89.234.156.248/32 via 89.234.156.251 # NOTE(sileht): temporairement pour le setup openstack ip route add 2a01:6600:8083:f800::/56 via 2a01:6600:8083:fb00::1 dev eth0.3131 # NOTE(sileht): temporairement pour le setup openstack
Preparation de la VM de management, le controlleur¶
Installation des prérequis¶
$ apt-get install libvirt-bin openstack-debian-images virtinst openvswitch-switch #NOTE(sileht): temporairement appliquer les patches de au-dessus à openstack-debian-images
Preparation de l'image de la VM¶
On notera les ip temporaire 192.168.3.100
$ 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.148.0/32 dev eth0 up ip route add default via 91.224.148.0 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 $ 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.
Préparation du réseau¶
$ modprobe vhost-net $ ovs-vsctl add-br br-net $ ip link set br-net up $ ovs-vsctl br-set-external-id br-net bridge-id br-net $ ip link set br-admin up $ ovs-vsctl br-set-external-id br-net bridge-id br-admin $ ovs-vsctl add-port br-admin eth0.3175 $ ip addr add 192.168.3.101/24 dev br-admin $ ip addr add fe80::31/64 dev br-net $ ip route add 89.234.156.249/32 dev br-net $ ip -6 route add 2a01:6600:8083:f900::/56 dev br-net
Installation de la VM¶
$ virt-install --name openstack --ram 2048 --network bridge=br-net,model=virtio --network bridge=br-admin,model=virtio --nographics --serial pty --wait -1 --noreboot --autostart --disk /openstack.raw,bus=virtio,cache=none,io=native --import $ EDITOR="sed -i -e \"s,<source bridge='br-net'/>,<source bridge='br-net'/><virtualport type='openvswitch' />,g\"" virsh edit openstack # Openvswitch is not yet supported by virt-install $ EDITOR="sed -i -e \"s,<source bridge='br-admin'/>,<source bridge='br-admin'/><virtualport type='openvswitch' />,g\"" virsh edit openstack # Openvswitch is not yet supported by virt-install $ 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 libvirt-raw
Sur g1, on remplace le disk de "instance-00000004" par celui de la vrai vm de management:
$ virsh shutdown openstack $ rbd -p libvirt-raw 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='libvirt-raw/openstack-disk'> <host name='192.168.3.101' port='6789'/> <host name='192.168.3.102' port='6789'/> <host name='192.168.3.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>
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 /dev/sdb
$ ceph-disk activate /dev/sdb
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
$ 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 /dev/sda2
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:
ceph-disk activate /dev/sda2
3. 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
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 4 pools:- nova: que nous n'allons pas utilisé mais que nova utilise pour stocker quelles fichiers pour le boot des VMs. (Il normalement utilisé si on créé pas préalablement de volume)
- cinder: ce pool sera le pool par défaut de création des disques
- cinder-ssd: sera le pool sur le quel on applique la politique de stockage numero 1
- glance: c'est la que seront stocké les images de VMs.
Configuration de la crushmap de ceph:¶
Création de l'arbre de ragnement 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 9.53 root default -2 3.84 host g1 0 3.63 osd.0 up 1 3 0.21 osd.3 up 1 -3 3.84 host g2 1 3.63 osd.1 up 1 4 0.21 osd.4 up 1 -4 1.85 host g3 2 1.81 osd.2 up 1 5 0.03999 osd.5 up 1
On range les osd qui ont des disques SSD dans ce nouvel arbre.
$ ceph osd crush set osd.3 0.21 root=ssd host=g1-ssd $ ceph osd crush set osd.4 0.21 root=ssd host=g2-ssd $ ceph osd crush set osd.5 0.03999 root=ssd host=g3-ssd $ ceph osd tree # id weight type name up/down reweight -5 0.46 root ssd -6 0.21 host g1-ssd 3 0.21 osd.3 up 1 -7 0.21 host g2-ssd 4 0.21 osd.4 up 1 -8 0.03998 host g3-ssd 5 0.03998 osd.5 up 1 -1 9.07 root default -2 3.63 host g1 0 3.63 osd.0 up 1 -3 3.63 host g2 1 3.63 osd.1 up 1 -4 1.81 host g3 2 1.81 osd.2 up 1
Et pour finir, on recalcul le poids de chaque OSD
ceph osd reweight-by-utilization
Definition de la crushmap de ttnn¶
Une fois la crushmap modifié on créée et applique la règle sur le pool cinder-ssd:
$ 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 cinder-ssd 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