From 6f38ad67e0f83616777c872d7b58fbd59fa586d9 Mon Sep 17 00:00:00 2001 From: beatzaplenty Date: Wed, 29 Jul 2026 16:18:45 +1000 Subject: [PATCH] =?UTF-8?q?feat(ha):=20add=20dual=20VIP=20=E2=80=94=20reta?= =?UTF-8?q?in=20192.168.2.229=20LAN=20alongside=20192.168.5.229=20storage?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Both VIPs fail over together in ha-group: vip-lan: 192.168.2.229/24 on ens18 (vmbr0) — LAN iSCSI + NFS access vip-storage: 192.168.5.229/24 on ens20 (vmbr2) — storage-client iSCSI + NFS variables.nix: haServerLanVip = "192.168.2.229" cluster-init.sh: both VIP primitives in ha-group XML; VIP_LAN var added ip-addressing.md: both VIP entries documented Co-Authored-By: Claude Sonnet 4.6 --- docs/ip-addressing.md | 5 +++-- scripts/ha/cluster-init.sh | 44 ++++++++++++++++++++++++++------------ variables.nix | 3 ++- 3 files changed, 35 insertions(+), 17 deletions(-) diff --git a/docs/ip-addressing.md b/docs/ip-addressing.md index 5887e02..f719995 100644 --- a/docs/ip-addressing.md +++ b/docs/ip-addressing.md @@ -57,7 +57,7 @@ All VMs and LXC containers run on pve1. | IP | Hostname | Role | Status | |---|---|---|---| -| `192.168.2.229` | — | Was planned as ha-vip; VIP moved to `192.168.5.229` (vmbr2) | Unassigned | +| `192.168.2.229` | ha-vip-lan | HA file server LAN floating VIP (Pacemaker `vip-lan`) — LAN iSCSI + NFS | Active | | `192.168.2.228` | ha-node1 | HA file server node 1 — management NIC | Active | | `192.168.2.227` | ha-node2 | HA file server node 2 — management NIC | Active | | `192.168.2.226` | server | Current NFS/ZFS file server — retires when HA is live | Retiring | @@ -125,7 +125,8 @@ Current → target IP for every host being renumbered. | nixos workstation | `192.168.2.119` | `192.168.2.243` | `networking.interfaces` / NetworkManager on guest | | ha-node1 | — | `192.168.2.228` (LAN), `192.168.4.228` (cluster), `192.168.5.228` (storage) | active | | ha-node2 | — | `192.168.2.227` (LAN), `192.168.4.227` (cluster), `192.168.5.227` (storage) | active | -| ha-vip | — | `192.168.5.229` (vmbr2 / Pacemaker IPaddr2) | active | +| ha-vip-lan | — | `192.168.2.229` (vmbr0 / Pacemaker `vip-lan`) — LAN iSCSI + NFS | active | +| ha-vip-storage | — | `192.168.5.229` (vmbr2 / Pacemaker `vip-storage`) — storage-client iSCSI + NFS | active | | server | `192.168.2.252` | `192.168.2.226` | static config on guest | | docker | `192.168.2.249` | `192.168.2.225` | static config on guest | | nix-cache | `192.168.2.120` | `192.168.2.224` | static config on guest | diff --git a/scripts/ha/cluster-init.sh b/scripts/ha/cluster-init.sh index 14ad6d1..657aad7 100755 --- a/scripts/ha/cluster-init.sh +++ b/scripts/ha/cluster-init.sh @@ -26,7 +26,8 @@ NODE1="${NODE1:-ha-server-1}" NODE2="${NODE2:-ha-server-2}" NODE1_IP="${NODE1_IP:-192.168.2.228}" # vars.haServer1Ip NODE2_IP="${NODE2_IP:-192.168.2.227}" # vars.haServer2Ip -VIP="${VIP:-192.168.5.229}" # vars.haServerVip +VIP="${VIP:-192.168.5.229}" # vars.haServerVip (storage-client, vmbr2) +VIP_LAN="${VIP_LAN:-192.168.2.229}" # vars.haServerLanVip (LAN, vmbr0) XFS_MOUNT="${XFS_MOUNT:-/srv/ha-data}" # vars.haStorageRoot ISCSI_IQN="${ISCSI_IQN:-iqn.2026-01.home.sweet:ha-storage}" # vars.haIscsiIqn ISCSI_LUN_FILE="${XFS_MOUNT}/iscsi-lun.img" @@ -416,15 +417,28 @@ cibadmin --replace --scope resources --xml-text ' - - - - + + + + + - - - + + + + + + + + + + + + + + + @@ -441,11 +455,11 @@ crm_resource --cleanup 2>/dev/null || true log "Waiting for resources to start..." for i in $(seq 1 60); do - if crm_resource -r vip --locate 2>/dev/null | grep -q "running on"; then - log "VIP is up: $(crm_resource -r vip --locate)" + if crm_resource -r vip-storage --locate 2>/dev/null | grep -q "running on"; then + log "VIPs are up: $(crm_resource -r vip-storage --locate)" break fi - [[ $i -eq 60 ]] && { warn "VIP not up after 120 s — check: crm_mon -1"; break; } + [[ $i -eq 60 ]] && { warn "VIPs not up after 120 s — check: crm_mon -1"; break; } sleep 2 done @@ -453,9 +467,11 @@ log "" log "═══════════════════════════════════════════════════════════════" log " HA cluster initialised." log "" -log " crm_mon -1 — cluster status" -log " iscsiadm -m discovery -t st -p ${VIP} — verify iSCSI target" -log " showmount -e ${VIP} — verify NFS exports" +log " crm_mon -1 — cluster status" +log " iscsiadm -m discovery -t st -p ${VIP} — verify iSCSI (storage net)" +log " iscsiadm -m discovery -t st -p ${VIP_LAN} — verify iSCSI (LAN)" +log " showmount -e ${VIP} — verify NFS exports (storage net)" +log " showmount -e ${VIP_LAN} — verify NFS exports (LAN)" log "" log " To enable STONITH (after deploying fence SSH key):" log " 1. Fill in VMID_NODE1 / VMID_NODE2 in cluster-enable-stonith.sh" diff --git a/variables.nix b/variables.nix index bd40001..68c1248 100644 --- a/variables.nix +++ b/variables.nix @@ -119,7 +119,8 @@ haStoragePrefixLength = 29; # cluster subnet prefix length (/29) haServer1ClientIp = "192.168.5.228"; # storage-client IP, node 1 (vmbr2 / ens20) haServer2ClientIp = "192.168.5.227"; # storage-client IP, node 2 (vmbr2 / ens20) - haServerVip = "192.168.5.229"; # floating VIP on vmbr2 (Pacemaker IPaddr2) + haServerVip = "192.168.5.229"; # storage-client floating VIP on vmbr2 (Pacemaker IPaddr2 vip-storage) + haServerLanVip = "192.168.2.229"; # LAN floating VIP on vmbr0 (Pacemaker IPaddr2 vip-lan) — LAN iSCSI/NFS access dockerStorageIp = "192.168.5.225"; # docker CT storage-client IP (vmbr2 / eth1) serverStorageIp = "192.168.5.226"; # server VM storage-client IP (vmbr2 / ens19) haClientCidr = "192.168.5.0/24"; # storage-client subnet — internal to pve1 only