Cluster Ganeti » Historique » Version 53
Version 52 (Fabien Dupont, 20/06/2013 00:42) → Version 53/135 (Fabien Dupont, 20/06/2013 13:31)
h1. Cluster Ganeti
{{>toc}}
h2. Liens
talk par iustin a google I/O sur ganeti : a 28:00 http://youtu.be/TELArK6SmyY
extlinux pour ganeti http://anonscm.debian.org/gitweb/?p=mirror/dsa-puppet.git;a=blob;f=modules/ganeti2/templates/instance-debootstrap/hooks/20-dsa-install-bootloader.erb;h=2bbba5e762b512c1c7b081049cf8ffd6cc472f96;hb=master
h2. Installation from scratch
h3. Ganeti
apt-get install ganeti2
h3. configuration LVM
Dans le fichier */etc/lvm/lvm.conf* changer le filter lvm pour:
<pre>
# filter = [ "a/.*/" ]
filter = ["r|/dev/cdrom|", "r|/dev/drbd[0-9]+|" ]
</pre>
Evite les soucis avec DRBD (ie: pour que la machine hôte ne detecte pas les LVM qui sont dans le VM lors du vgscan and co)
h3. configuration DRBD
* activer drbd
<pre>
#Â echo "options drbd minor_count=128 usermode_helper=/bin/true" >> /etc/modprobe.d/drbd-ganeti.conf
#Â rmmod drbd
# modprobe drbd
# cat /sys/module/drbd/parameters/usermode_helper
/bin/true
</pre>
h3. Partitionnement
<pre>
# fdisk /dev/sda
new primary part
hex code 8e
# partprobe
</pre>
h3. Création du VG pour ganeti
<pre>
pvcreate /dev/sda2
vgcreate vg_ganeti /dev/sda2
</pre>
S'il existe déjà vider le volume group et le recreer
<pre>
pvs
vgs
lvs
lvremove
vgcreate kvmvg /dev/sdb... #TODO check
</pre>
h3. Network
<pre>
# dans /etc/network/interfaces
# The primary network interface
auto eth0
iface eth0 inet manual
# dans /etc/rc.local
ip l set eth0 up
brctl addbr ganeti-br0
ip li set ganeti-br0 up
brctl addif ganeti-br0 eth0
ip a a 10.42.0.13/24 dev ganeti-br0
ip r a default via 10.42.0.1
</pre>
h3. DNS
<pre>
# Dans /etc/hosts
10.42.0.10 tmaster.thsf tmaster
10.42.0.11 t1.thsf t1
10.42.0.12 t2.thsf t2
10.42.0.13 t3.thsf t3
</pre>
h3. Ganeti Service
On master:
Initialiser le cluster:
<pre>
gnt-cluster init --nic-parameters mode=bridged,link=ganeti-br0 --master-netdev=ganeti-br0 \
--vg-name vg_ganeti --enabled-hypervisors=kvm tmaster.thsf
</pre>
Ajouter un noeud au cluster (t2):
<pre>
gnt-node add t2
</pre>
Installation d'outils d'administration de ganeti:
<pre>apt-get install ganeti-htools ganeti-instance-debootstrap</pre>
Ajout d'une VM
<pre># vi /etc/hosts
10.42.0.101 vm1.thsf vm1
gnt-cluster copyfile /etc/hosts
gnt-instance add -H kernel_path=/boot/vmlinuz-3.2.0-2-amd64,initrd_path=/boot/initrd.img-3.2.0-2-amd64 \
-t drbd -B memory=512M,vcpus=1 --disk 0:size=5G -I hail -o debootstrap+default vm1.thsf
</pre>
h2. Administration des VMs
h3. Création d'une VM sous FreeBSD (ou autre)
Exemple avec la VM anapivirtua :
Détermination du nÅud primaire de la VM (ici, h6) :
<pre>
# gnt-instance list anapivirtua.tetaneutral.net
Instance Hypervisor OS Primary_node Status Memory
anapivirtua.tetaneutral.net kvm debootstrap+squeeze64 h6.tetaneutral.net running 512M
</pre>
Téléchargement de l'ISO de FreeBSD sur le nÅud primaire :
<pre>
# cd ~/fab
# wget http://ftp.freebsd.org/pub/FreeBSD/releases/ISO-IMAGES/9.1/FreeBSD-9.1-RELEASE-amd64-bootonly.iso
</pre>
Sur le master ganeti (h4 actuellement) :
FreeBSD ne fonctionne bien qu'avec les cartes ETH émulée de type e1000 et les disques émulés en ide, de plus il ne faut pas que KVM boote un kernel et active la console :
<pre>
# gnt-instance modify -H serial_console=false anapivirtua.tetaneutral.net
# gnt-instance modify -H kernel_path="" anapivirtua.tetaneutral.net
# gnt-instance modify -H nic_type="e1000" anapivirtua.tetaneutral.net
# gnt-instance modify -H disk_type="ide" anapivirtua.tetaneutral.net
</pre>
Et on n'a plus qu'à démarrer sur le CD d'install :
<pre>
# gnt-instance start -H boot_order=cdrom,cdrom_image_path=/root/fab/FreeBSD-9.1-RELEASE-amd64-bootonly.iso anapivirtua.tetaneutral.net
</pre>
Retour sur le nÅud primaire, ouverture de VNC pour que l'adhérent puisse effectuer l'installation :
<pre>
# iptables -L -v -n | grep anapivirtua.tetaneutral.net
0 0 REJECT tcp -- * * !91.224.149.193 0.0.0.0/0 tcp dpt:12647 /* VNC for anapivirtua.tetaneutral.net */ reject-with icmp-port-unreachable
# iptables -D INPUT -p tcp ! -s 91.224.149.193 --dport 12647 -j REJECT
</pre>
Communiquer à l'adhérent l'IP et le port pour VNC (ici h6.tetaneutral.net:12647)
Une fois qu'il a fini l'installation, il faut refermer VNC et voilà !
<pre>
# iptables -A INPUT -p tcp ! -s 91.224.149.193 --dport 12647 -j REJECT -m comment --comment "VNC for anapivirtua.tetaneutral.net"
</pre>
h3. Backup et effacement d'une VM
Vers h2 :
<pre>
gnt-instance shutdown xxx
gnt-instance activate-disks xxx
VM=xxx.gz; cd /backup/ganeti-vm-raw/20130429 ; if [ ! -f ${VM} ]; then socat -u tcp4-listen:50555 - > $VM ; zcat $VM | md5sum -; du -hs *; else echo $VM already present;fi
DB=nnn; cat /dev/drbd$DB | gzip --fast|socat -u - tcp4:h2:50555;md5sum /dev/drbd$DB
gnt-instance deactivate-disks xxx
gnt-instance remove xxx
</pre>
h3. Gestion d'un gnt-instance migrate qui reste bloquer
Symptôme: la progression du "gnt-instance migrate <vmname>" ne progresse plus"
<pre>
# gnt-instance info -s nagios | grep 'node.:' -A1
nodeA: h4.tetaneutral.net, minor=18
nodeB: h6.tetaneutral.net, minor=27
port: 12589
</pre>
Donc si on regarde sur la machine primaire et secondaire l'état:
<pre>
# grep '18:' -A5 /proc/drbd # (et sur la secondaire: grep '27:' -A5 /proc/drbd)
0: cs:SyncSource st:Primary/Primary ds:UpToDate/UpToDate C r---
ns:601729944 nr:0 dw:0 dr:601737980 al:0 bm:429909 lo:0 pe:0 ua:0 ap:0 oos:0
[===================>] sync'ed:100.0% (965/6869678)M
stalled
</pre>
Si on tente un commande drbd on a:
<pre>
# drbdsetup /dev/drbd18 sh-status
(longue attente)
No response from the DRBD driver! Is the module loaded?
</pre>
Bref Drbd est dans les choux, ca semble être un bug connu des versions <= 8.3.12
Sources :
# http://www.mentby.com/Group/drbd-user/recovering-from-erroneous-sync-state.html
# http://lists.linbit.com/pipermail/drbd-dev/2007-May/000751.html
# https://encrypted.google.com/search?q=drbd+stall+100%25&hl=en
Pour réparer sur la machine h4, le node primaire, faire:
<pre>
# /etc/ganeti/iptables-to-reset-drbd-connection.sh 12589 # <-- 12589 le port de drbd récupéré plus haut
** Attention à être sur la bonne machine **
Pour couper la connection
iptables -I INPUT -p tcp --dport 12589 -j REJECT --reject-with tcp-reset
iptables -I INPUT -p tcp --sport 12589 -j REJECT --reject-with tcp-reset
iptables -I OUTPUT -p tcp --dport 12589 -j REJECT --reject-with tcp-reset
iptables -I OUTPUT -p tcp --sport 12589 -j REJECT --reject-with tcp-reset
Pour remettre la connection
iptables -D INPUT -p tcp --dport 12589 -j REJECT --reject-with tcp-reset
iptables -D INPUT -p tcp --sport 12589 -j REJECT --reject-with tcp-reset
iptables -D OUTPUT -p tcp --dport 12589 -j REJECT --reject-with tcp-reset
iptables -D OUTPUT -p tcp --sport 12589 -j REJECT --reject-with tcp-reset
</pre>
Exécuter la première partie puis vérifier dans /proc/drbd qui celui-ci est en WFConnection.
Puis rétablir la connexion avec la seconde partie et vérifier /proc/drbd que c'est bien reconnecté.
Ensuite si ganeti n'a pas vu la réparation, faire sur le master node et le node primaire de la machine:
<pre>
# /etc/init.d/ganeti restart
</pre>
Ceci passe en error le job de migration
Puis sur le master node, on nettoye les résidu de la migration échouée:
<pre>
# gnt-instance migrate --cleanup nagios
</pre>
h3. Gestion d'un disque en I/O error
First put the disk in failure offline:
<pre>echo offline > /sys/block/sdb/device/state</pre>
Then we need to remove the volume group, here /dev/kvmvg
We need to do it manually because vgremove will not work in this case
<pre>/dev/kvmvg# for i in *; do echo === $(date) == $i ; dmsetup remove /dev/kvmvg/"$i"; echo $?; done</pre>
This will leave a few lv when ganeti hasnt detected for some reason the disk failure.
For those left we need to force drbd to go Diskless, use either gnt-instance info or ls -l /var/run/ganeti/instance-disks/ or /var/lib/ganeti/config.data to find the VM and /dev/drbdNNN then
<pre>drbdsetup /dev/drbd47 detach</pre>
Then gnt-instance info VM to force ganeti to recognize the disk failure (it will take a few minutes)
Then dmsetup remove will work.
After the last dmsetup remove /dev/kvmvg will disappear.
Now you can physically remove the disk and plug a new disk on a new SATA port (on the same SATA port the kernel didn't recognize the new drive)
Then create a LVM partition then vgcreate kvmvg /dev/sdX
Now we need to recreate redundancy
On the still running VM you can use
<pre>gnt-instance replace-disks --submit -a VMname</pre>
On the stopped VM you need to do manually
<pre>gnt-instance replace-disks --submit -p VMname # if primary to reconstruct
gnt-instance replace-disks --submit -s VMname # if secondary to reconstruct</pre>
At 15 MByte/s 1 TB to reconstruct will take about 18h30.
Before remove the disk from the server, we must prepare the disk for unplug:
<pre>echo 1 > /sys/block/sdX/device/delete</pre>
Links:
http://docs.ganeti.org/ganeti/2.5/html/admin.html#preparing-for-disk-operations
http://docs.ganeti.org/ganeti/2.5/html/admin.html#generalized-storage-handling
http://www.lancealbertson.com/2011/02/handling-hdd-failures-with-ganeti/
http://www.sakana.fr/blog/2009/05/04/linux-sata-hot-plug-unplug/
h3. Demarrer et arrêter une instance ?
<pre>
gnt-instance start vm1
gnt-instance stop vm1
</pre>
Si pendant l'extinction de la VM le message suivant apparait:
<pre>WARNING: Could not shutdown block device disk/0 on node h6.tetaneutral.net: drbd45: can't shutdown drbd device: /dev/drbd45: State change failed: (-12) Device is held open by someone</pre>
Sur h6 on peut remarquer que l'on a un status non nominal sur drbd:
<pre>$ grep -A4 45: /proc/drbd
45: cs:WFConnection ro:Primary/Unknown ds:UpToDate/DUnknown C r----
ns:68584404 nr:0 dw:67728388 dr:2484540 al:535 bm:237 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
</pre>
Pour résoudre le probléme taper:
<pre>drbdsetup /dev/drbd45 down</pre>
Si le message persiste, il faut vérifier que plus aucun processus n'utilise le drbd45 sur h6, par exemple vérifier devmapper:
<pre>dmsetup ls | grep drbd45</pre>
Référence dans la doc ganeti: http://docs.ganeti.org/ganeti/2.5/html/walkthrough.html#in-use-disks-at-instance-shutdown
h3. Comment tout savoir sur une vm ?
<pre>
gnt-instance info vm1
</pre>
h3. Déplacement le(s) disque(s) dur d'une VM
Si la machine a ces disques au format plain (sans drbd), taper:
<pre>
gnt-instance stop vm1
gnt-instance move -n h6 vm1
gnt-instance start vm1
</pre>
Si la machine utilise drbd (uniquement le disque de la node secondaire bascule):
<pre>
gnt-instance replace-disks -n h6 vm1
</pre>
Si vous voulais déplacer l'autre disque du drbd, il faut basculer la machine, puis refaire la même chose
h3. Basculer/migrer une machine qui utilise drbd
Bascule avec arret de la machine:
<pre>
gnt-instance failover vm1
</pre>
Sans arrêt, migration à chaud:
<pre>
gnt-instance migrate vm1
</pre>
En cas de soucis primaire/secondaire:
<pre>
gnt-instance migrate --cleanup vm1
</pre>
cleanup marche en cas de split brain, example de /proc/drbd :
<pre>
h5: cs:WFConnection ro:Primary/Unknown ds:UpToDate/DUnknown C r----
h1: cs:StandAlone ro:Primary/Unknown ds:UpToDate/DUnknown r----
</pre>
h3. Création d'une machine
Un script est présent sur h1 voici ca doc:
<pre>
# /root/gnt-addvm
usage: gnt-addvm [options] VIRTUAL_MACHINE_HOSTNAME
-o OS | --os OS OS can be default natty32 natty64 sid64 squeeze32 squeeze64 wheezy64
-s SIZE | --size SIZE default SIZE is 10G
-m MEM | --mem MEM default MEM is 256M
-c CPU | --cpu CPU default CPU is 1
-n NODES | --nodes NODES default NODES is
-d MODE | --disk MODE default MODE is drbd
-q | --quick don't wait drbd sync
--dry-run show executed command
--cdrom PATH installation from iso file
</pre>
h3. Supprimer une machine
<pre>
gnt-instance remove vm1
</pre>
si la vm est en drbd et que une des nodes du drbd ne fonctionne plus
<pre>
gnt-instance remove --ignore-failures vm1
</pre>
h3. Changer les cractéristique d'une VM, upgrade disk, net, cpu, mem
Et hop une nouvelle carte réseau sur le vlan tsf
<pre>
gnt-instance modify --net add:link=br1 vm1
</pre>
Un petit disk en plus
<pre>
gnt-instance modify --disk add:size=50G vm1
</pre>
Un petite upgrade cpu et mémoire
<pre>
gnt-instance modify -B vcpus=2,memory=512M vm1
</pre>
Reboot pour prendre en compte le tout
<pre>
gnt-instance reboot -t full vm1
</pre>
== Je voudrais bien booter mon kernel ! ou un cdrom==
Je peux désactivé le kernel commun pour une vm
<pre>
gnt-instance modify -H kernel_path="" vm1
</pre>
Ou booter sur le cdrom pour le prochain démarrage commme ceci:
<pre>
gnt-instance start -H boot_order=cdrom,cdrom_image_path=/path/to/debian-504-amd64-netinst.iso vm1
</pre>
h3. Relocaliser les disques secondaires si un serveur est HS.
Ceci déplace le disque redondant (qui n'est plus présent si le serveur est HS) est le reconstruit sur un autre serveur
<pre>
gnt-instance replace-disks -I hail vm1
</pre>
h3. Importer une image disque venant de lâextérieur
Convertion de l'image au format raw (si c'est pas déjà le cas)
<pre>
kvm-img convert DISQUEVM.qcow -O raw DISQUEVM.raw
</pre>
Copie du disque au format raw sur un lvm
<pre>
size=$(kvm-img info DISQUEVM.raw | sed -n -e 's/^virtual size:[^(]*(\([[:digit:]]*\).*)/\1/gp')
lvcreate -L ${size}b -n lv_migration_DISQUEVM kvmvg
dd if=DISQUEVM.raw of=/dev/kvmvg/lv_migration_DISQUEVM
</pre>
Création de la VM
<pre>
gnt-instance add -B memory=512M --no-start -t plain -n $(hostname) --disk 0:adopt=lv_migration_DISQUEVM --net 0 -o debootstrap+default VMNAME.tetaneutral.net
</pre>
Et pour finir, on transforme le format de disque de la VM en drbd:
<pre>
gnt-instance modify -t drbd -n h6 VMNAME.tetaneutral.net
</pre>
h3. Copier une VM sur une autre machine
Seul la machine *h1* a l'espace configurer pour faire des dumps de machine virtuelle.
On lance un backup de celle-ci (attention cette commande *éteint* la machine):
<pre>
gnt-backup export -n h1 sileht2
</pre>
Les fichiers sont ensuite sur h1 dans /exports/sileht2.tetaneutral.net/
Le fichier qui nous intéresse est celui qui fini par *.snap* qui est le disque dur au format raw de la VM, dans mon cas:
<pre>
09d836a0-22e0-4ea4-9104-c301351bb2e2.disk0_data.snap
</pre>
Pour la démonstration je copie ce fichier sur h2:
<pre>
scp /exportfs/sileht2.tetaneutral.net/09d836a0-22e0-4ea4-9104-c301351bb2e2.disk0_data.snap h2:/root/sileht.raw
</pre>
Et je le test avec kvm:
<pre>
kvm -m 256 -drive file=sileht.raw,format=raw,if=virtio,boot=on,cache=writeback -usbdevice tablet -netdev type=tap,id=netdev0,fd=10 -device virtio-net-pci,mac=aa:00:00:62:e3:a0,netdev=netdev0
</pre>
A savoir l'image utilise les pilotes kvm "virtio", si on souhaite utiliser la VM avec un autre logiciel de virtualisation,
il faudra modifié le fstab pour mettre /dev/sda1 au lieu de /dev/vda1 et supprimer le fichier /etc/udev/rules.d/70-persistent-net.rules
h3. Backup disque seul
gnt-instance activate-disks VMNAME.tetaneutral.net
=> affiche le drbd
=> copie avec dd
puis gnt-instance deactivate-disks VMNAME.tetaneutral.net
h3. Monter une partition de machine virtuelle sur la machine hôte (!Attention DANGER!)
Sur le +master node+, arret de la machine et activation des disques
<pre>
$ gnt-instance stop VMNAME.tetaneutral.net
$ gnt-instance activate-disks VMNAME.tetaneutral.net
h5.tetaneutral.net:disk/0:/dev/drbd34
</pre>
Ensuite se connecter à la machine ou ganeti à préparer le disque, ici +h5+
Donc sur +h5+, pour voir les partitions du disque, ici le +/dev/drbd34+:
<pre>
kpartx -l /dev/drbd34
</pre>
Sur +h5+, on créé ensuite les partitions dans /dev avec devmapper
<pre>
kpartx -a /dev/drbd34
ls -la /dev/mapper/drbd34*
</pre>
Sur +h5+, a partir de maintenant on peut faire mumuse avec la partition, exemple:
<pre>
mount /dev/mapper/drbd34p1 /mnt/
....
umount /mnt
</pre>
Puis *très important*, il faut nettoyer devmapper, sur +h5+
<pre>
kpartx -d /dev/drbd34
</pre>
Et pour finir sur +master node+, on désactive les disques pour ganeti et on boot la vm:
<pre>
gnt-instance deactivate-disks VMNAME.tetaneutral.net
gnt-instance start VMNAME.tetaneutral.net
</pre>
h2. Administration des serveurs/nodes
h3. Ãteindre/rebooter provisoirement un des serveurs sans coupure de service
La procédure est la suivante:
- migration des machines virtuelles sur leurs secondaires
- Arret/Ralummage ou reboot du serveur
- remigration des machines virtuelles sur le serveur hX
<pre>
gnt-node migrate hX
shutdown -h now # ou reboot
hbal -L --no-disk-moves -X
</pre>
La resynchro drbd est automatique.
h3. L'extinction d'une node proprement dans le but de la désactivé du cluster
<pre>
gnt-node migrate hX # gnt-node failover hX
gnt-node evacuate -I hail hX
gnt-node modify -O yes hX
</pre>
Ici toutes les VMs seront migrés et les données auront été déplacé vers les autres nodes.
h3. Vérifier l'état du cluster
Sur le masternode normalement h1 faire:
<pre>
gnt-cluster verify
</pre>
h3. Change le node principal (masternode) de "ganeti", celui qui permet de lancer des commandes ganeti.
Allez sur un node, taper ceci et il deviendra "maternode":
<pre>
gnt-cluster master-failover
</pre>
h3. Gestion des fichiers de configuration (ie: /etc/ganeti, /etc/hosts, /etc/rc.local, ...)
Tous les fichiers de configuration à synchroniser entre toutes les nodes du cluster sont contenues dans ce script:
<pre>
/etc/ganeti/pushconf.sh
</pre>
Le lancer recopie ces fichiers du masternode vers les autres nodes.
h3. Désactiver un serveur qui serait HS du cluster provisoirement.
On bascule les machines qui n'ont pas le failover en automatique
<pre>
gnt-node failover [ --ignore-consistency ] h2
</pre>
le --ignore-consistency permet de forcer ganeti à ne pas contrôler le disk avant le basculement
On peux (optionnellement) déplacer les disques durs secondaires des VMs
<pre>
gnt-node evacuate [--early-release] -I hail hX
</pre>
le --early-release permet de forcer ganeti à ne pas contrôler le disk avant le basculement (utile si le disk de h2 est HS)
Puis on désactive la node:
<pre>
gnt-node modify -O yes h2
</pre>
h3. Réinsertion dans le cluster d'un node désactivé
- On réactive la node
- On remet dessus des machines et des disques en répartissant la charge du cluster
<pre>
gnt-node modify -O no h2
hbal -L -X
</pre>
h2. Setup d'un nouveau NODE
h3. Installation
* Installer squeeze basique avec juste ssh
* Ajouter wheezy dans /etc/apt/sources.list
<pre>
# deb http://ftp.fr.debian.org/debian/ squeeze main
deb http://ftp.fr.debian.org/debian/ squeeze main contrib non-free
deb-src http://ftp.fr.debian.org/debian/ squeeze main contrib non-free
deb http://ftp.fr.debian.org/debian/ sid main contrib non-free
deb-src http://ftp.fr.debian.org/debian/ sid main contrib non-free
deb http://ftp.de.debian.org/debian-backports/ squeeze-backports main contrib non-free
deb-src http://ftp.de.debian.org/debian-backports/ squeeze-backports main contrib non-free
deb http://security.debian.org/ squeeze/updates main
deb-src http://security.debian.org/ squeeze/updates main
# squeeze-updates, previously known as 'volatile'
deb http://ftp.fr.debian.org/debian/ squeeze-updates main
deb-src http://ftp.fr.debian.org/debian/ squeeze-updates main
</pre>
* Allouer un port avec 3131, 3175, 3195 tagged sur le procurve
* Monter le reseau manuellement IP X
<pre>
ip link add link eth0 name eth0.3131 type vlan id 3131
ip link set eth0.3131 up
ip addr add 91.224.149.15X/25 dev eth0.3131
</pre>
* Creer /etc/rc.local.conf avec X et Y
<pre>
IP_3131="91.224.149.15X/25"
GW_3131="91.224.149.254"
IP_3175="192.168.3.Y/24"
KVM_DISKS="sdb"
</pre>
* Installer les packages
<pre>
#TODO liste en fichier commit qqpart
#TODO: passer a une version compilée en local de ganeti pour eviter les update de version wheezy
dpkg --get-selections | ssh root@h48 dpkg --set-selections
ssh root@h48 apt-get dselect-upgrade
</pre>
* munin:
dans /etc/munin/munin-node.conf ajouter: allow ^91\.224\.149\.194$
* TODO patch munin Loic
http://trac.fsffrance.org/wiki/PatchInventory#Munin
* reboot
* Installer le node dans le cluster ganeti apres s'etre assure que la version de ganeti est bien la meme
<pre>
dpkg -l|grep -i ganeti
gnt-node add h48
/etc/ganeti/pushconf.sh
</pre>
Appliquer ce patch à ganeti-instance-debootstrap:
<pre>
--- /usr/share/ganeti/os/debootstrap/common.sh.ori 2010-09-15 22:34:12.000000000 +0200
+++ /usr/share/ganeti/os/debootstrap/common.sh 2011-07-27 12:33:55.695617766 +0200
@@ -91,7 +91,7 @@
# some versions of sfdisk need manual specification of
# head/sectors for devices such as drbd which don't
# report geometry
- sfdisk -H 255 -S 63 --quiet --Linux "$1" <<EOF
+ sfdisk -H 255 -S 63 -D --quiet --Linux "$1" <<EOF
0,,L,*
EOF
}
</pre>
Ci dessous ajouter dkms et r8168 si nécessaire.
h3. Pilotes additionnel
Sur h1,h2,h4,h5 et h6, le pilote (r8169.ko) de la carte réseau (r8168/8111) provoque des kernels panic, il a été remplacé la version du constructeur (r8168.ko).
Pilote dispo ici: (http://www.realtek.com/downloads/downloadsView.aspx?Langid=1&PNid=13&PFid=5&Level=5&Conn=4&DownTypeID=3&GetDown=false)
<pre>
apt-get install gcc dkms
cd /usr/src
wget http://url_to_pilot/r8168-8.024.00.tar.bz2
tar -xjf r8168-8.024.00.tar.bz2
cd r8168-8.024.00
cat > dkms.conf << EOF
PACKAGE_NAME=r8168
PACKAGE_VERSION=8.024.00
MAKE[0]="make"
BUILT_MODULE_NAME[0]=r8168
BUILT_MODULE_LOCATION[0]="src/"
DEST_MODULE_LOCATION[0]="/kernel/updates/dkms"
AUTOINSTALL="YES"
EOF
dkms add -m r8168 -v 8.024.00
dkms build -m r8168 -v 8.024.00
dkms install -m r8168 -v 8.024.00
echo "r8168" >> /etc/modules
echo "blacklist r8169" >> /etc/modprobe.d/blacklist-network.conf
update-initramfs -u
reboot
</pre>
Pour les machines a base de e1000e:
<pre>
apt-get install gcc dkms
cd /usr/src
wget http://downloadmirror.intel.com/15817/eng/e1000e-1.3.17.tar.gz
tar -xzf e1000e-1.3.17.tar.gz
cd e1000e-1.3.17
cat > dkms.conf << EOF
PACKAGE_NAME=e1000e
PACKAGE_VERSION=1.3.17
CLEAN="make -C src/ clean"
MAKE[0]="make -C src/"
BUILT_MODULE_NAME[0]=e1000e
BUILT_MODULE_LOCATION[0]="src/"
DEST_MODULE_LOCATION[0]="/kernel/updates/dkms"
AUTOINSTALL="YES"
EOF
dkms add -m e1000e -v 1.3.17
dkms build -m e1000e -v 1.3.17
dkms install -m e1000e -v 1.3.17
reboot
</pre>
h2. Annexe
h3. Configuration réseau
le script /etc/rc.local, qui s'occupe de préparer la configuration réseaux pour ganeti (avec les vlan, bridge and co)
le script /etc/rc.local.conf, contient les adresses IP de la machine et les gw
h3. Protection VNC
Le VNC de kvm est utiliser sur chaque MV.
Des règles de firewall sont automatiquement mise en place par le script /etc/ganeti/vnc-firewall pour que seul la machine gntwebmgr.tetaneutral.net soit autoriser a s'y connecter
Ce script est appelé par les hooks ganeti.
h3. Mac spoofing configuration (Actuellement désactivé)
Le script ifup de ganeti pour kvm a été modifier (ie: /etc/ganeti/kvm-vif-bridge) pour écrire la relation entre la vm, le numero de ces interfaces réseaux et ces tap.
Le fichier prends la forme suivante:
munin.tetaneutral.net:0:tap3
trac.tetaneutral.net:0:tap5
munin.tetaneutral.net:1:tap5
Les règles ebtables sont écrites par le script /etc/ganeti/spoofing/spoofing-protection avec les informations de ce fichier.
Les scripts de hook de ganeti (ie:/etc/ganeti/hook/) utilise ce script, pour lancer ou arreter le spoofing.
h3. Debootstrap du nouvelle ubuntu >= oneiric:
pour les ubuntu oneiric, precise et supérieur il faut créer des liens symbolique pour debootstrap:
<pre>
cd /usr/share/debootstrap/scripts
ln -s gutsy oneiric
ln -s gutsy precise
</pre>
ensuite la variante peux être ajouter à ganeti-instace-debootstrap dans /etc/ganeti/instace-debootstrap/variants/...
h3. Patch maison pour ganeti
Ajout de l'option -D à sfdisk au script /usr/share/ganeti/os/debootstrap/common.sh ligne 84 pour créer des partitions avec assez d'espace pour grub
Celui-ci est décrit dans l'installation d'une node aussi.
h3. J'ai n'est pas trouvé mon bonheur, comment je vais faire ?!
Voici quelques ressources:
* http://docs.ganeti.org/ganeti/current/html/
* http://docs.ganeti.org/ganeti/2.1/man/
* http://wiki.osuosl.org/public/ganeti/
Ou bien je demande à sileht d'écrire le use case qui me manque s'il à le temps
h3. Tuning IO
<pre>
KVM_DISKS="WDC_WD20EARS-00_WD-WMAZA0732072"
for diskname in $KVM_DISKS ; do
disk=$(basename $(readlink -e /dev/disk/by-id/scsi-SATA_$diskname) 2>/dev/null)
[ -z "$disk" -o ! -d "/sys/block/$disk" ] && continue
echo deadline > /sys/block/${disk}/queue/scheduler
echo 1 > /sys/block/${disk}/queue/iosched/fifo_batch
echo 0 > /sys/block/${disk}/queue/iosched/front_merges
echo 2 > /sys/block/${disk}/queue/iosched/read_expire
echo 2 > /sys/block/${disk}/queue/iosched/write_expire
echo 1 > /sys/block/${disk}/queue/iosched/writes_starved
done
</pre>
h3. Hooks
Les hooks sont des scripts dans le répertoire /etc/ganeti/instance-debootstrap/hooks (pour les VM de type instance-debootstrap) exécutés grâce à run-parts.
Un hook a la forme suivante :
<pre>
#!/bin/bash
set -e
. common.sh
CLEANUP=( )
set -x
trap cleanup EXIT
if [ -z "$TARGET" -o ! -d "$TARGET" ]; then
echo "Missing target directory"
exit 1
fi
# Vos modifs ici
# $TARGET contient le chemin, sur l'hôte, où est monté le disque dur de la VM
cleanup
trap - EXIT
exit 0
</pre>
Les hooks sont séparés en fichiers, un par « fonction », afin d'encourage la réutilisation.
h4. Installation d'extlinux en tant que bootloader
<pre>
#!/bin/bash
set -e
. common.sh
CLEANUP=( )
set -x
trap cleanup EXIT
if [ -z "$TARGET" -o ! -d "$TARGET" ]; then
echo "Missing target directory"
exit 1
fi
# allow extlinux to find device
mount --bind /dev $TARGET/dev
CLEANUP+=("umount $TARGET/dev")
mount --bind /proc $TARGET/proc
CLEANUP+=("umount $TARGET/proc")
# generate configuration
echo 'EXTLINUX_PARAMETERS="ro console=ttyS0,38400n8"' > $TARGET/etc/default/extlinux
chroot "$TARGET" extlinux-update
# install extlinux
chroot "$TARGET" extlinux -i /boot/extlinux
# install boot record
dd if="$TARGET/usr/lib/extlinux/mbr.bin" of=$BLOCKDEV
cleanup
trap - EXIT
exit 0
</pre>
{{>toc}}
h2. Liens
talk par iustin a google I/O sur ganeti : a 28:00 http://youtu.be/TELArK6SmyY
extlinux pour ganeti http://anonscm.debian.org/gitweb/?p=mirror/dsa-puppet.git;a=blob;f=modules/ganeti2/templates/instance-debootstrap/hooks/20-dsa-install-bootloader.erb;h=2bbba5e762b512c1c7b081049cf8ffd6cc472f96;hb=master
h2. Installation from scratch
h3. Ganeti
apt-get install ganeti2
h3. configuration LVM
Dans le fichier */etc/lvm/lvm.conf* changer le filter lvm pour:
<pre>
# filter = [ "a/.*/" ]
filter = ["r|/dev/cdrom|", "r|/dev/drbd[0-9]+|" ]
</pre>
Evite les soucis avec DRBD (ie: pour que la machine hôte ne detecte pas les LVM qui sont dans le VM lors du vgscan and co)
h3. configuration DRBD
* activer drbd
<pre>
#Â echo "options drbd minor_count=128 usermode_helper=/bin/true" >> /etc/modprobe.d/drbd-ganeti.conf
#Â rmmod drbd
# modprobe drbd
# cat /sys/module/drbd/parameters/usermode_helper
/bin/true
</pre>
h3. Partitionnement
<pre>
# fdisk /dev/sda
new primary part
hex code 8e
# partprobe
</pre>
h3. Création du VG pour ganeti
<pre>
pvcreate /dev/sda2
vgcreate vg_ganeti /dev/sda2
</pre>
S'il existe déjà vider le volume group et le recreer
<pre>
pvs
vgs
lvs
lvremove
vgcreate kvmvg /dev/sdb... #TODO check
</pre>
h3. Network
<pre>
# dans /etc/network/interfaces
# The primary network interface
auto eth0
iface eth0 inet manual
# dans /etc/rc.local
ip l set eth0 up
brctl addbr ganeti-br0
ip li set ganeti-br0 up
brctl addif ganeti-br0 eth0
ip a a 10.42.0.13/24 dev ganeti-br0
ip r a default via 10.42.0.1
</pre>
h3. DNS
<pre>
# Dans /etc/hosts
10.42.0.10 tmaster.thsf tmaster
10.42.0.11 t1.thsf t1
10.42.0.12 t2.thsf t2
10.42.0.13 t3.thsf t3
</pre>
h3. Ganeti Service
On master:
Initialiser le cluster:
<pre>
gnt-cluster init --nic-parameters mode=bridged,link=ganeti-br0 --master-netdev=ganeti-br0 \
--vg-name vg_ganeti --enabled-hypervisors=kvm tmaster.thsf
</pre>
Ajouter un noeud au cluster (t2):
<pre>
gnt-node add t2
</pre>
Installation d'outils d'administration de ganeti:
<pre>apt-get install ganeti-htools ganeti-instance-debootstrap</pre>
Ajout d'une VM
<pre># vi /etc/hosts
10.42.0.101 vm1.thsf vm1
gnt-cluster copyfile /etc/hosts
gnt-instance add -H kernel_path=/boot/vmlinuz-3.2.0-2-amd64,initrd_path=/boot/initrd.img-3.2.0-2-amd64 \
-t drbd -B memory=512M,vcpus=1 --disk 0:size=5G -I hail -o debootstrap+default vm1.thsf
</pre>
h2. Administration des VMs
h3. Création d'une VM sous FreeBSD (ou autre)
Exemple avec la VM anapivirtua :
Détermination du nÅud primaire de la VM (ici, h6) :
<pre>
# gnt-instance list anapivirtua.tetaneutral.net
Instance Hypervisor OS Primary_node Status Memory
anapivirtua.tetaneutral.net kvm debootstrap+squeeze64 h6.tetaneutral.net running 512M
</pre>
Téléchargement de l'ISO de FreeBSD sur le nÅud primaire :
<pre>
# cd ~/fab
# wget http://ftp.freebsd.org/pub/FreeBSD/releases/ISO-IMAGES/9.1/FreeBSD-9.1-RELEASE-amd64-bootonly.iso
</pre>
Sur le master ganeti (h4 actuellement) :
FreeBSD ne fonctionne bien qu'avec les cartes ETH émulée de type e1000 et les disques émulés en ide, de plus il ne faut pas que KVM boote un kernel et active la console :
<pre>
# gnt-instance modify -H serial_console=false anapivirtua.tetaneutral.net
# gnt-instance modify -H kernel_path="" anapivirtua.tetaneutral.net
# gnt-instance modify -H nic_type="e1000" anapivirtua.tetaneutral.net
# gnt-instance modify -H disk_type="ide" anapivirtua.tetaneutral.net
</pre>
Et on n'a plus qu'à démarrer sur le CD d'install :
<pre>
# gnt-instance start -H boot_order=cdrom,cdrom_image_path=/root/fab/FreeBSD-9.1-RELEASE-amd64-bootonly.iso anapivirtua.tetaneutral.net
</pre>
Retour sur le nÅud primaire, ouverture de VNC pour que l'adhérent puisse effectuer l'installation :
<pre>
# iptables -L -v -n | grep anapivirtua.tetaneutral.net
0 0 REJECT tcp -- * * !91.224.149.193 0.0.0.0/0 tcp dpt:12647 /* VNC for anapivirtua.tetaneutral.net */ reject-with icmp-port-unreachable
# iptables -D INPUT -p tcp ! -s 91.224.149.193 --dport 12647 -j REJECT
</pre>
Communiquer à l'adhérent l'IP et le port pour VNC (ici h6.tetaneutral.net:12647)
Une fois qu'il a fini l'installation, il faut refermer VNC et voilà !
<pre>
# iptables -A INPUT -p tcp ! -s 91.224.149.193 --dport 12647 -j REJECT -m comment --comment "VNC for anapivirtua.tetaneutral.net"
</pre>
h3. Backup et effacement d'une VM
Vers h2 :
<pre>
gnt-instance shutdown xxx
gnt-instance activate-disks xxx
VM=xxx.gz; cd /backup/ganeti-vm-raw/20130429 ; if [ ! -f ${VM} ]; then socat -u tcp4-listen:50555 - > $VM ; zcat $VM | md5sum -; du -hs *; else echo $VM already present;fi
DB=nnn; cat /dev/drbd$DB | gzip --fast|socat -u - tcp4:h2:50555;md5sum /dev/drbd$DB
gnt-instance deactivate-disks xxx
gnt-instance remove xxx
</pre>
h3. Gestion d'un gnt-instance migrate qui reste bloquer
Symptôme: la progression du "gnt-instance migrate <vmname>" ne progresse plus"
<pre>
# gnt-instance info -s nagios | grep 'node.:' -A1
nodeA: h4.tetaneutral.net, minor=18
nodeB: h6.tetaneutral.net, minor=27
port: 12589
</pre>
Donc si on regarde sur la machine primaire et secondaire l'état:
<pre>
# grep '18:' -A5 /proc/drbd # (et sur la secondaire: grep '27:' -A5 /proc/drbd)
0: cs:SyncSource st:Primary/Primary ds:UpToDate/UpToDate C r---
ns:601729944 nr:0 dw:0 dr:601737980 al:0 bm:429909 lo:0 pe:0 ua:0 ap:0 oos:0
[===================>] sync'ed:100.0% (965/6869678)M
stalled
</pre>
Si on tente un commande drbd on a:
<pre>
# drbdsetup /dev/drbd18 sh-status
(longue attente)
No response from the DRBD driver! Is the module loaded?
</pre>
Bref Drbd est dans les choux, ca semble être un bug connu des versions <= 8.3.12
Sources :
# http://www.mentby.com/Group/drbd-user/recovering-from-erroneous-sync-state.html
# http://lists.linbit.com/pipermail/drbd-dev/2007-May/000751.html
# https://encrypted.google.com/search?q=drbd+stall+100%25&hl=en
Pour réparer sur la machine h4, le node primaire, faire:
<pre>
# /etc/ganeti/iptables-to-reset-drbd-connection.sh 12589 # <-- 12589 le port de drbd récupéré plus haut
** Attention à être sur la bonne machine **
Pour couper la connection
iptables -I INPUT -p tcp --dport 12589 -j REJECT --reject-with tcp-reset
iptables -I INPUT -p tcp --sport 12589 -j REJECT --reject-with tcp-reset
iptables -I OUTPUT -p tcp --dport 12589 -j REJECT --reject-with tcp-reset
iptables -I OUTPUT -p tcp --sport 12589 -j REJECT --reject-with tcp-reset
Pour remettre la connection
iptables -D INPUT -p tcp --dport 12589 -j REJECT --reject-with tcp-reset
iptables -D INPUT -p tcp --sport 12589 -j REJECT --reject-with tcp-reset
iptables -D OUTPUT -p tcp --dport 12589 -j REJECT --reject-with tcp-reset
iptables -D OUTPUT -p tcp --sport 12589 -j REJECT --reject-with tcp-reset
</pre>
Exécuter la première partie puis vérifier dans /proc/drbd qui celui-ci est en WFConnection.
Puis rétablir la connexion avec la seconde partie et vérifier /proc/drbd que c'est bien reconnecté.
Ensuite si ganeti n'a pas vu la réparation, faire sur le master node et le node primaire de la machine:
<pre>
# /etc/init.d/ganeti restart
</pre>
Ceci passe en error le job de migration
Puis sur le master node, on nettoye les résidu de la migration échouée:
<pre>
# gnt-instance migrate --cleanup nagios
</pre>
h3. Gestion d'un disque en I/O error
First put the disk in failure offline:
<pre>echo offline > /sys/block/sdb/device/state</pre>
Then we need to remove the volume group, here /dev/kvmvg
We need to do it manually because vgremove will not work in this case
<pre>/dev/kvmvg# for i in *; do echo === $(date) == $i ; dmsetup remove /dev/kvmvg/"$i"; echo $?; done</pre>
This will leave a few lv when ganeti hasnt detected for some reason the disk failure.
For those left we need to force drbd to go Diskless, use either gnt-instance info or ls -l /var/run/ganeti/instance-disks/ or /var/lib/ganeti/config.data to find the VM and /dev/drbdNNN then
<pre>drbdsetup /dev/drbd47 detach</pre>
Then gnt-instance info VM to force ganeti to recognize the disk failure (it will take a few minutes)
Then dmsetup remove will work.
After the last dmsetup remove /dev/kvmvg will disappear.
Now you can physically remove the disk and plug a new disk on a new SATA port (on the same SATA port the kernel didn't recognize the new drive)
Then create a LVM partition then vgcreate kvmvg /dev/sdX
Now we need to recreate redundancy
On the still running VM you can use
<pre>gnt-instance replace-disks --submit -a VMname</pre>
On the stopped VM you need to do manually
<pre>gnt-instance replace-disks --submit -p VMname # if primary to reconstruct
gnt-instance replace-disks --submit -s VMname # if secondary to reconstruct</pre>
At 15 MByte/s 1 TB to reconstruct will take about 18h30.
Before remove the disk from the server, we must prepare the disk for unplug:
<pre>echo 1 > /sys/block/sdX/device/delete</pre>
Links:
http://docs.ganeti.org/ganeti/2.5/html/admin.html#preparing-for-disk-operations
http://docs.ganeti.org/ganeti/2.5/html/admin.html#generalized-storage-handling
http://www.lancealbertson.com/2011/02/handling-hdd-failures-with-ganeti/
http://www.sakana.fr/blog/2009/05/04/linux-sata-hot-plug-unplug/
h3. Demarrer et arrêter une instance ?
<pre>
gnt-instance start vm1
gnt-instance stop vm1
</pre>
Si pendant l'extinction de la VM le message suivant apparait:
<pre>WARNING: Could not shutdown block device disk/0 on node h6.tetaneutral.net: drbd45: can't shutdown drbd device: /dev/drbd45: State change failed: (-12) Device is held open by someone</pre>
Sur h6 on peut remarquer que l'on a un status non nominal sur drbd:
<pre>$ grep -A4 45: /proc/drbd
45: cs:WFConnection ro:Primary/Unknown ds:UpToDate/DUnknown C r----
ns:68584404 nr:0 dw:67728388 dr:2484540 al:535 bm:237 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
</pre>
Pour résoudre le probléme taper:
<pre>drbdsetup /dev/drbd45 down</pre>
Si le message persiste, il faut vérifier que plus aucun processus n'utilise le drbd45 sur h6, par exemple vérifier devmapper:
<pre>dmsetup ls | grep drbd45</pre>
Référence dans la doc ganeti: http://docs.ganeti.org/ganeti/2.5/html/walkthrough.html#in-use-disks-at-instance-shutdown
h3. Comment tout savoir sur une vm ?
<pre>
gnt-instance info vm1
</pre>
h3. Déplacement le(s) disque(s) dur d'une VM
Si la machine a ces disques au format plain (sans drbd), taper:
<pre>
gnt-instance stop vm1
gnt-instance move -n h6 vm1
gnt-instance start vm1
</pre>
Si la machine utilise drbd (uniquement le disque de la node secondaire bascule):
<pre>
gnt-instance replace-disks -n h6 vm1
</pre>
Si vous voulais déplacer l'autre disque du drbd, il faut basculer la machine, puis refaire la même chose
h3. Basculer/migrer une machine qui utilise drbd
Bascule avec arret de la machine:
<pre>
gnt-instance failover vm1
</pre>
Sans arrêt, migration à chaud:
<pre>
gnt-instance migrate vm1
</pre>
En cas de soucis primaire/secondaire:
<pre>
gnt-instance migrate --cleanup vm1
</pre>
cleanup marche en cas de split brain, example de /proc/drbd :
<pre>
h5: cs:WFConnection ro:Primary/Unknown ds:UpToDate/DUnknown C r----
h1: cs:StandAlone ro:Primary/Unknown ds:UpToDate/DUnknown r----
</pre>
h3. Création d'une machine
Un script est présent sur h1 voici ca doc:
<pre>
# /root/gnt-addvm
usage: gnt-addvm [options] VIRTUAL_MACHINE_HOSTNAME
-o OS | --os OS OS can be default natty32 natty64 sid64 squeeze32 squeeze64 wheezy64
-s SIZE | --size SIZE default SIZE is 10G
-m MEM | --mem MEM default MEM is 256M
-c CPU | --cpu CPU default CPU is 1
-n NODES | --nodes NODES default NODES is
-d MODE | --disk MODE default MODE is drbd
-q | --quick don't wait drbd sync
--dry-run show executed command
--cdrom PATH installation from iso file
</pre>
h3. Supprimer une machine
<pre>
gnt-instance remove vm1
</pre>
si la vm est en drbd et que une des nodes du drbd ne fonctionne plus
<pre>
gnt-instance remove --ignore-failures vm1
</pre>
h3. Changer les cractéristique d'une VM, upgrade disk, net, cpu, mem
Et hop une nouvelle carte réseau sur le vlan tsf
<pre>
gnt-instance modify --net add:link=br1 vm1
</pre>
Un petit disk en plus
<pre>
gnt-instance modify --disk add:size=50G vm1
</pre>
Un petite upgrade cpu et mémoire
<pre>
gnt-instance modify -B vcpus=2,memory=512M vm1
</pre>
Reboot pour prendre en compte le tout
<pre>
gnt-instance reboot -t full vm1
</pre>
== Je voudrais bien booter mon kernel ! ou un cdrom==
Je peux désactivé le kernel commun pour une vm
<pre>
gnt-instance modify -H kernel_path="" vm1
</pre>
Ou booter sur le cdrom pour le prochain démarrage commme ceci:
<pre>
gnt-instance start -H boot_order=cdrom,cdrom_image_path=/path/to/debian-504-amd64-netinst.iso vm1
</pre>
h3. Relocaliser les disques secondaires si un serveur est HS.
Ceci déplace le disque redondant (qui n'est plus présent si le serveur est HS) est le reconstruit sur un autre serveur
<pre>
gnt-instance replace-disks -I hail vm1
</pre>
h3. Importer une image disque venant de lâextérieur
Convertion de l'image au format raw (si c'est pas déjà le cas)
<pre>
kvm-img convert DISQUEVM.qcow -O raw DISQUEVM.raw
</pre>
Copie du disque au format raw sur un lvm
<pre>
size=$(kvm-img info DISQUEVM.raw | sed -n -e 's/^virtual size:[^(]*(\([[:digit:]]*\).*)/\1/gp')
lvcreate -L ${size}b -n lv_migration_DISQUEVM kvmvg
dd if=DISQUEVM.raw of=/dev/kvmvg/lv_migration_DISQUEVM
</pre>
Création de la VM
<pre>
gnt-instance add -B memory=512M --no-start -t plain -n $(hostname) --disk 0:adopt=lv_migration_DISQUEVM --net 0 -o debootstrap+default VMNAME.tetaneutral.net
</pre>
Et pour finir, on transforme le format de disque de la VM en drbd:
<pre>
gnt-instance modify -t drbd -n h6 VMNAME.tetaneutral.net
</pre>
h3. Copier une VM sur une autre machine
Seul la machine *h1* a l'espace configurer pour faire des dumps de machine virtuelle.
On lance un backup de celle-ci (attention cette commande *éteint* la machine):
<pre>
gnt-backup export -n h1 sileht2
</pre>
Les fichiers sont ensuite sur h1 dans /exports/sileht2.tetaneutral.net/
Le fichier qui nous intéresse est celui qui fini par *.snap* qui est le disque dur au format raw de la VM, dans mon cas:
<pre>
09d836a0-22e0-4ea4-9104-c301351bb2e2.disk0_data.snap
</pre>
Pour la démonstration je copie ce fichier sur h2:
<pre>
scp /exportfs/sileht2.tetaneutral.net/09d836a0-22e0-4ea4-9104-c301351bb2e2.disk0_data.snap h2:/root/sileht.raw
</pre>
Et je le test avec kvm:
<pre>
kvm -m 256 -drive file=sileht.raw,format=raw,if=virtio,boot=on,cache=writeback -usbdevice tablet -netdev type=tap,id=netdev0,fd=10 -device virtio-net-pci,mac=aa:00:00:62:e3:a0,netdev=netdev0
</pre>
A savoir l'image utilise les pilotes kvm "virtio", si on souhaite utiliser la VM avec un autre logiciel de virtualisation,
il faudra modifié le fstab pour mettre /dev/sda1 au lieu de /dev/vda1 et supprimer le fichier /etc/udev/rules.d/70-persistent-net.rules
h3. Backup disque seul
gnt-instance activate-disks VMNAME.tetaneutral.net
=> affiche le drbd
=> copie avec dd
puis gnt-instance deactivate-disks VMNAME.tetaneutral.net
h3. Monter une partition de machine virtuelle sur la machine hôte (!Attention DANGER!)
Sur le +master node+, arret de la machine et activation des disques
<pre>
$ gnt-instance stop VMNAME.tetaneutral.net
$ gnt-instance activate-disks VMNAME.tetaneutral.net
h5.tetaneutral.net:disk/0:/dev/drbd34
</pre>
Ensuite se connecter à la machine ou ganeti à préparer le disque, ici +h5+
Donc sur +h5+, pour voir les partitions du disque, ici le +/dev/drbd34+:
<pre>
kpartx -l /dev/drbd34
</pre>
Sur +h5+, on créé ensuite les partitions dans /dev avec devmapper
<pre>
kpartx -a /dev/drbd34
ls -la /dev/mapper/drbd34*
</pre>
Sur +h5+, a partir de maintenant on peut faire mumuse avec la partition, exemple:
<pre>
mount /dev/mapper/drbd34p1 /mnt/
....
umount /mnt
</pre>
Puis *très important*, il faut nettoyer devmapper, sur +h5+
<pre>
kpartx -d /dev/drbd34
</pre>
Et pour finir sur +master node+, on désactive les disques pour ganeti et on boot la vm:
<pre>
gnt-instance deactivate-disks VMNAME.tetaneutral.net
gnt-instance start VMNAME.tetaneutral.net
</pre>
h2. Administration des serveurs/nodes
h3. Ãteindre/rebooter provisoirement un des serveurs sans coupure de service
La procédure est la suivante:
- migration des machines virtuelles sur leurs secondaires
- Arret/Ralummage ou reboot du serveur
- remigration des machines virtuelles sur le serveur hX
<pre>
gnt-node migrate hX
shutdown -h now # ou reboot
hbal -L --no-disk-moves -X
</pre>
La resynchro drbd est automatique.
h3. L'extinction d'une node proprement dans le but de la désactivé du cluster
<pre>
gnt-node migrate hX # gnt-node failover hX
gnt-node evacuate -I hail hX
gnt-node modify -O yes hX
</pre>
Ici toutes les VMs seront migrés et les données auront été déplacé vers les autres nodes.
h3. Vérifier l'état du cluster
Sur le masternode normalement h1 faire:
<pre>
gnt-cluster verify
</pre>
h3. Change le node principal (masternode) de "ganeti", celui qui permet de lancer des commandes ganeti.
Allez sur un node, taper ceci et il deviendra "maternode":
<pre>
gnt-cluster master-failover
</pre>
h3. Gestion des fichiers de configuration (ie: /etc/ganeti, /etc/hosts, /etc/rc.local, ...)
Tous les fichiers de configuration à synchroniser entre toutes les nodes du cluster sont contenues dans ce script:
<pre>
/etc/ganeti/pushconf.sh
</pre>
Le lancer recopie ces fichiers du masternode vers les autres nodes.
h3. Désactiver un serveur qui serait HS du cluster provisoirement.
On bascule les machines qui n'ont pas le failover en automatique
<pre>
gnt-node failover [ --ignore-consistency ] h2
</pre>
le --ignore-consistency permet de forcer ganeti à ne pas contrôler le disk avant le basculement
On peux (optionnellement) déplacer les disques durs secondaires des VMs
<pre>
gnt-node evacuate [--early-release] -I hail hX
</pre>
le --early-release permet de forcer ganeti à ne pas contrôler le disk avant le basculement (utile si le disk de h2 est HS)
Puis on désactive la node:
<pre>
gnt-node modify -O yes h2
</pre>
h3. Réinsertion dans le cluster d'un node désactivé
- On réactive la node
- On remet dessus des machines et des disques en répartissant la charge du cluster
<pre>
gnt-node modify -O no h2
hbal -L -X
</pre>
h2. Setup d'un nouveau NODE
h3. Installation
* Installer squeeze basique avec juste ssh
* Ajouter wheezy dans /etc/apt/sources.list
<pre>
# deb http://ftp.fr.debian.org/debian/ squeeze main
deb http://ftp.fr.debian.org/debian/ squeeze main contrib non-free
deb-src http://ftp.fr.debian.org/debian/ squeeze main contrib non-free
deb http://ftp.fr.debian.org/debian/ sid main contrib non-free
deb-src http://ftp.fr.debian.org/debian/ sid main contrib non-free
deb http://ftp.de.debian.org/debian-backports/ squeeze-backports main contrib non-free
deb-src http://ftp.de.debian.org/debian-backports/ squeeze-backports main contrib non-free
deb http://security.debian.org/ squeeze/updates main
deb-src http://security.debian.org/ squeeze/updates main
# squeeze-updates, previously known as 'volatile'
deb http://ftp.fr.debian.org/debian/ squeeze-updates main
deb-src http://ftp.fr.debian.org/debian/ squeeze-updates main
</pre>
* Allouer un port avec 3131, 3175, 3195 tagged sur le procurve
* Monter le reseau manuellement IP X
<pre>
ip link add link eth0 name eth0.3131 type vlan id 3131
ip link set eth0.3131 up
ip addr add 91.224.149.15X/25 dev eth0.3131
</pre>
* Creer /etc/rc.local.conf avec X et Y
<pre>
IP_3131="91.224.149.15X/25"
GW_3131="91.224.149.254"
IP_3175="192.168.3.Y/24"
KVM_DISKS="sdb"
</pre>
* Installer les packages
<pre>
#TODO liste en fichier commit qqpart
#TODO: passer a une version compilée en local de ganeti pour eviter les update de version wheezy
dpkg --get-selections | ssh root@h48 dpkg --set-selections
ssh root@h48 apt-get dselect-upgrade
</pre>
* munin:
dans /etc/munin/munin-node.conf ajouter: allow ^91\.224\.149\.194$
* TODO patch munin Loic
http://trac.fsffrance.org/wiki/PatchInventory#Munin
* reboot
* Installer le node dans le cluster ganeti apres s'etre assure que la version de ganeti est bien la meme
<pre>
dpkg -l|grep -i ganeti
gnt-node add h48
/etc/ganeti/pushconf.sh
</pre>
Appliquer ce patch à ganeti-instance-debootstrap:
<pre>
--- /usr/share/ganeti/os/debootstrap/common.sh.ori 2010-09-15 22:34:12.000000000 +0200
+++ /usr/share/ganeti/os/debootstrap/common.sh 2011-07-27 12:33:55.695617766 +0200
@@ -91,7 +91,7 @@
# some versions of sfdisk need manual specification of
# head/sectors for devices such as drbd which don't
# report geometry
- sfdisk -H 255 -S 63 --quiet --Linux "$1" <<EOF
+ sfdisk -H 255 -S 63 -D --quiet --Linux "$1" <<EOF
0,,L,*
EOF
}
</pre>
Ci dessous ajouter dkms et r8168 si nécessaire.
h3. Pilotes additionnel
Sur h1,h2,h4,h5 et h6, le pilote (r8169.ko) de la carte réseau (r8168/8111) provoque des kernels panic, il a été remplacé la version du constructeur (r8168.ko).
Pilote dispo ici: (http://www.realtek.com/downloads/downloadsView.aspx?Langid=1&PNid=13&PFid=5&Level=5&Conn=4&DownTypeID=3&GetDown=false)
<pre>
apt-get install gcc dkms
cd /usr/src
wget http://url_to_pilot/r8168-8.024.00.tar.bz2
tar -xjf r8168-8.024.00.tar.bz2
cd r8168-8.024.00
cat > dkms.conf << EOF
PACKAGE_NAME=r8168
PACKAGE_VERSION=8.024.00
MAKE[0]="make"
BUILT_MODULE_NAME[0]=r8168
BUILT_MODULE_LOCATION[0]="src/"
DEST_MODULE_LOCATION[0]="/kernel/updates/dkms"
AUTOINSTALL="YES"
EOF
dkms add -m r8168 -v 8.024.00
dkms build -m r8168 -v 8.024.00
dkms install -m r8168 -v 8.024.00
echo "r8168" >> /etc/modules
echo "blacklist r8169" >> /etc/modprobe.d/blacklist-network.conf
update-initramfs -u
reboot
</pre>
Pour les machines a base de e1000e:
<pre>
apt-get install gcc dkms
cd /usr/src
wget http://downloadmirror.intel.com/15817/eng/e1000e-1.3.17.tar.gz
tar -xzf e1000e-1.3.17.tar.gz
cd e1000e-1.3.17
cat > dkms.conf << EOF
PACKAGE_NAME=e1000e
PACKAGE_VERSION=1.3.17
CLEAN="make -C src/ clean"
MAKE[0]="make -C src/"
BUILT_MODULE_NAME[0]=e1000e
BUILT_MODULE_LOCATION[0]="src/"
DEST_MODULE_LOCATION[0]="/kernel/updates/dkms"
AUTOINSTALL="YES"
EOF
dkms add -m e1000e -v 1.3.17
dkms build -m e1000e -v 1.3.17
dkms install -m e1000e -v 1.3.17
reboot
</pre>
h2. Annexe
h3. Configuration réseau
le script /etc/rc.local, qui s'occupe de préparer la configuration réseaux pour ganeti (avec les vlan, bridge and co)
le script /etc/rc.local.conf, contient les adresses IP de la machine et les gw
h3. Protection VNC
Le VNC de kvm est utiliser sur chaque MV.
Des règles de firewall sont automatiquement mise en place par le script /etc/ganeti/vnc-firewall pour que seul la machine gntwebmgr.tetaneutral.net soit autoriser a s'y connecter
Ce script est appelé par les hooks ganeti.
h3. Mac spoofing configuration (Actuellement désactivé)
Le script ifup de ganeti pour kvm a été modifier (ie: /etc/ganeti/kvm-vif-bridge) pour écrire la relation entre la vm, le numero de ces interfaces réseaux et ces tap.
Le fichier prends la forme suivante:
munin.tetaneutral.net:0:tap3
trac.tetaneutral.net:0:tap5
munin.tetaneutral.net:1:tap5
Les règles ebtables sont écrites par le script /etc/ganeti/spoofing/spoofing-protection avec les informations de ce fichier.
Les scripts de hook de ganeti (ie:/etc/ganeti/hook/) utilise ce script, pour lancer ou arreter le spoofing.
h3. Debootstrap du nouvelle ubuntu >= oneiric:
pour les ubuntu oneiric, precise et supérieur il faut créer des liens symbolique pour debootstrap:
<pre>
cd /usr/share/debootstrap/scripts
ln -s gutsy oneiric
ln -s gutsy precise
</pre>
ensuite la variante peux être ajouter à ganeti-instace-debootstrap dans /etc/ganeti/instace-debootstrap/variants/...
h3. Patch maison pour ganeti
Ajout de l'option -D à sfdisk au script /usr/share/ganeti/os/debootstrap/common.sh ligne 84 pour créer des partitions avec assez d'espace pour grub
Celui-ci est décrit dans l'installation d'une node aussi.
h3. J'ai n'est pas trouvé mon bonheur, comment je vais faire ?!
Voici quelques ressources:
* http://docs.ganeti.org/ganeti/current/html/
* http://docs.ganeti.org/ganeti/2.1/man/
* http://wiki.osuosl.org/public/ganeti/
Ou bien je demande à sileht d'écrire le use case qui me manque s'il à le temps
h3. Tuning IO
<pre>
KVM_DISKS="WDC_WD20EARS-00_WD-WMAZA0732072"
for diskname in $KVM_DISKS ; do
disk=$(basename $(readlink -e /dev/disk/by-id/scsi-SATA_$diskname) 2>/dev/null)
[ -z "$disk" -o ! -d "/sys/block/$disk" ] && continue
echo deadline > /sys/block/${disk}/queue/scheduler
echo 1 > /sys/block/${disk}/queue/iosched/fifo_batch
echo 0 > /sys/block/${disk}/queue/iosched/front_merges
echo 2 > /sys/block/${disk}/queue/iosched/read_expire
echo 2 > /sys/block/${disk}/queue/iosched/write_expire
echo 1 > /sys/block/${disk}/queue/iosched/writes_starved
done
</pre>
h3. Hooks
Les hooks sont des scripts dans le répertoire /etc/ganeti/instance-debootstrap/hooks (pour les VM de type instance-debootstrap) exécutés grâce à run-parts.
Un hook a la forme suivante :
<pre>
#!/bin/bash
set -e
. common.sh
CLEANUP=( )
set -x
trap cleanup EXIT
if [ -z "$TARGET" -o ! -d "$TARGET" ]; then
echo "Missing target directory"
exit 1
fi
# Vos modifs ici
# $TARGET contient le chemin, sur l'hôte, où est monté le disque dur de la VM
cleanup
trap - EXIT
exit 0
</pre>
Les hooks sont séparés en fichiers, un par « fonction », afin d'encourage la réutilisation.
h4. Installation d'extlinux en tant que bootloader
<pre>
#!/bin/bash
set -e
. common.sh
CLEANUP=( )
set -x
trap cleanup EXIT
if [ -z "$TARGET" -o ! -d "$TARGET" ]; then
echo "Missing target directory"
exit 1
fi
# allow extlinux to find device
mount --bind /dev $TARGET/dev
CLEANUP+=("umount $TARGET/dev")
mount --bind /proc $TARGET/proc
CLEANUP+=("umount $TARGET/proc")
# generate configuration
echo 'EXTLINUX_PARAMETERS="ro console=ttyS0,38400n8"' > $TARGET/etc/default/extlinux
chroot "$TARGET" extlinux-update
# install extlinux
chroot "$TARGET" extlinux -i /boot/extlinux
# install boot record
dd if="$TARGET/usr/lib/extlinux/mbr.bin" of=$BLOCKDEV
cleanup
trap - EXIT
exit 0
</pre>