Table des matières

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)

2 VMs avec Samba installé (reals servers)

A adapter en fonction du nombre de serveurs réels sur lesquels répartir la charge.

2 VMs avec keepalived installé (VRRP/HA servers)

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. (

Et une autre dans un réseau privé et qui sera dédié aux communications inter-serveurs, icie ESPE_VPRIVATE.

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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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