Okay, das verstehe ich jetzt.
Der keepalived läuft aber in dem Fall nicht als pod, oder? Der kann überall laufen, wo der Ingress Endpunkte hat. Die prüft der keepalived. Falls der master nicht mehr healthy ist, würde also einfach der nächste übernehmen, die IP umschalten und dann sind alle Ports direkt wieder erreichbar, nur eben auf dem anderen Node.
Soweit korrekt. Keepalived läuft auf der Node selber tatsächlich, konfiguriert / installiert per Ansible. Ich habe 3 Master. Die Worker Nodes sprechen immer lokal gegen einen HAProxy, der als Backends alle 3 API Endpunkte der Master hat.
Wenn jetzt Master 1 ausfällt, kratzt den Worker das nicht, weil er über den HAProxy immer noch mit den beiden anderen Mastern sprechen kann (loadbalanced API). Soweit zum Cluster internen Ablauf.
Externer Ablauf:
- Sowohl die IPv4 als auch die IPv6 werden über die Shellskripte umgeschaltet. Die IP Konfiguration ist in Keepalived hinterlegt, sodass nur der aktive Master auch wirklich die Floating IP auf dem Interface konfiguriert hat. In dem Moment wo ich keepalived beende, verschwindet auch die FloatingIP vom Interface, falls die Node Master war. Die Shellskripte prüfen jede Minute den Status von Keepalived und falls die Node Master ist, wird zusätzlich geprüft ob der Node die Floating IP zugewiesen ist. Falls nicht, wird diese zugewiesen. Dies trifft sowohl auf die Kubernetes API IP zu, als auch die Ingress IP über welche ich dann meine Seiten erreiche.
Bis auf die bereits erwähnten ca. 20 Sekunden fällt es mir nicht aktiv auf, wenn die IP rumgeschoben wird. Mein externes Monitoring prüft alle Seiten im 30 Sekundentakt und selbst dort ist es selten zu sehen. Mittlerweile hab ich auch in Icinga2 ein dynamisches Monitoring Skript für keepalived:
- prüfe ob Node master ist (keepalived status)
- Falls master. sind die FlaotingIPs auf dem Interface up
- Falls slave, Node sollte keine FloatingIP haben
Gruß