Zwei keepalived-Flapping-Restursachen: 1) Strukturell: der Cluster-Push (autoRegister, Primary→Secondary) trägt KEINE public_ip → der Empfänger AgentRegisterPeer ließ sie NULL → Peer fehlte im nft-peer_ipv4-Set → VRRP-Adverts (eth0/VI_1) nur via conntrack → Flapping. (utm-1 lernte utm-2 korrekt via Joiner-Client-IP in preRegisterJoiner; die Gegenrichtung fehlte.) Fix: AgentRegisterPeer fällt bei leerem req.PublicIP auf die mTLS-Client-IP (c.ClientIP()) zurück — die EIGEN-IP des Peers, nicht die VIP. Selbstheilend, überlebt Re-Joins/Failover. 2) advert_int 1 → 2 (Master-Down ~6s statt ~3s): reißt nicht mehr bei kurzen VM-/Heartbeat-Hiccups (VI_HB). Trade-off: Failover-Erkennung ~6s. Tests: advert_int 2 im Render. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
86 lines
2.5 KiB
Smarty
86 lines
2.5 KiB
Smarty
global_defs {
|
|
router_id {{ .RouterID }}
|
|
script_user root
|
|
enable_script_security
|
|
# GARP: beim Master-Wechsel Gratuitous-ARP forciert senden (repeat) UND
|
|
# periodisch auffrischen (master_refresh) — sonst lässt der Upstream-Switch
|
|
# die VIP-MAC altern und die Failover-IP wird nach Minuten unerreichbar.
|
|
# Ergänzt durch den Priming-Ping in keepalived-master.sh (Traffic AUS der VIP).
|
|
# (vrrp_garp_interval/gna NICHT setzen: keepalived 2.3.x lehnt 0 ab, Default passt.)
|
|
vrrp_garp_master_repeat 5
|
|
vrrp_garp_master_refresh 60
|
|
}
|
|
|
|
{{/* KEIN weight: in einer vrrp_sync_group ignoriert keepalived gewichtete
|
|
Track-Scripts ("ignoring tracked script ... with weights due to SYNC
|
|
group") → die Health-Checks wären wirkungslos. Ohne weight wirken sie
|
|
als binäre FAULT-Trigger: schlägt ein Check fall-mal in Folge fehl,
|
|
geht die Instanz (und via Sync-Group der ganze Node) in FAULT → der
|
|
gesunde Peer übernimmt. Für einen 2-Node-Cluster die saubere Semantik. */}}
|
|
vrrp_script chk_edgeguard {
|
|
script "/usr/lib/edgeguard/keepalived-check.sh"
|
|
interval 2
|
|
fall 8
|
|
rise 2
|
|
}
|
|
{{ if .GWCheckIP }}
|
|
vrrp_script chk_gateway {
|
|
script "/usr/lib/edgeguard/keepalived-gw-check.sh {{ .GWCheckIP }}"
|
|
interval 5
|
|
fall 5
|
|
rise 2
|
|
}
|
|
{{ end }}
|
|
{{ if .HBInterface }}
|
|
vrrp_sync_group VG_1 {
|
|
group {
|
|
VI_1
|
|
VI_HB
|
|
}
|
|
}
|
|
{{ end }}
|
|
vrrp_instance VI_1 {
|
|
state {{ .State }}
|
|
interface {{ .Interface }}
|
|
virtual_router_id {{ .RouterID }}
|
|
priority {{ .Priority }}
|
|
advert_int 2
|
|
nopreempt
|
|
{{ if .SrcIP }} unicast_src_ip {{ .SrcIP }}
|
|
unicast_peer {
|
|
{{ .PeerIP }}
|
|
}
|
|
{{ end }} authentication {
|
|
auth_type PASS
|
|
auth_pass {{ .AuthPass }}
|
|
}
|
|
virtual_ipaddress {
|
|
{{ range .VIPs }} {{ .Address }}/{{ .Prefix }} dev {{ .Device }}
|
|
{{ end }} }
|
|
track_script {
|
|
chk_edgeguard
|
|
{{ if .GWCheckIP }} chk_gateway
|
|
{{ end }} }
|
|
notify_master "/usr/lib/edgeguard/keepalived-master.sh"
|
|
notify_backup "/usr/lib/edgeguard/keepalived-backup.sh"
|
|
notify_fault "/usr/lib/edgeguard/keepalived-backup.sh"
|
|
}
|
|
{{ if .HBInterface }}
|
|
vrrp_instance VI_HB {
|
|
state {{ .State }}
|
|
interface {{ .HBInterface }}
|
|
virtual_router_id {{ .HBRouterID }}
|
|
priority {{ .Priority }}
|
|
advert_int 2
|
|
nopreempt
|
|
{{ if .HBSrcIP }} unicast_src_ip {{ .HBSrcIP }}
|
|
unicast_peer {
|
|
{{ .HBPeerIP }}
|
|
}
|
|
{{ end }} authentication {
|
|
auth_type PASS
|
|
auth_pass {{ .AuthPass }}
|
|
}
|
|
}
|
|
{{ end }}
|