VMWare Server 2.0 sur dédiés OVH et mise en oeuvre d’une solution de haute disponibilité avec datastore en DRBD

Dans la continuité de la découverte des petites spécificités de la plateforme d’hébergement dédié d’OVH, aujourd’hui l’installation de VMWare Server 2.0.

Nous allons tout d’abord voir son installation en tenant compte des particularités d’OVH, l’utilisation de l’IpFailover et/ou des blocs ip RIPE fournis avec les serveurs et pour finir, en bonus, une petite bidouille à la Guiguiabloc pour intégrer un datastore VMWare en Raid1 over ip et bascule automatique.

Bien entendu, je pars d’une distribution Linux de base (Debian Etch ici) et pas la distribution VMware que fourni OVH.

Pré-Requis : Vous avez lu CE PRECEDENT BILLET avant et donc vous avez recompilé votre noyau sur vos serveurs. (il vous faut les sources du kernel).

Les switchs OVH ont une sécurité sur leurs interfaces empêchant de faire du bridging sur l’interface eth0 de votre serveur (ce qui est très bien en soi).

En gros, vous ne pouvez pas sortir sur l’interface du switch avec une adresse MAC différente de celle de votre carte réseau, si vous brigder l’interface vmnet0 avec eth0, le switch se mettra en « défense » (scénario bien connu des bidouilleurs de Cisco 🙂 ) et vous coupera le port.

A savoir que le principe est le même avec XEN 😉 donc attention a ce que vous faites…

Nous allons donc bridger VMware sur une interface bidon et configurer le Host-Only pour les interfaces réseaux de nos Machines Virtuelles.

On commence par monter une fausse interface ethernet, en éditant notre fichier /etc/network/interfaces (Debian) :

auto dummy0
iface dummy0 inet static
address 10.0.0.1 netmask 255.0.0.0 [ATTENTION CHOISIR UNE IP DE CLASSE PRIVEE]

Puis on l’active : ifup dummy0

(on vérifier par ifconfig que cette interface est bien présente).

On peut attaquer l’installation de VMware Server (je vous passe la phase de vous rendre sur le site de VMware pour récuperer le package et le numéro de série gratuit…)

tar xzvf VMware-server-2.0.0-116503.i386.tar.gz

cd vmware-server-distrib/

./vmware-install.pl
Creating a new VMware Server installer database using the tar4 format.

Installing VMware Server.

Vous répondez aux questions qui s’affichent (en changeant selon vos désirs les réponses pré-définies)

Si tout ce passe bien, vous devriez arrivé ici :

The installation of VMware Server 2.0.0 build-116503 for Linux completed
successfully. You can decide to remove this software from your system at any
time by invoking the following command: « /usr/bin/vmware-uninstall.pl ».

Before running VMware Server for the first time, you need to configure it by
invoking the following command: « /usr/bin/vmware-config.pl ». Do you want this
program to invoke the command for you now? [yes]

Vous suivez la procédure jusqu’au paramétrage du réseau :

La, on devient un peu plus attentif 🙂

Do you want networking for your virtual machines? (yes/no/help) [yes]

Configuring a bridged network for vmnet0.

Please specify a name for this network.
[Bridged]

Your computer has multiple ethernet network interfaces available: dummy0, eth0 . Which one do you want to bridge to
vmnet0? [eth0] dummy0

The following bridged networks have been defined:

. vmnet0 is bridged to dummy0

Do you wish to configure another bridged network? (yes/no) [no] no

Do you want to be able to use NAT networking in your virtual machines? (yes/no)
[yes] no

Do you want to be able to use host-only networking in your virtual machines?
[no] yes

Configuring a host-only network for vmnet1.

Please specify a name for this network.
[HostOnly]

Do you want this program to probe for an unused private subnet? (yes/no/help)
[yes] no

What will be the IP address of your host on the private
network? 192.168.1.1 [ATTENTION CHOISIR UNE IP DE CLASSE PRIVEE]

What will be the netmask of your private network? 255.255.255.0
the following host-only networks have been defined:

. vmnet1 is a host-only network on private subnet 192.168.0.

Do you wish to configure another host-only network? (yes/no) [no] (vous pouvez créer d’autres interfaces si vous le souhaitez)

None of the pre-built vmnet modules for VMware Server is suitable for your
running kernel. Do you want this program to try to build the vmnet module for
your system (you need to have a C compiler installed on your system)? [yes]

