====== Répartition de charge et haute disponibilité avec keepalived ====== Nous allons voir comment mettre en place une répartition de charge et de la haute disponibilité entre 2 serveurs à l'aide de Keepalived. Dans cet exemple il s’agit de deux serveurs de partages Samba 4. === 1 – Les ressources nécessaires === Sur OpenNebula, il faut absolument un réseau virtuel sans les capacités de filtrage d’usurpation d’adresse MAC et IP (FILTER_MAC_SPOOFING et FILTER_IP_SPOOFING positionnées à NO) {{:wiki:documentation:avance:reseau.png|}} 2 VMs avec Samba installé (reals servers) * 2 adresses IP dédiées pour les deux serveurs Samba. A adapter en fonction du nombre de serveurs réels sur lesquels répartir la charge. 2 VMs avec keepalived installé (VRRP/HA servers) * 3 adresses IP : Une adresse IP dédiée à chaque serveur (2) et une seconde dédié à la répartition de charge (VIP) * 2 adresses IP dédiées aux communications entre les deux serveurs keepalived === 2 – Les serveurs réels === Vous installez ensuite une distribution Linux sans le contexte (one-context), car l’interaction avec la configuration réseau de la machine virtuelle est trop importante, ou alors il faudra minimiser le contexte au strict nécessaire. == 2.1– Configuration réseau == On peut désactiver l’IP Forwarding # nano /etc/systemd/network/eth0.network [Match] Name=eth0 [Network] Address=172.26.127.21/28 Gateway=172.26.127.17 DNS=172.26.4.20 IPForward=false Et surtout ajouter l’adresse IP de la VIP (IP aliasing) sur l’interface de loopback, sinon le serveur réel ne répondra pas aux requêtes transmises par le serveur Keepalived. # nano /etc/systemd/network/lo.network [Match] Name = lo [Address] Address = 172.26.127.20/32 Scope = host On redémarre le service réseau # systemctl restart systemd-networkd.service Et pour éviter d’éventuels problèmes sur les caches ARP on modifie le système en conséquence : # nano /etc/sysctl.d/arp.conf net.ipv4.conf.all.arp_ignore=1 net.ipv4.conf.all.arp_announce=2 net.ipv4.conf.default.arp_ignore=1 net.ipv4.conf.default.arp_announce=2 net.ipv4.conf.lo.arp_ignore=1 net.ipv4.conf.lo.arp_announce=2 Et on l’applique les modifications # sysctl -p /etc/sysctl.d/arp.conf net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 net.ipv4.conf.default.arp_ignore = 1 net.ipv4.conf.default.arp_announce = 2 net.ipv4.conf.lo.arp_ignore = 1 net.ipv4.conf.lo.arp_announce = 2 === 3– Les serveurs Keepalived (répartition de charge / haute disponibilité) === Tout d’abord il faut affecter une interface dans le réseau préalablement créé, ici ESPE_VIP. ( {{:wiki:documentation:avance:reseau-vip_iaas.intra.univ-nantes.fr.png|}} Et une autre dans un réseau privé et qui sera dédié aux communications inter-serveurs, icie ESPE_VPRIVATE. {{:wiki:documentation:avance:reseau_vprivate_iaas.intra.univ-nantes.fr.png|}} == 3.1 – Configuration réseau == Ici nous allons utiliser systemd-networkd pour configurer le réseau, car nous n’avons pas de contexte opennebula. # nano /etc/systemd/network/ens3.network [Match] Name=ens3 [Network] Address=172.26.127.23/28 Gateway=172.26.127.17 DNS=172.26.4.20 IPForward=false Il faut à présent configurer l’interface qui servira de communication entre les deux serveurs Keepalived. # nano /etc/systemd/network/ens3.network [Match] Name=ens4 [Network] Address=192.168.66.23 On redémarre le service # systemctl restart systemd-networkd Voilà l’accès réseau au serveur est opérationnel. Il faudra répeter cette opération autant de fois qu'il y a de serveurs Keepalived. == 3.2 – La répartition de charge == Pour la répartition de charge il faut installer keepalived et ipvsadm # pacman -S --noconfirm keepalived ipvsadm resolving dependencies... looking for conflicting packages... Packages (2) ipvsadm-1.31-1 keepalived-2.0.20-1 Total Installed Size: 0.78 MiB :: Proceed with installation? [Y/n] (2/2) checking keys in keyring [########################################################################################] 100% (2/2) checking package integrity [########################################################################################] 100% (2/2) loading package files [########################################################################################] 100% (2/2) checking for file conflicts [########################################################################################] 100% (2/2) checking available disk space [########################################################################################] 100% :: Processing package changes... (1/2) installing keepalived [########################################################################################] 100% Optional dependencies for keepalived ipset: ipset support (2/2) installing ipvsadm [########################################################################################] 100% :: Running post-transaction hooks... (1/2) Reloading system manager configuration... (2/2) Arming ConditionNeedsUpdate... Il faut ensuite configurer keepalived pour définir l’adresse IP virtuelle et paramétrer la répartition de charge. Cette configuration s’effectue dans le fichier /etc/keepalived/keepalived.conf Sur le premier serveur Keepalived (MASTER) global_defs { notification_email { nom-p@univ-nantes.fr } notification_email_from keepalived1@inspe.univ-nantes.fr smtp_server 172.20.12.55 router_id ha-smbqualif lvs_flush lvs_flush_onstop } vrrp_instance SMB { virtual_router_id 20 state MASTER interface ens4 priority 150 advert_int 1 track_interface { ens3 } unicast_src_ip 192.168.66.23 unicast_peer { 192.168.66.24 } virtual_ipaddress { 172.26.127.20/28 brd 172.26.127.31 dev ens3 scope global } smtp_alert garp_master_delay 2 garp_master_repeat 2 garp_master_refresh_repeat 1 } virtual_server 172.26.127.20 445 { protocol TCP lb_algo rr lb_kind DR real_server 172.26.127.21 445 { weight 1 TCP_CHECK { connect_timeout 1 connect_port 445 } } real_server 172.26.127.22 445 { weight 1 TCP_CHECK { connect_timeout 1 connect_port 445 } } } virtual_server 172.26.127.20 139 { protocol TCP lb_algo rr lb_kind DR real_server 172.26.127.21 139 { weight 1 TCP_CHECK { connect_timeout 1 connect_port 445 } } real_server 172.26.127.22 139 { weight 1 TCP_CHECK { connect_timeout 1 connect_port 445 } } } Et sur le second serveur keepalived (BACKUP) global_defs { notification_email { nom-p@univ-nantes.fr } notification_email_from keepalived2@inspe.univ-nantes.fr smtp_server 172.20.12.55 router_id ha-smbqualif lvs_flush lvs_flush_onstop } vrrp_instance SMB { virtual_router_id 20 state BACKUP interface ens4 priority 50 advert_int 1 track_interface { ens3 } unicast_src_ip 192.168.66.24 unicast_peer { 192.168.66.23 } virtual_ipaddress { 172.26.127.20/28 brd 172.26.127.31 dev ens3 scope global } garp_master_delay 2 garp_master_repeat 2 garp_master_refresh_repeat 1 } virtual_server 172.26.127.20 445 { protocol TCP lb_algo rr lb_kind DR real_server 172.26.127.21 445 { weight 1 TCP_CHECK { connect_timeout 1 connect_port 445 } } real_server 172.26.127.22 445 { weight 1 TCP_CHECK { connect_timeout 1 connect_port 445 } } } virtual_server 172.26.127.20 139 { protocol TCP lb_algo rr lb_kind DR real_server 172.26.127.21 139 { weight 1 TCP_CHECK { connect_timeout 1 connect_port 445 } } real_server 172.26.127.22 139 { weight 1 TCP_CHECK { connect_timeout 1 connect_port 445 } } } On active keepalived au démarrage des serveurs : # systemctl enable keepalived.service Created symlink /etc/systemd/system/multi-user.target.wants/keepalived.service -> /usr/lib/systemd/system/keepalived.service. Et on démarre keepalived sur les deux serveurs : # systemctl start keepalived.service Si tout se passe bien l’adresse IP 172.66.127.20 doit être visible sur l’interface ens3 du keepalived MASTER. # ip addr show dev ens3 2: ens3: mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 1a:a5:66:04:00:03 brd ff:ff:ff:ff:ff:ff altname enp0s3 inet 172.26.127.23/28 brd 172.26.127.31 scope global ens3 valid_lft forever preferred_lft forever inet 172.26.127.20/28 brd 172.26.127.31 scope global secondary ens3 valid_lft forever preferred_lft forever inet6 fe80::18a5:66ff:fe04:3/64 scope link valid_lft forever preferred_lft forever Et pour vérifier la répartition de charge : # ipvsadm -Ln IP Virtual Server version 1.2.1 (size=32768) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 172.26.127.20:139 rr -> 172.26.127.21:139 Route 1 0 0 -> 172.26.127.22:139 Route 1 0 0 TCP 172.26.127.20:445 rr -> 172.26.127.21:445 Route 1 0 0 -> 172.26.127.22:445 Route 1 0 0 Ici aucune connexion car cette documentation a été réalisée pendant le confinement COVID-19 ;-) === 4 – Ressources documentaires === https://www.keepalived.org/doc/ https://www.keepalived.org/manpage.html