====== 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