Extracting the sources of the vmnet module.

Building the vmnet module etc..

The configuration of VMware Server 2.0.0 build-116503 for Linux for this
running kernel completed successfully.

Et voila, vous pouvez faire pareil sur l’autre serveur (si vous en avez deux 😀 )

Vous pouvez vous connecter sur l’excellente interface d’administration : https://votrededieovh:8333

Lancer la création et l’installation d’une nouvelle machine virtuelle en donnant comme interface réseau, l’interface Host-only VMNET1.

(je ne parle pas du fonctionnement de VMware server ici, Google vous rapportera pleins de tutos 🙂 )

  • Configuration du réseau

On commence par activiter le forwarding entre vos cartes réseaux (en l’occurence etho et vmnet1 ici) :

/bin/echo « 1 » > /proc/sys/net/ipv4/ip_forward

(n’oublier pas de le mettre en dur dans votre /etc/sysctl.conf : sysctl net.ipv4.ip_forward=1)

Puis le proxy ARP :

echo "net.ipv4.conf.vmnet1.proxy_arp=1" >> /etc/sysctl.conf && sysctl -p

Sur la machine virtuelle, on configure notre ipfailover et/ou notre ip bloc RIPE :
/etc/network/interfaces :

iface eth0 inet static
address 91.x.x.x
netmask 255.255.255.240
broadcast 91.x.x.x
post-up /sbin/route add default dev eth0
Pour une IP bloc RIPE (voir les infos que vous donne OVH pour le netmask et le broadcast lorsque vous commander votre bloc ip ou utiliser l’excellent « sipcalc » pour calculer vos masques/reseau 😀 )

Pour un ipfailover (a adapter a votre ipfailover):

auto eth0
iface eth0 inet static
address 87.98.99.90
netmask 255.255.255.255
post-up /sbin/route add default dev eth0

La commande importante étant de lui spécifier eth0 comme passerelle par défaut ( /sbin/route add default dev eth0).

Sur votre dédié maintenant (le serveur VMware), il faut lui donner la route vers votre machine virtuelle :

/sbin/ip route add 87.88.89.90 dev vmnet1

Pour le rendre permanent, vous pouvez rajouter la commande dans /etc/init.d/vmware apres le chargement des modules réseaux ou vous basez sur la bidouille de Kro : http://forum.ovh.com/showthread.php?t=37645

(attention a adapter hein !!!).

EDIT : Pour l’explication détaillée pour VMWare Server 2.0, le billet de Superkikim ICI vous donnera toute satisafaction.

Voila, vous pouvez désormais pinguer le net depuis votre machine virtuelle et inversement.

(ne pas oublier le /etc/resolv.conf et tutti quanti…)

EDIT 2 : J’ai écris un billet sur la façon d’affecter une ip failover à votre VM, c’est ICI.

  • Bidouille Guiguiabloc

Bon maintenant que tout cela tourne très bien, le plus « amusant » serait de pouvoir basculer notre machine virtuelle sur notre deuxième serveur en cas de crash du premier…

Je vous préviens tout de suite, cela ne sera pas transparent 😀 VMotion n’existe pas sur VMware server 🙂 🙂

Pré-requis : la lecture du précédent billet :-p (encore), un drbd actif, un heartbeat actif et une ipfailover disponible.

On se créer un volume DRBD (j’espère que vous avez prévu un stock de partitions de libre lors de l’installation de votre dédié OVH 😀 )

en éditant notre fichier /etc/drbd.conf et on ajoute :

resource r1 { (ou r0 si c’est votre premiere ressource drbd)
protocol C;
handlers {
pri-on-incon-degr « echo o > /proc/sysrq-trigger ; halt -f »;
pri-lost-after-sb « echo o > /proc/sysrq-trigger ; halt -f »;
local-io-error « echo o > /proc/sysrq-trigger ; halt -f »;

}

startup {
degr-wfc-timeout 120; # 2 minutes.
}

disk {
on-io-error detach;

}

net {
after-sb-0pri disconnect;
after-sb-1pri disconnect;
after-sb-2pri disconnect;
rr-conflict disconnect;
}

syncer {
rate 20M;
al-extents 257;
}
on ns11111 {
device /dev/drbd1;
disk /dev/sda11;
address 192.168.20.20:7789; (attention a ne pas mettre le meme port de la ressource r0)
meta-disk internal;
}

on ns22222 {
device /dev/drbd1;
disk /dev/sda11;
address 192.168.20.30:7789;
meta-disk internal;
}
}

