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
|
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 := `
|
q := `
|
||||||
SELECT ni.name, ia.address, ia.prefix
|
SELECT ni.name, ia.address, ia.prefix
|
||||||
FROM ip_addresses ia
|
FROM ip_addresses ia
|
||||||
JOIN network_interfaces ni ON ni.id = ia.interface_id
|
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 {
|
if excludeEthernet {
|
||||||
q += `
|
q += `
|
||||||
AND ni.type != 'ethernet'`
|
AND ni.type != 'ethernet'`
|
||||||
|
|||||||
Reference in New Issue
Block a user