fix(cluster): VIPs nie statisch binden — Duplicate-IP-Kernbug — v1.2.102
Ergänzt v1.2.101: der ip-addresses-Apply (internal/services/ipaddresses/ apply.go) band ALLE aktiven Adressen statisch — inkl. is_vip. RenderSecondary (das eth0 ausschließt) ist toter Code, wird nie aufgerufen. Folge: die VIP (89.163.205.100 + VLAN-Gateways 10.0.x.1) lag auf dem Node statisch gebunden, UNABHÄNGIG von keepalived. Sobald keepalived die VIP per Failover auf den Peer legte, lag sie auf BEIDEN Nodes → Duplicate-IP/ARP- Konflikt → UniFi-Tunnel/LAN bricht (erklärt „utm-1 stoppen → sofort stabil": der Konflikt verschwindet, nicht VRRP-Failover). Fix: Render-Query schließt is_vip hart aus (AND ia.is_vip = false) → VIPs gehören ausschließlich keepalived (nur der VRRP-Master trägt sie). Gilt für beide Render-Pfade. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -40,11 +40,17 @@ func (g *Generator) render(ctx context.Context, excludeEthernet bool) error {
|
||||
prefix int
|
||||
}
|
||||
|
||||
// is_vip-Adressen werden NIE statisch gebunden — sie gehören
|
||||
// ausschließlich keepalived (nur der VRRP-Master trägt die VIP). Würde
|
||||
// der Apply sie statisch binden, läge die VIP nach einem Failover auf
|
||||
// BEIDEN Nodes (statisch hier + keepalived drüben) → Duplicate-IP/ARP-
|
||||
// Konflikt → Tunnel/LAN bricht. Deshalb hart ausschließen.
|
||||
q := `
|
||||
SELECT ni.name, ia.address, ia.prefix
|
||||
FROM ip_addresses ia
|
||||
JOIN network_interfaces ni ON ni.id = ia.interface_id
|
||||
WHERE ia.active = true`
|
||||
WHERE ia.active = true
|
||||
AND ia.is_vip = false`
|
||||
if excludeEthernet {
|
||||
q += `
|
||||
AND ni.type != 'ethernet'`
|
||||
|
||||
Reference in New Issue
Block a user