fix(cluster): selbstheilende public_ip + advert_int 2 (Flapping) — v1.2.107
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>
This commit is contained in:
@@ -925,6 +925,14 @@ func (h *ClusterHandler) AgentRegisterPeer(c *gin.Context) {
|
||||
if req.PublicIP != "" {
|
||||
v := req.PublicIP
|
||||
n.PublicIP = &v
|
||||
} else if ip := c.ClientIP(); ip != "" {
|
||||
// Der Push-Payload (autoRegister, Primary→Secondary) trägt KEINE
|
||||
// public_ip → sonst bliebe sie NULL und der Peer fehlt im nft-
|
||||
// peer_ipv4-Set → VRRP-Adverts nur via conntrack → Flapping. Der
|
||||
// pushende Peer verbindet sich über mTLS von seiner EIGEN-IP (nicht
|
||||
// der VIP — der Kernel nimmt die primäre Interface-IP als Source),
|
||||
// genau wie preRegisterJoiner die Joiner-IP übernimmt. Selbstheilend.
|
||||
n.PublicIP = &ip
|
||||
}
|
||||
if req.InternalIP != "" {
|
||||
v := req.InternalIP
|
||||
|
||||
Reference in New Issue
Block a user