On se coltine les définitions Maitre/Esclave (voir billet précédent), on formate /dev/drbd1.

Sur le serveur ns11111, on monte /dev/drdb1 sur /vmfs (par exemple) et on l’ajoute au datastore :

datastore1

datastore2

Vous devriez voir votre datastore apparaitre dans la liste :

datastore3

Créer une machine virtuelle dedans ou comme moi, copier le repertoire de votre Machine Virtuelle et utilisez le « Add to Inventory » :

datastore4

On stoppe VMware, on démonte /vmfs et on inverse les roles Maitre esclave :

sur ns11111 : drbdadm secondary r1

sur ns22222: drbdadm primary r1

on vérifie que l’on voit bien tout avec un cat /proc/drbd puis on monte /dev/drbd1 sur /vmfs.

Sur le VMware server de ns22222, on refait la meme manip, déclaration d’un nouveau datastore et « AddVirtual Machine to Inventory ».

  • premier test

On se remet en environnement nomimal (vmware qui tourne sur ns11111, drbd1 en maitre et mount sur /vmfs)

On lance la VM sur ns11111.

On vérifie que tout marche bien et maintenant, simulons le crash manuellement.

– on kill -9 tout les process VMware (oui c’est crade, j’adore 😀 )

– on démonte /vmfs

– on bascule les ressources DrBD

– on lance vmware sur ns22222

– on lance la machine virtuelle.

Les soucis rencontrés sont les suivants :

L’uid disque a changer et il faut cliquer sur « i ‘ve copied it »

datastore5

Ca c’est facile a régler, vous ajouter

uuid.action = "keep"

Dans le fichier *.vmx de votre machine virtuelle 😀

Un répertoire « lock » verrouille le démarrage.

datastore6

Il suffit de faire un petit rm -rf Guiguiabloc.vmdk.lck pour que ca parte.

Donc cela marche, mais il faut automatiser tout cela.

Heureusement, il existe les commandes vmrun.

La syntaxe est la suivante :

vmrun -T server -h https://localhost:8333/sdk -u adminvmware -p motdepasse stop « [VMFS-DRBD] Guiguiabloc/Guiguiabloc.vmx »

Pour arreter la VM par exemple (je vous laisse consulter la doc VMRUN sur le site de VMware 😉 ).

Vous avez donc tout les éléments pour inclure cela dans les scripts de Heartbeat (basez vous sur les exemples du précédent billet) :

  1. bascule du DRBD et montage sur /vmfs
  2. Démarrage de VMware sur le nouveau Maître
  3. rm -r /vmfs/machinevirtuelle/machinevirtuellevmdk.lck
  4. vmrun start

Tout bête quoi 😀

Après plusieurs tests cela marche vraiment pas mal 🙂 , bien évidemment le crash du maitre entraîne le « crash » de la VM, donc elle peut repartir un peu en vrac.

C’est pour cela que je vous conseille de programmer des « Snapshots » des VM toutes les nuits (si vous ne connaissez pas, jetez vous dessus et mangez en !!! 😀 )

Au pire vous pourrez repartir sur le snapshot de la veille.

En tout cas, avec cela l’indisponibilité est de quelques minutes…

Ce billet a été posté dans architecture, linux et taggé , , , , , , , . Bookmark ce permalink.

