Mise en place d’un Cluster Proxmox 3.1
Pour mon boulot, j'ai dû mettre en place un cluster de tests sous Proxmox 3.1, c'est l'occasion de décrire l'installation ici
I) L'installation
Ces tests ont été réalisés avec deux nodes, bien qu'il soit plus intéressant de faire un cluster avec au minimum 3 nodes !
Si les tests sont concluants et que cette plateforme de virtu intéresse nos usagers, on envisagera surement de grossir le cluster.
Les serveurs :
– Dell R520:
bi Intel Xeon E5-2420 @ 1.90GHz (24 threads)
64 Go ram
Disque dur pour le système : 2*300 Go SAS (15k tr/min)
Le stockage :
– La partie production est hebergé sur un Net App FAS 3020, avec un volume de 1 To (le temps des tests) divisé en deux Qtrees (un pour les Isos, l'autre pour les images des VMs).
– Les sauvegardes, elles sont sur un Net App FAS 2040, avec là aussi un volume de 1 To (toujours pour les tests, il sera temps de reconsidérer le stockage, une fois en prod !).
L'OS :
Pour le système, j'ai pris l'ISO de Proxmox VE 3.1 : http://www.proxmox.com/fr/downloads/category/iso-images-pve
L'installation a été celle de base, là dessus pas de surprise, ou de chose particulière à voir !
(dans mon cas j'ai juste rajouter Puppet pour la gestion automatique des confs.)
II) La configuration :
C'est là que ça devient intéressant !
1) Les MAJ:
Pour commencer, il faut un système à jour sur les nodes !
Or depuis la version 3, les éditeurs de Proxmox ont changé le repository, donc si comme moi, vous avez une verison "sans support", je vous invite à éditer votre sources.list
nano /etc/apt/sources.list
et modifier :
deb https://enterprise.proxmox.com/debian wheezy pve-enterprise
Par :
deb http://download.proxmox.com/debian wheezy pve-no-subscription
Puis faites un : (mise à jour des repo, mise à jour du système, puis reboot à la fin) :
apt-get update && apt-get upgrade -y && reboot
2) La mise en cluster :
Très simple à faire, il faut choisir une des nodes pour être le master,
évidemment vos deux nodes, sont installées à l'identique, et peuvent communiquer entre elles !
pvecm create lenomdecluster
Restarting pve cluster filesystem: pve-cluster[dcdb] notice: wrote new cluster config '/etc/cluster/cluster.conf' Starting cluster: Checking if cluster has been disabled at boot... [ OK ] Checking Network Manager... [ OK ] Global setup... [ OK ] Loading kernel modules... [ OK ] Mounting configfs... [ OK ] Starting cman... [ OK ] Waiting for quorum... [ OK ] Starting fenced... [ OK ] Starting dlm_controld... [ OK ] Tuning DLM kernel config... [ OK ] Unfencing self... [ OK ]
On vérifie la création du cluster :
pvecm status Version: 6.2.0 Config Version: 2 Cluster Name: kaamelott Cluster Id: 52776 Cluster Member: Yes Cluster Generation: 256 Membership state: Cluster-Member Nodes: 1 Expected votes: 1 Total votes: 1 Node votes: 1 Quorum: 1 Active subsystems: 5 Flags: Ports Bound: 0 Node name: gauvain Node ID: 1 Multicast addresses: 239.192.206.246 Node addresses: 10.14.32.153
on rajoute le second serveur :
pvecm add 10.14.32.154
et on valide l'échange de clés ssh :
The authenticity of host '10.14.32.153 (10.14.32.153)' can't be established. ECDSA key fingerprint is xx:xx:xx:xx:xx:xx:xx:xx:xxx:xx:xx:xx:xx:xx:xx. Are you sure you want to continue connecting (yes/no)? yes root@10.14.32.153's password: copy corosync auth key stopping pve-cluster service Stopping pve cluster filesystem: pve-cluster. backup old database Starting pve cluster filesystem : pve-clustercan't create shared ssh key database '/etc/pve/priv/authorized_keys' Starting cluster: Checking if cluster has been disabled at boot... [ OK ] Checking Network Manager... [ OK ] Global setup... [ OK ] Loading kernel modules... [ OK ] Mounting configfs... [ OK ] Starting cman... [ OK ] Waiting for quorum... [ OK ] Starting fenced... [ OK ] Starting dlm_controld... [ OK ] Tuning DLM kernel config... [ OK ] Unfencing self... [ OK ] generating node certificates merge known_hosts file restart services Restarting PVE Daemon: pvedaemon. Restarting PVE API Proxy Server: pveproxy. successfully added node 'yvain' to cluster.
On vérifie l'état des nodes :
pvecm nodes Node Sts Inc Joined Name 1 M 244 2014-02-13 16:36:02 gauvain 2 M 256 2014-02-13 16:36:34 yvain
Vous pouvez également vérifier la présence des deux nodes, en vous connectant à l'interface web de l'un de vos serveurs : https://ipduserveur:8006
Votre cluster est maintenant en place (c'était pas bien compliqué hein ?), avant de commencer à jouer, il faut rajouter un stockage partagé.
3) Le stockage
Pour modifier le stockage, rendez vous dans "Centre de données", sur l'onglet "stockage", et cliquez sur "Ajouter" :
Par soucis de simplicité j'ai choisi des montages NFS (bien que je compte faire des essais avec Ceph par la suite :p ) :
L'ajout est assez simple (il n'y qu'à suivre les indications de l'assistant), et vous avez la possibilité d'attribuer des ressources de stockages, à des usages bien particuliers : stockage de VMs, d'ISOs, de backups …
Une fois tout vos montages en place, vous pouvez tester la création d'une VM.
4) Création & Migration
Je ne vais pas détailler la création d'une VM, c'est du KVM tout ce qu'il y a de plus classique, vous avez un bouton en haut à droite "Créer VM", qui vous ouvre l'assistant suivant :
Une fois la VM créée, vous avez accès à ses options, préférences … dans le menu de gauche, en fonction de l'hôte sur lequel elle a été démarrée :
Vous pouvez ainsi tester la migration à chaud (ou pas !) :
III) Améliorations
Pour un usage de base, l'installation par défaut est très bien, mais dans un cadre pro, il est bon d'y apporter quelques modifications !
1) Paramètres réseau
Afin de pouvoir utiliser nos VLANs et une ip virtuelle pour le cluster, j'ai dû adapter le fichier /etc/network/interfaces,
Voici ce que ça donne chez moi (c'est à adapter en fonction de vos besoins ! )
#loopback auto lo iface lo inet loopback #déclaration ip virtuelle du cluster auto lo:1 iface lo:1 inet static address 10.14.32.150 netmask 255.255.255.255 #bonding en double attachement auto bond0 iface bond0 inet manual slaves eth4 eth5 bond_mode balance-xor bond_miimon 100 bond_downdelay 200 bond_updelay 200 pre-up /bin/ip link set eth4 mtu 1500 pre-up /bin/ip link set eth5 mtu 1500 #interface par bridge défaut auto vmbr0 iface vmbr0 inet static bridge_ports bond0 bridge_fd 0 bridge_maxwait 0 bridge_stp off address 10.14.32.153 netmask 255.255.255.0 network 10.14.32.0 broadcast 10.14.32.255 gateway 10.14.32.1 dns-nameservers 10.14.32.30 10.14.32.130 dns-search mondomaine #déclaration VLAN 7 auto vlan7 iface vlan7 inet manual vlan_raw_device bond0 up /bin/ip link set vlan7 mtu 1500 #déclaration VLAN 72 auto vlan72 iface vlan72 inet manual vlan_raw_device bond0 up /bin/ip link set vlan72 mtu 1500 #déclaration VLAN 73 auto vlan73 iface vlan73 inet manual vlan_raw_device bond0 up /bin/ip link set vlan73 mtu 1500 #interface par bridge VLAN 72 auto vmbr72 iface vmbr72 inet static bridge_ports vlan72 bridge_fd 0 bridge_maxwait 0 bridge_stp off address 10.14.31.54 netmask 255.255.255.0 network 10.14.31.0 broadcast 10.14.31.255 #interface par bridge VLAN 73 auto vmbr73 iface vmbr73 inet static bridge_ports vlan73 bridge_fd 0 bridge_maxwait 0 bridge_stp off address 10.14.30.57 netmask 255.255.255.0 network 10.14.30.0 broadcast 10.14.30.255
2) Failover avec Keepalive
Afin de faire du failover (je ne parle pas de HA qui est géré par le daemon Fence, que je n'utilise pas pour le moment), il faut évidemment avoir une installation fonctionnelle de serveurs keepalive, et y ajouter une nouvelle instance :
vrrp_instance VI_1 { state MASTER interface bond0 virtual_router_id 1 priority 100 advert_int 1 lvs_sync_daemon_interface bond0 authentication { auth_type PASS auth_pass password } virtual_ipaddress { 10.14.32.150/24 brd 10.14.32.255 dev bond0 # Proxmox }
Une fois l'instance délcaré, il faut la modifier :
############################################## ## Proxmox ############################################## virtual_server 10.14.32.150 443 { delay_loop 6 lb_algo wlc lb_kind DR protocol TCP persistence_timeout 120 sorry_server 10.14.32.154 443 real_server 10.14.32.153 443 { weight 1 TCP_CHECK { connect_timeout 3 } } } virtual_server 10.14.32.150 5900 { delay_loop 6 lb_algo wlc lb_kind DR protocol TCP persistence_timeout 120 sorry_server 10.14.32.154 5900 real_server 10.14.32.153 5900 { weight 1 MISC_CHECK { misc_path "/usr/lib/nagios/plugins/check_tcp -H 10.14.32.153 -p 443" } } }
l'ip virtuelle du cluster est donc 10.14.32.150.
le master déclaré est 10.14.32.153, et keepalive fait un test via nagios sur le port 443 du master, si celui ci ne répond pas en moins de 3s, il passe en "HS", et c'est l'esclave (10.14.32.154) qui prends le relai !
cette conf est appliquée pour le port 443 (je ne souhaite pas utiliser le port par défaut 8006 de proxmox, à vous de l'adapter en fonction de vos besoins) et pour le port 5900, qui sert aux consoles virtuelles en VNC.
3) Ajout d'un Reverse Proxy et d'un certificat SSL
Depuis la version 3.0, Proxmox n'utilise plus Apache comme serveur web, mais un process interne "pvcecluster", il n'y aucune modification possible, un suivis assez flou …
bref, on va intercaler un Nginx (léger, facilement modifiable, et très performant) en RP !
apt-get install nginx-light
puis on va créer le virtual host :
Il écoute sur le port 80, puis redirige vers le 443.
Sur le port 443, il prends en compte mon certificat ssl (validé par une autorité de certification), créé pour le domaine commun aux serveurs (domaine qui pointe vers l'ip virtuelle du cluster), puis redirige en local sur le port 8006.
server { listen 80; server_name proxmox.mondomaine.fr; rewrite ^ https://$hostname.mondomaine.fr$request_uri? permanent; } server { listen 443 ssl; server_name proxmox.mondomaine.fr; ssl on; ssl_certificate /etc/nginx/conf.d/cert-20434-proxmox.mondomaine.fr.pem; ssl_certificate_key /etc/nginx/conf.d/proxmox.mondomaine.fr.key; location / { proxy_pass https://127.0.0.1:8006; } }
on active la conf :
rm -f /etc/nginx/sites-enabled/default ln -sf /etc/nginx/sites-available/pveproxy /etc/nginx/sites-enabled/
on modifie pveproxy, pour cela il faut créer le fichier suivant :
nano /etc/default/pveproxy
et y inclure :
ALLOW_FROM="127.0.0.1,10.14.32.153,10.14.32.154" DENY_FROM="all" POLICY="allow"
Il est important de rajouter les ips des nodes faisant partis du cluster !
Sinon l'interface web ne fonctionnera plus correctement (les autres nodes ne pouvant plus s'intérroger entre elles).
Reste à redémmarrer ce qui est nécessaire :
/etc/init.d/pveproxy restart /etc/init.d/nginx restart
Voilà pour le moment, je vais rajouter d'autres "améliorations" à ce cluster au fur et à mesure : Ceph (FS distribué), fail2ban …