Openstack Installation TTNN » Historique » Version 88
Version 87 (Mehdi Abaakouk, 25/08/2014 15:14) → Version 88/252 (Mehdi Abaakouk, 26/08/2014 12:52)
{{>toc}}
h1. Openstack Installation TTNN
h2. Liens
* http://ceph.com/docs/master/rados/operations/cache-tiering/
* http://ceph.com/docs/master/rados/operations/crush-map/
h2. 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
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:
> 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:
Voici le fichier rc.local d'un hyperviseur (g1)
<pre>
#!/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
ip link add link eth0 name eth0.3175 type vlan id 3175
ip link set eth0.3175 up
ip link add link eth0 name eth0.3195 type vlan id 3195
ip link set eth0.3195 up
brctl addbr br-admin
brctl addif eth0.3175
ip link set br-admin up
ip addr add 192.168.3.101/24 dev br-admin
brctl addbr br-net
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
exit 0
</pre>
_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
<pre>
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
</pre>
Ainsi que ceci le temps de l'installation
<pre>
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
</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 appliquer les patches de au-dessus à openstack-debian-images
</pre>
h4. Preparation de l'image de la VM
On notera les ip temporaire 192.168.3.100
<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.248/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:f800::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.99
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
$ 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. Préparation du réseau
<pre>
$ ip route add 89.234.156.248/32 dev br-net
$ ip -6 route add 2a01:6600:8083:f800::/56 dev br-net
$ modprobe vhost-net
</pre>
h4. Installation de la VM
<pre>
$ 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
$ virsh start openstack
$ ssh root@89.234.156.248 -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 faire 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 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:}
# La liste des disques dur à utiliser dans ceph
ttnn_ceph_osd {"/dev/sdb": }
ttnn_ceph_osd {"/dev/sdc": }
# La partie Openstack, l'uuid doit être unique par machine (générer avec uuid-gen)
ttnn_os_compute {"9d26ec10-a48b-4f0f-a122-f10ed16d270f": }
# La correction d'un petit bug :)
class {'ttnn_os_configdrive_ceph_fix': }
}
</pre>
h3. Déplacement du controlleur dans openstack (Work In Progress)
Générer d'abort une image debian jessie
<pre>
$ cat > os.conf <<EOF
export OS_AUTH_URL=http://89.234.156.248:5000/v2.0/
export OS_USERNAME=admin
export OS_TENANT_NAME=ttnn_admin
export OS_PASSWORD=<password>
EOF
$ source os.conf
$ # Upload de l'image
$ glance image-create --progress --name debian-jessie-7.0.0-3-amd64 openstack-controlleur --disk-format raw --container-format bare < debian-jessie-7.0.0-3-amd64.raw /openstack-to-upload.raw
[=============================>] 100%
# glance image-list | grep jessie +------------------+--------------------------------------+
| c81df9d4-8786-4f77-b84b-8409f1f11018 | debian-jessie-7.0.0-3-amd64 | raw Property | bare Value | 1073741824 | active |
$ netid_net=$(neutron net-list | awk '/ttnn-net/{print $2}') +------------------+--------------------------------------+
$ netid_admin=$(neutron net-list | awk '/ttnn-admin/{print $2}')
$ nova boot --nic net-id=$netid_net,v4-fixed-ip=89.234.156.249 --nic net-id=$netid_admin,v4-fixed-ip=192.168.3.100 --block-device source=image,id=c81df9d4-8786-4f77-b84b-8409f1f11018,shutdown=preserve,dest=volume,bootindex=0,size=50 --flavor m1.medium --poll openstack.tetaneutral.net --config-drive false
+--------------------------------------+-------------------------------------------------+
checksum | Property 493517836ee82ad4110254555d379d76 | Value |
+--------------------------------------+-------------------------------------------------+
| OS-DCF:diskConfig container_format | MANUAL bare |
| OS-EXT-AZ:availability_zone created_at | nova 2014-08-06T15:01:08 |
| OS-EXT-SRV-ATTR:host deleted | - False |
| OS-EXT-SRV-ATTR:hypervisor_hostname deleted_at | - None |
| OS-EXT-SRV-ATTR:instance_name disk_format | instance-0000000b raw |
| OS-EXT-STS:power_state id | 0 89e8fffd-3311-4885-93a8-986e05c055f4 |
| OS-EXT-STS:task_state is_public | scheduling False |
| OS-EXT-STS:vm_state min_disk | building 0 |
| OS-SRV-USG:launched_at min_ram | - 0 |
| OS-SRV-USG:terminated_at name | - openstack-controlleur |
| accessIPv4 owner | 27764634d22248f4a7c8518899ff38c5 |
| accessIPv6 protected | False |
| adminPass size | 21474836480 |
| config_drive status | |
| created | 2014-08-26T09:19:34Z |
| flavor active | m1.medium (3) |
| hostId updated_at | 2014-08-06T15:11:22 |
| id virtual_size | 899b93b2-d5a0-4531-9f92-0b8103755fda None |
| image | Attempt to boot from +------------------+--------------------------------------+
$ # Creation d'un volume - no dans ceph de cette image supplied |
| key_name | - | $ cinder create --display-name openstack.tetaneutral.net-bootdisk --image-id 89e8fffd-3311-4885-93a8-986e05c055f4 25
| metadata | {} | </pre>
Into the old controlleur VM
<pre>
</pre>
<pre>
$ # Boot d'un VM avec de volume
$ netid_net=$(neutron net-list | name | openstack.tetaneutral.net | awk '/ttnn-net/{print $2}')
$ netid_admin=$(neutron net-list | os-extended-volumes:volumes_attached | [] | awk '/ttnn-admin/{print $2}')
| progress | 0 |
| security_groups | default |
| status | BUILD |
| tenant_id | 700f4abd173f472499a934eacf9730bd |
| updated | 2014-08-26T09:19:35Z |
| user_id | f5603324b48542eca4c34d3a32d725cb |
+--------------------------------------+-------------------------------------------------+
Server building... 0% complete $ nova boot --nic net-id=$netid_net,v4-fixed-ip=89.234.156.249 --nic net-id=$netid_admin,v4-fixed-ip=192.168.3.100 --block-device source=volume,id=$volume_id,shutdown=preserve,bootindex=0 --flavor m1.medium --poll openstack.tetaneutral.net
</pre>
h2. Preparation du Pool SSD pour ceph
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 ajoute dans la configuration puppet de l'hyperviseur ceci, avec le journal sur la partition de l'OS:
<pre>
ttnn_ceph_osd {"/dev/sda2": journal => "/var/lib/ceph/ssd-sda2-journal"}
</pre>
h3. Configuration de la crushmap de ceph:
REF: http://ceph.com/docs/master/rados/operations/crush-map/#getcrushmap
<pre>
$ ceph osd getcrushmap -o compiled-crushmap
$ crushtool -d compiled-crushmap -o crushmap.txt
# EDIT crushmap.txt
$ crushtool -c crushmap.txt -o compiled-crushmap
$ ceph osd setcrushmap -i compiled-crushmap
</pre>
h3. Definition de la crushmap de ttnn
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-ssh: 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.
Une fois la crushmap modifié on applique la règle sur le pool cinder-ssd:
<pre>
ceph osd pool set cinder-ssd 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>
La crushmap le jour de l'installation:
<pre>
# begin crush map
tunable choose_local_tries 0
tunable choose_local_fallback_tries 0
tunable choose_total_tries 50
tunable chooseleaf_descend_once 1
# devices
device 0 osd.0
device 1 osd.1
device 2 osd.2
device 3 osd.3
device 4 osd.4
device 5 osd.5
# types
type 0 osd
type 1 host
type 2 chassis
type 3 rack
type 4 row
type 5 pdu
type 6 pod
type 7 room
type 8 datacenter
type 9 region
type 10 root
host g3-ssd {
id -1 # do not change unnecessarily
alg straw
hash 0 # rjenkins1
item osd.3 weight 0.040
}
host g3-harddisk {
id -2 # do not change unnecessarily
alg straw
hash 0 # rjenkins1
item osd.0 weight 1.810
}
host g2-ssd {
id -3 # do not change unnecessarily
# weight 3.630
alg straw
hash 0 # rjenkins1
item osd.4 weight 0.000
}
host g2-harddisk {
id -4 # do not change unnecessarily
# weight 3.630
alg straw
hash 0 # rjenkins1
item osd.1 weight 3.630
}
host g1-ssd {
id -5 # do not change unnecessarily
# weight 3.630
alg straw
hash 0 # rjenkins1
item osd.5 weight 0.000
}
host g1-harddisk {
id -6 # do not change unnecessarily
# weight 3.630
alg straw
hash 0 # rjenkins1
item osd.2 weight 3.630
}
root harddrive {
id -7
alg straw
hash 0
item g1-harddisk weight 2.00
item g2-harddisk weight 2.00
item g3-harddisk weight 2.00
}
root ssd {
id -8
alg straw
hash 0
item g1-ssd weight 2.00
item g2-ssd weight 2.00
item g3-ssd weight 2.00
}
# rules
rule default {
ruleset 0
type replicated
min_size 1
max_size 10
step take harddrive
step chooseleaf firstn 0 type host
step emit
}
rule ssd {
ruleset 1
type replicated
min_size 1
max_size 10
step take ssd
step chooseleaf firstn 0 type host
step emit
}
# end crush map
</pre>
h2. Management d'openstack
h1. Openstack Installation TTNN
h2. Liens
* http://ceph.com/docs/master/rados/operations/cache-tiering/
* http://ceph.com/docs/master/rados/operations/crush-map/
h2. 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
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:
> 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:
Voici le fichier rc.local d'un hyperviseur (g1)
<pre>
#!/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
ip link add link eth0 name eth0.3175 type vlan id 3175
ip link set eth0.3175 up
ip link add link eth0 name eth0.3195 type vlan id 3195
ip link set eth0.3195 up
brctl addbr br-admin
brctl addif eth0.3175
ip link set br-admin up
ip addr add 192.168.3.101/24 dev br-admin
brctl addbr br-net
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
exit 0
</pre>
_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
<pre>
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
</pre>
Ainsi que ceci le temps de l'installation
<pre>
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
</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 appliquer les patches de au-dessus à openstack-debian-images
</pre>
h4. Preparation de l'image de la VM
On notera les ip temporaire 192.168.3.100
<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.248/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:f800::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.99
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
$ 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. Préparation du réseau
<pre>
$ ip route add 89.234.156.248/32 dev br-net
$ ip -6 route add 2a01:6600:8083:f800::/56 dev br-net
$ modprobe vhost-net
</pre>
h4. Installation de la VM
<pre>
$ 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
$ virsh start openstack
$ ssh root@89.234.156.248 -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 faire 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 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:}
# La liste des disques dur à utiliser dans ceph
ttnn_ceph_osd {"/dev/sdb": }
ttnn_ceph_osd {"/dev/sdc": }
# La partie Openstack, l'uuid doit être unique par machine (générer avec uuid-gen)
ttnn_os_compute {"9d26ec10-a48b-4f0f-a122-f10ed16d270f": }
# La correction d'un petit bug :)
class {'ttnn_os_configdrive_ceph_fix': }
}
</pre>
h3. Déplacement du controlleur dans openstack (Work In Progress)
Générer d'abort une image debian jessie
<pre>
$ cat > os.conf <<EOF
export OS_AUTH_URL=http://89.234.156.248:5000/v2.0/
export OS_USERNAME=admin
export OS_TENANT_NAME=ttnn_admin
export OS_PASSWORD=<password>
EOF
$ source os.conf
$ # Upload de l'image
$ glance image-create --progress --name debian-jessie-7.0.0-3-amd64 openstack-controlleur --disk-format raw --container-format bare < debian-jessie-7.0.0-3-amd64.raw /openstack-to-upload.raw
[=============================>] 100%
# glance image-list | grep jessie +------------------+--------------------------------------+
| c81df9d4-8786-4f77-b84b-8409f1f11018 | debian-jessie-7.0.0-3-amd64 | raw Property | bare Value | 1073741824 | active |
$ netid_net=$(neutron net-list | awk '/ttnn-net/{print $2}') +------------------+--------------------------------------+
$ netid_admin=$(neutron net-list | awk '/ttnn-admin/{print $2}')
$ nova boot --nic net-id=$netid_net,v4-fixed-ip=89.234.156.249 --nic net-id=$netid_admin,v4-fixed-ip=192.168.3.100 --block-device source=image,id=c81df9d4-8786-4f77-b84b-8409f1f11018,shutdown=preserve,dest=volume,bootindex=0,size=50 --flavor m1.medium --poll openstack.tetaneutral.net --config-drive false
+--------------------------------------+-------------------------------------------------+
checksum | Property 493517836ee82ad4110254555d379d76 | Value |
+--------------------------------------+-------------------------------------------------+
| OS-DCF:diskConfig container_format | MANUAL bare |
| OS-EXT-AZ:availability_zone created_at | nova 2014-08-06T15:01:08 |
| OS-EXT-SRV-ATTR:host deleted | - False |
| OS-EXT-SRV-ATTR:hypervisor_hostname deleted_at | - None |
| OS-EXT-SRV-ATTR:instance_name disk_format | instance-0000000b raw |
| OS-EXT-STS:power_state id | 0 89e8fffd-3311-4885-93a8-986e05c055f4 |
| OS-EXT-STS:task_state is_public | scheduling False |
| OS-EXT-STS:vm_state min_disk | building 0 |
| OS-SRV-USG:launched_at min_ram | - 0 |
| OS-SRV-USG:terminated_at name | - openstack-controlleur |
| accessIPv4 owner | 27764634d22248f4a7c8518899ff38c5 |
| accessIPv6 protected | False |
| adminPass size | 21474836480 |
| config_drive status | |
| created | 2014-08-26T09:19:34Z |
| flavor active | m1.medium (3) |
| hostId updated_at | 2014-08-06T15:11:22 |
| id virtual_size | 899b93b2-d5a0-4531-9f92-0b8103755fda None |
| image | Attempt to boot from +------------------+--------------------------------------+
$ # Creation d'un volume - no dans ceph de cette image supplied |
| key_name | - | $ cinder create --display-name openstack.tetaneutral.net-bootdisk --image-id 89e8fffd-3311-4885-93a8-986e05c055f4 25
| metadata | {} | </pre>
Into the old controlleur VM
<pre>
</pre>
<pre>
$ # Boot d'un VM avec de volume
$ netid_net=$(neutron net-list | name | openstack.tetaneutral.net | awk '/ttnn-net/{print $2}')
$ netid_admin=$(neutron net-list | os-extended-volumes:volumes_attached | [] | awk '/ttnn-admin/{print $2}')
| progress | 0 |
| security_groups | default |
| status | BUILD |
| tenant_id | 700f4abd173f472499a934eacf9730bd |
| updated | 2014-08-26T09:19:35Z |
| user_id | f5603324b48542eca4c34d3a32d725cb |
+--------------------------------------+-------------------------------------------------+
Server building... 0% complete $ nova boot --nic net-id=$netid_net,v4-fixed-ip=89.234.156.249 --nic net-id=$netid_admin,v4-fixed-ip=192.168.3.100 --block-device source=volume,id=$volume_id,shutdown=preserve,bootindex=0 --flavor m1.medium --poll openstack.tetaneutral.net
</pre>
h2. Preparation du Pool SSD pour ceph
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 ajoute dans la configuration puppet de l'hyperviseur ceci, avec le journal sur la partition de l'OS:
<pre>
ttnn_ceph_osd {"/dev/sda2": journal => "/var/lib/ceph/ssd-sda2-journal"}
</pre>
h3. Configuration de la crushmap de ceph:
REF: http://ceph.com/docs/master/rados/operations/crush-map/#getcrushmap
<pre>
$ ceph osd getcrushmap -o compiled-crushmap
$ crushtool -d compiled-crushmap -o crushmap.txt
# EDIT crushmap.txt
$ crushtool -c crushmap.txt -o compiled-crushmap
$ ceph osd setcrushmap -i compiled-crushmap
</pre>
h3. Definition de la crushmap de ttnn
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-ssh: 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.
Une fois la crushmap modifié on applique la règle sur le pool cinder-ssd:
<pre>
ceph osd pool set cinder-ssd 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>
La crushmap le jour de l'installation:
<pre>
# begin crush map
tunable choose_local_tries 0
tunable choose_local_fallback_tries 0
tunable choose_total_tries 50
tunable chooseleaf_descend_once 1
# devices
device 0 osd.0
device 1 osd.1
device 2 osd.2
device 3 osd.3
device 4 osd.4
device 5 osd.5
# types
type 0 osd
type 1 host
type 2 chassis
type 3 rack
type 4 row
type 5 pdu
type 6 pod
type 7 room
type 8 datacenter
type 9 region
type 10 root
host g3-ssd {
id -1 # do not change unnecessarily
alg straw
hash 0 # rjenkins1
item osd.3 weight 0.040
}
host g3-harddisk {
id -2 # do not change unnecessarily
alg straw
hash 0 # rjenkins1
item osd.0 weight 1.810
}
host g2-ssd {
id -3 # do not change unnecessarily
# weight 3.630
alg straw
hash 0 # rjenkins1
item osd.4 weight 0.000
}
host g2-harddisk {
id -4 # do not change unnecessarily
# weight 3.630
alg straw
hash 0 # rjenkins1
item osd.1 weight 3.630
}
host g1-ssd {
id -5 # do not change unnecessarily
# weight 3.630
alg straw
hash 0 # rjenkins1
item osd.5 weight 0.000
}
host g1-harddisk {
id -6 # do not change unnecessarily
# weight 3.630
alg straw
hash 0 # rjenkins1
item osd.2 weight 3.630
}
root harddrive {
id -7
alg straw
hash 0
item g1-harddisk weight 2.00
item g2-harddisk weight 2.00
item g3-harddisk weight 2.00
}
root ssd {
id -8
alg straw
hash 0
item g1-ssd weight 2.00
item g2-ssd weight 2.00
item g3-ssd weight 2.00
}
# rules
rule default {
ruleset 0
type replicated
min_size 1
max_size 10
step take harddrive
step chooseleaf firstn 0 type host
step emit
}
rule ssd {
ruleset 1
type replicated
min_size 1
max_size 10
step take ssd
step chooseleaf firstn 0 type host
step emit
}
# end crush map
</pre>
h2. Management d'openstack