28 commentaires sur “VMWare Server 2.0 sur dédiés OVH et mise en oeuvre d’une solution de haute disponibilité avec datastore en DRBD

  1. Si on souhaite utiliser l’IPv6, est ce que la configuration pour passer l’anti spoofing est la même ou faut-il l’adapter ? Merci.

  2. On parle de niveau 2 de la couche OSI, là 😉

    l’ip est au niveau 3, donc la protection est toujours effective (l’adresse MAC = niveau 2).

    Il faut juste adapter les commandes (exemple /proc/sys/net/ipv6/conf/all/forwarding pour le forwarding , /sbin/route -A inet6 add etc…), bref utiliser les commandes réseaux ipv6 et non ipv4 mais le principe reste le même.

  3. Merci, je voulais juste m’en assurer 😉

    J’avais essayé de mettre en place du brouting pour contourner l’anti spoofing d’OVH mais avec un résultat qui n’était pas fiable à 100%.

    Si je comprends bien votre configuration, vous utilisez l’hôte comme routeur en y ajoutant un proxy ARP pour ne pas transmettre au switch les MAC des VM.

    Encore merci pour ce post.

  4. ARP a été remplacé par NDP avec IPv6. Il faut donc remplacer :

    echo « net.ipv4.conf.vmnet1.proxy_arp=1 » >> /etc/sysctl.conf && sysctl -p

    par :

    echo « net.ipv6.conf.vmnet1.proxy_ndp=1 » >> /etc/sysctl.conf && sysctl -p

    Merci de confirmer pour les prochains lecteurs de ce billet.

  5. Hello.

    petite erreur dans ton article:

    « Les soucis rencontrés sont les suivants :

    L’uid disque a changer et il faut cliquer sur “i ‘ve copied it” »

    Il faut écrire « il faut cliquer sur « I’ve moved it ». C’est ce qui correspond à « keep ». Si tu cliques « I’ve copied it », il va re faire un nouveau uid.

    Cordialement

  6. Merci pour l’info, mais de tête les bascules maitre/esclave en boucle ne prenait pas ce paramètre, d’ou le forcage dans la configuration.
    As-tu testé la bacsule dans les deux sens plusieurs fois ?

  7. Bon. UUID marche bien 🙂 par contre, l’astuce de mettre les route dans le script vmware, je trouve pas sur VMWare 2. Il semble que les scripts ont changés…

    Comment t’y es-tu pris ?

  8. Pour les routes, j’utilise les scripts Heartbeat, sinon dans le /etc/init.d/vmware tout simplement.

  9. Oui mais non …. En fait, le problème est que quand je modifie le /etc/init.d/vmware, je me retrouve à plus pouvoir lancer VMware. je dois relancer vmware-config.pl. Je ne sais pas pourquoi.

    Et je n’ai pas trouvé où mettre ça dans tous les cas dans le script vmware. Il n’y a pas de référence directe à vmnet, mais une sous-routine qui appelle le chargement des modules, dont la configuration vient d’autre autre fichier, qui lui même prend ses repères dans un autre fichier. Enfin, bref. ils n’ont pas fait simple.

    Donc ce qu’il m’arrangerait, c’est de savoir où exactement tu as glissé les routes dans le script.

    J’ai essayé aussi de faire un script addroutes dans init.d, que j’ai installé en séquence 91 (juste après le lancement de vmware en 90). Mais là c’est aléatoire. Il charge une seule route, ou d’autres fois, aucune 🙁

  10. Personne n’a dit que c’était simple 😉
    Un script digne de ce nom vérifie l’état des VM (vmrun toussa), donc ton script en level 91 doit d’abord checker l’état des VM avant de s’appliquer.
    Je pense que le mieux est d’apprendre par soi-meme, j’aide mais n’assiste pas, c’est aussi pour cela que parfois je laisse des zones un peu floues. Pour moi la progression se fait par la recherche et la bidouille, donner tout « clés en main » cela ne me semble d’aucun intéret. Etre « hackeur » dans le sens noble et originel du terme c’est comprendre comment ca marche et trouver a le résoudre. Trop d’aide tue la réfléxion, cela se voit tout les jours sur les forums ou Irc ou les gens ne veulent que de l’aide sans chercher a comprendre par eux-meme (je ne dis pas cela pour toi bien évidemment, je vois que tu cherches a comprendre ce que tu fais) mais c’est un état général.
    Le scripting est une base des plus importantes, surtout en shell. L’idée de ce cluster VMware j’en ai juste donnée les directives, après, a chacun de le peaufiner et d’en apporter si possible ses contributions a la communauté.
    Je n’ai aucun doute a ce que tu réussises a monter ton architecture et je sais surtout, que tu prendras encore plus de plaisir a l’expliquer aux autres car tu l’auras triturer dans tout les sens 🙂
    Rassure toi, si vraiment tu galères, le coup de pouce naitra forcément de la communauté 😀

  11. Pingback: Superkikim O Blog » Archives du Blog » IP Forwarding pour les serveurs OVH avec VMWare Server 2

  12. Hello…
    Dis, un détail que je suis pas sûr d’avoir compris:

    Heartbeat nécessite une adresse IP Failover pour lui même déjà, correcte ? Donc l’adresse IP qu’on spécifie dans IPaddrFO est l’adresse pour Heartbeat, pas l’adresse FO qu’on a donné à la VM ?

  13. Heartbeat ne fait que monter l’ip sur la machine maître.

    Dans le cas ou l’ip publique utilisée ne peut être up simultanément sur les deux serveurs.

    Avec l’architecture VM vue ici, cela ne sert pas à grand chose puisque la machine esclave est éteinte et démarrer uniquement en cas de bascule.

    Je me sers d’heartbeat pour basculer le volume DRBD de l’un a l’autre et pour monter la partition, pas pour la gestion de l’ip failover.

  14. Me semblait aussi 🙂

    Je vais corriger ça. Ensuite, pour l’instant, le DRBD bascule pas. Faut que je trouve pourquoi. Mais je trouverai…

  15. Merci pour ce tutoriel, il y a vraiment de quoi faire.

    Cependant je crois avoir lu dans l’article précédent, que tu préfères donner des pistes plutôt qu’une solution.

    Mais perso je bloque comme un fou sur les routes. Je pensais connaitre les bases du réseau … et bah bonjour le truc =)

    J’essaye de fournir une ip fail over à un Windows XP virtuelle. je m’en suis donc retourné vers la config de OVH pour le mask and co … mais impossible de ping depuis l’extérieur ou de sortir sur le net avec la machine virtuelle.

    Je pense que le problème vient de la config IP de windows (car pour OVH, pour la config windows, les DNS et Gateway n’existe pas pour eux … donc voila l’explication technique hyper précise ;p)

    Enfin bon, si tu as la possibilité d’étoffer ta solution concernant l’utilisation d’une IP failover sur le réseau OVH, vas y. Car en regardant sur Google on trouve nombre de gens qui sont coincé (meme sur du linux) et OVH ne donne aucune solution autre que celle de son tutoriel :-/

    Merci

  16. Bonjour,

    Avez-vous un retour d’expérience d’un guest Windows dans une config comme celle-ci ? Lors d’un crash du serveur maître, le remontage de l’image sur le second serveur fonctionne t’elle correctement ?

  17. Bonsoir,

    Je n’ai fait le test qu’un fois avec un windows 2003 server, il est reparti correctement.
    Mais j’avoue ne pas avoir poussé plus loin mes tests avec un guest Windows.

  18. Pour répondre à superkikim qui devait relancer vmware-config.pl après chaque reboot … J’avais le même problème.
    C’était une bêtise de ma part, l’install d’origine, je l’ai faite dans /tmp , et une partie de la conf était enregistrée dans /tmp (qui forcément est vidé à chaque reboot).

  19. Bonjour GUIGUI!!

    Il y a peu de temps j’ai découvert ton blog et je suis enchanté de toute les informations que l’on peu y trouver!

    Cependant, suite à un problème sur Vmware serveur, je requiert ton aide.

    j’ai installé, en suivant scrupuleusement ton tuto, un vmware server 2.0.2.
    je peux me connecter à l’interface web sans soucis, mais une erreur interviens plus ou moins aléatoirement m’empêchant de créer des VMs.
    j’ai comme erreur : « The server could not complete a request (HTTP 0 ) »
    Aprés moulte recherches sur le nain ternet, plusieurs installations/désinstallations, je ne sais malheureusement plus quoi faire pour corriger se problème.

    Aurais tu une idée, une piste, un workaround, bref un truc qui puisse m’aider?

    je te remercie par avance!

    Tompouce

  20. Bonjour,

    Merci pour ce tuto très intéressant, j’ai suivi le début mais après je suis plutôt parti sur une redirection de port par le biais d’iptables. Ayant fait les tests sur une machine de test chez moi je ne sais pas si cette solution fonctionne chez OVH.
    Cette solution a l’avantage de n’avoir à gérer qu’un seul iptables sur l’hote puisqu’on redirige les ports qu’on veut.
    Je n’ai pas encore eu le temps de tester plus avant pour voir des désavantages à cette alternative ou si cela pose des soucis de sécurité 😛

    En ce qui concerne le bridging, OVH propose, je ne sais pas si c’était le cas lors de la rédaction de ce tuto, l’ajout de MAC adresses pour les VM depuis l’interface d’admin du serveur, on peut y associer une adresse MAC à une adresse ip failover. Du coup ça simplifie un peu la config de VMWare me semble t’il 🙂

    Sylvain

  21. Pingback: GuiguiAbloc, un blog qui merite d'être connu, technique, reseau, linux, système - linux - geek