Ich verwende keepalived, um eine Floating-IP zwischen zwei VMs zu wechseln.
/etc/keepalived/keepalived.conf
auf VM 1:
vrrp_instance VI_1 {
state MASTER
interface ens160
virtual_router_id 101
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass secret
}
virtual_ipaddress {
1.2.3.4
}
}
/etc/keepalived/keepalived.conf
auf VM 2:
vrrp_instance VI_1 {
state MASTER
interface ens160
virtual_router_id 101
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass secret
}
virtual_ipaddress {
1.2.3.4
}
}
Dies funktioniert grundsätzlich einwandfrei, mit einer Ausnahme: Jedes Mal, wenn systemd aktualisiert wird (es läuft unter Ubuntu 18.04), wird die Netzwerkkomponente neu geladen, was dazu führt, dass die Floating-IP gelöscht wird, da sie nicht im System konfiguriert ist. Da sich beide Keepalived-Instanzen immer noch gegenseitig anpingen können, sieht keiner von ihnen etwas Falsches und keiner von ihnen reagiert darauf, was dazu führt, dass die schwebende IP nicht funktioniert.
Ich habe festgestellt, dass Sie mit einem einfachen Skript wie diesem nach der IP suchen können:
vrrp_script chk_proxyip {
script "/sbin/ip addr |/bin/grep 1.2.3.4"
}
vrrp_instance VI_1 {
# [...]
track_script {
chk_proxyip
}
}
Ich bin mir aber nicht sicher, ob dies ein funktionierender Ansatz ist.
Wenn ich es richtig verstehe, würde Folgendes passieren, wenn ich dieses Skript auf VM1 konfiguriere:
- VM1 verliert die IP aufgrund eines Neustarts des Systems
- Keepalived auf VM1 erkennt den Verlust der IP
- keepalived wechselt in den
FAULT
Status und beendet die Übertragung von vrrp-Paketen - Keepalived auf VM2 erkennt den Verlust von Keepalived auf VM1 und stellt die Floating-IP auf
Zu diesem Zeitpunkt funktioniert die IP auf VM2 wieder, aber VM1 würde in diesem Zustand bleiben, da die IP auf VM1 nie wieder angezeigt wird. Wenn VM2 ausfällt (aus welchem Grund auch immer), würde VM1 es nicht übernehmen, da es sich noch im FAULT
Status befindet.
Wie kann ich sicherstellen, dass die Floating-IP auf einer der VMs immer aktiv ist?
Weitere Tests:
Ich habe versucht, die Floating-IP zu pingen, anstatt zu überprüfen, ob sie auf einem bestimmten Host in einem check_script aktiv ist:
vrrp_script chk_proxyip {
script "/bin/ping -c 1 -w 1 1.2.3.4"
interval 2
}
Das Konfigurieren dieses Skripts auf Knoten 2 führte zu folgenden Ergebnissen:
- Die IP auf Knoten 1 wurde zum Testen entfernt
- Knoten 2 hat den IP-Verlust erkannt und von
BACKUP
auf geändertFAULT
- Knoten 1 ignorierte die Statusänderung und blieb
MASTER
Das Ergebnis: Die IP blieb niedrig.
Das Konfigurieren des Skripts auf Knoten 1 führte zu folgenden Ergebnissen:
- Die IP auf Knoten 1 wurde entfernt
- Knoten 1 hat den IP-Verlust erkannt und von
MASTER
auf geändertFAULT
- Knoten 2 hat die Statusänderung auf Knoten 1 erkannt und von
BACKUP
auf geändertMASTER
, wobei die Floating-IP auf Knoten 2 konfiguriert wurde
Na und dann ...
Feb 13 10:11:26 node2 Keepalived_vrrp[3486]: VRRP_Instance(VI_1) Transition to MASTER STATE
Feb 13 10:11:27 node2 Keepalived_vrrp[3486]: VRRP_Instance(VI_1) Entering MASTER STATE
Feb 13 10:11:29 node2 Keepalived_vrrp[3486]: VRRP_Instance(VI_1) Received advert with higher priority 150, ours 100
Feb 13 10:11:29 node2 Keepalived_vrrp[3486]: VRRP_Instance(VI_1) Entering BACKUP STATE
Feb 13 10:11:32 node2 Keepalived_vrrp[3486]: VRRP_Instance(VI_1) Transition to MASTER STATE
Feb 13 10:11:33 node2 Keepalived_vrrp[3486]: VRRP_Instance(VI_1) Entering MASTER STATE
Feb 13 10:11:36 node2 Keepalived_vrrp[3486]: VRRP_Instance(VI_1) Received advert with higher priority 150, ours 100
Feb 13 10:11:36 node2 Keepalived_vrrp[3486]: VRRP_Instance(VI_1) Entering BACKUP STATE
Feb 13 10:11:38 node2 Keepalived_vrrp[3486]: VRRP_Instance(VI_1) Transition to MASTER STATE
Feb 13 10:11:39 node2 Keepalived_vrrp[3486]: VRRP_Instance(VI_1) Entering MASTER STATE
Feb 13 10:11:41 node2 Keepalived_vrrp[3486]: VRRP_Instance(VI_1) Received advert with higher priority 150, ours 100
Feb 13 10:11:41 node2 Keepalived_vrrp[3486]: VRRP_Instance(VI_1) Entering BACKUP STATE
Feb 13 10:11:44 node2 Keepalived_vrrp[3486]: VRRP_Instance(VI_1) Transition to MASTER STATE
Feb 13 10:11:45 node2 Keepalived_vrrp[3486]: VRRP_Instance(VI_1) Entering MASTER STATE
Feb 13 10:11:47 node2 Keepalived_vrrp[3486]: VRRP_Instance(VI_1) Received advert with higher priority 150, ours 100
...
Ich musste keepalived auf Knoten 1 neu starten, um das Ping-Pong-Spiel zwischen den Knoten zu stoppen.