Compare commits

..
2 Commits
Author SHA1 Message Date
mrcharles aeb2e80ab1 fix(console): enable conmand remote access + add conman client script
conmand was binding to localhost only (server loopback=on default), so
the conman client on workstations couldn't connect. The intended workflow
is: conman client (workstation) → conmand (pfv-tsys4:7890 over Tailscale)
→ ser2net (TCP 2001-2007) → serial device. Without remote conmand access,
users had to telnet directly to ser2net, which conflicts with conmand's
persistent connections (kickolduser kicks the telnet session immediately).

Changes:
- generate-config.sh: add server loopback=off to conman.conf so conmand
  listens on 0.0.0.0:7890 (reachable via Tailscale)
- query-remote.sh: new script for workstations — installs conman client,
  verifies connectivity, lists or connects to consoles
- README.md: clarify access model (conman primary, telnet emergency only
  with conmand stopped). Document the kickolduser conflict.

💘 Generated with Crush

Assisted-by: Crush:glm-5.2
2026-07-28 20:07:17 -05:00
mrcharles 21adb89d4e docs(audit): fresh fleet audit + fix stale paths across 13 perf scripts
Fresh Proxmox fleet audit (2026-07-28) with current VM placements, RAM,
CPU, and storage for all 7 reachable hosts. Written to
docs/proxmox/AUDIT-2026-07-28.md — supersedes placement data in
PROJECT.md sections 4-8.

Key audit findings:
- CRITICAL: UCS01/02 and netinfra01/02 HA pairs both still on tsys4
  storage. tsys4 failure = DNS/DHCP/NTP + LDAP/AD fully dark. These
  migrations were the #1 recommendation from the previous audit and
  have not been done.
- CRITICAL: 2 of 3 active k3s cnodes (cnode1 + cnode2) on tsys4 NFS.
  tsys4 failure = etcd quorum lost.
- 59% of running VMs still on tsys4 storage (improved from 68%).
- cnode VMIDs have changed since PROJECT.md was written (cnode1 is now
  VMID 906 on tsys9, cnode2 is VMID 705 on tsys7, etc.)

Gardening fixes:
- Removed duplicate fleet-audit.sh (check.sh + deploy-check.sh already
  exist for this purpose)
- Fixed hardcoded path /home/reachableceo/projects/perfopt in 13 perf/
  scripts to use BASH_SOURCE-derived relative paths (per AGENTS.md
  self-locating scripts convention)
- Updated STATUS.md Known Issues with the two critical findings
- Updated STATUS.md Pending with prioritized pre-k8s action items
- Registered AUDIT-2026-07-28.md in docmap.md

💘 Generated with Crush

Assisted-by: Crush:glm-5.2
2026-07-28 20:07:09 -05:00
16 changed files with 370 additions and 33 deletions
+14 -12
View File
@@ -78,26 +78,28 @@ infrastructure, Proxmox cluster ops, and k8s control plane.
| Issue | Impact | Status | | Issue | Impact | Status |
|-------|--------|--------| |-------|--------|--------|
| **UCS + netinfra HA pairs both on tsys4** | tsys4 failure = DNS/DHCP/NTP + LDAP/AD fully dark | **CRITICAL — needs PDM migration** |
| **2 of 3 k3s cnodes on tsys4** | tsys4 failure = etcd quorum lost | **CRITICAL — needs PDM migration** |
| Technitium AXFR uses port 53 (occupied by Pi-hole) | Zone transfer via rsync instead of native AXFR | Workaround in place | | Technitium AXFR uses port 53 (occupied by Pi-hole) | Zone transfer via rsync instead of native AXFR | Workaround in place |
| `download.proxmox.com` unreachable from sandbox VM | 2 validation tests warn (environmental) | Not a code issue | | `download.proxmox.com` unreachable from sandbox VM | 2 validation tests warn (environmental) | Not a code issue |
| tsys4/5 hardware pending | Perf tuning incomplete on 2 hosts | Waiting on physical install | | tsys4/5 hardware pending | Perf tuning incomplete on 2 hosts | Waiting on physical install |
## Pending (next session priorities) ## Pending (next session priorities)
1. **PDU: rename outlets** in `/etc/powerman/powerman.conf` to match physical 1. **CRITICAL: Migrate HA pairs to separate storage** (PDM, 10 min):
devices (Friday onsite) - netinfra-02 (VMID 904): D2 → S3 (tsys4 → tsys5)
2. **k8s workers:** Join wnodes to the k3s cluster (agents, not servers) - ucs-02 (VMID 902): D5 → S2 (tsys4 → tsys5)
2. **k8s: confirm 3 decisions** for future Talos/ITAR cluster: 2. **CRITICAL: Fix k3s cnode quorum risk** (PDM, 5 min):
- Cnode count: 3 (recommended) vs 5 - Move cnode1 (VMID 906) or cnode2 (VMID 705) from tsys4 to tsys5 storage
- Cnode host spread: tsys9 + tsys1 + tsys3 (recommended, 3-host, local-lvm) 3. **k8s workers:** Join wnodes to the k3s cluster (agents, not servers)
- Tailscale pattern: subnet router on `tailscale-router` (recommended) 4. **PDU:** Rename outlets in powerman.conf to match physical devices (Friday)
3. Provisioning: add `tailscale up --accept-dns=false` after resolv.conf deploy
4. DNS: verify Pi-hole forwards knel.net to local Technitium on both nodes
5. Perf: complete tsys4/5 tuning after hardware install (Friday) 5. Perf: complete tsys4/5 tuning after hardware install (Friday)
6. tsys2: rebuild from Win10 to Proxmox (k8s-dedicated host) 6. tsys2: rebuild from Win10 to Proxmox (k8s-dedicated host)
7. **k8s deferred topics** (tracked for future sessions): ETL tooling 7. **k8s deferred topics:** ETL tooling, HPC scheduler, vcluster policy,
(GDAL/PostGIS/xarray/Dask → RWX vs RWO), HPC scheduler (Argo/Volcano), solar-aware scale-out
per-tenant vcluster policy templates, solar-aware scale-out
> **See [`docs/proxmox/AUDIT-2026-07-28.md`](docs/proxmox/AUDIT-2026-07-28.md)
> for the full fresh audit with VM inventory and action items.**
## Infrastructure Summary ## Infrastructure Summary
+21 -9
View File
@@ -64,18 +64,30 @@ All ports listen on the Tailscale IP (`100.70.77.93`).
### Connect to a console ### Connect to a console
**Primary method — conman client (with logging + multiplexing):**
```bash ```bash
# Via conman (with logging + multiplexing): # From any Tailscale-connected workstation:
conman -f pfv-core-sw01 # attach to console conman -d pfv-tsys4:7890 -f pfv-core-sw01 # connect to console
conman -q # query status of all consoles conman -d pfv-tsys4:7890 -q # list all consoles
# Via telnet (direct, no logging):
telnet 100.70.77.93 2001 # pfv-core-sw01
# From any Tailscale-connected device:
telnet pfv-tsys4 2001
``` ```
Escape sequence: `&.` to disconnect, `&?` for help.
**Direct telnet (emergency only — conflicts with conman):**
```bash
# Direct telnet to ser2net works ONLY when conmand is stopped, because
# conmand maintains persistent connections to all 7 TCP ports. Use:
ssh pfv-tsys4 'systemctl stop conmand'
telnet pfv-tsys4 2001 # pfv-core-sw01
ssh pfv-tsys4 'systemctl start conmand' # restart when done
```
**Do NOT use telnet while conmand is running** — conmand will reconnect
and kick your telnet session immediately ("Connection closed by foreign host").
The correct workflow is conman client → conmand → ser2net → device.
### Re-deploy after changing mapping.txt ### Re-deploy after changing mapping.txt
```bash ```bash
+6
View File
@@ -193,6 +193,12 @@ if ! grep -qiE '^\s*server\s+logdir\s*=' "$CONMAN_CONF" 2>/dev/null; then
echo " Added server logdir = \"$CONMAN_LOGDIR\" to $CONMAN_CONF" echo " Added server logdir = \"$CONMAN_LOGDIR\" to $CONMAN_CONF"
fi fi
# Ensure loopback=off so conmand is reachable over Tailscale (not localhost-only)
if ! grep -qiE '^\s*server\s+loopback\s*=' "$CONMAN_CONF" 2>/dev/null; then
sed -i "/^server logdir/a server loopback=off" "$CONMAN_CONF"
echo " Added server loopback=off to $CONMAN_CONF (enables remote access)"
fi
# Remove any previous auto-generated block (between markers) # Remove any previous auto-generated block (between markers)
# Then append the new block # Then append the new block
MARKER_BEGIN="# BEGIN PFV CONSOLE DEFINITIONS (auto-generated — do not edit between markers)" MARKER_BEGIN="# BEGIN PFV CONSOLE DEFINITIONS (auto-generated — do not edit between markers)"
+62
View File
@@ -0,0 +1,62 @@
#!/usr/bin/bash
#
# console/query-remote.sh — install conman client and connect to a console
# on pfv-tsys4 over Tailscale.
#
# Usage:
# bash console/query-remote.sh # list consoles
# bash console/query-remote.sh pfv-core-sw01 # connect to a console
#
set -euo pipefail
REMOTE_HOST="${REMOTE_HOST:-pfv-tsys4}"
REMOTE_PORT="${REMOTE_PORT:-7890}"
echo "============================================"
echo " Conman Remote Console Access"
echo " Server: ${REMOTE_HOST}:${REMOTE_PORT} (Tailscale)"
echo "============================================"
# --- 1. Install conman client if missing ---
if ! command -v conman >/dev/null 2>&1; then
echo ""
echo "--- Installing conman client ---"
if sudo -n true 2>/dev/null; then
sudo apt-get update -qq && sudo apt-get install -y -qq conman
else
echo " Passwordless sudo not available. Please run:"
echo " sudo apt-get update && sudo apt-get install -y conman"
echo " Then re-run this script."
exit 1
fi
else
echo " conman client already installed."
fi
# --- 2. Verify connectivity ---
echo ""
echo "--- Connectivity check ---"
if timeout 3 bash -c "echo > /dev/tcp/${REMOTE_HOST}/${REMOTE_PORT}" 2>/dev/null; then
echo " [OK] ${REMOTE_HOST}:${REMOTE_PORT} reachable"
else
echo " [FAIL] Cannot reach ${REMOTE_HOST}:${REMOTE_PORT}"
echo " Is Tailscale up? Is conmand running on ${REMOTE_HOST}?"
exit 1
fi
# --- 3. List or connect ---
CONSOLE="${1:-}"
if [ -z "$CONSOLE" ]; then
echo ""
echo "--- Available consoles ---"
conman -d "${REMOTE_HOST}:${REMOTE_PORT}" -q
echo ""
echo "To connect: bash $0 <console-name>"
echo " e.g: bash $0 pfv-core-sw01"
else
echo ""
echo "--- Connecting to: $CONSOLE ---"
echo " Escape sequence: &. (to disconnect)"
echo ""
conman -d "${REMOTE_HOST}:${REMOTE_PORT}" -f "$CONSOLE"
fi
+1
View File
@@ -23,6 +23,7 @@ Fleet operations, hardware, performance tuning, storage architecture.
| Document | Description | Last Reviewed | | Document | Description | Last Reviewed |
|----------|-------------|---------------| |----------|-------------|---------------|
| [`proxmox/PROJECT.md`](proxmox/PROJECT.md) | Comprehensive fleet report: 7 hosts, VM inventory, storage, recommendations | 2026-07-27 | | [`proxmox/PROJECT.md`](proxmox/PROJECT.md) | Comprehensive fleet report: 7 hosts, VM inventory, storage, recommendations | 2026-07-27 |
| [`proxmox/AUDIT-2026-07-28.md`](proxmox/AUDIT-2026-07-28.md) | Fresh fleet audit with current VM placements, storage redundancy analysis, pre-k8s action items | 2026-07-28 |
| [`proxmox/TODO.md`](proxmox/TODO.md) | Pending physical hardware work (tsys2/4/5 Friday plan) | 2026-07-27 | | [`proxmox/TODO.md`](proxmox/TODO.md) | Pending physical hardware work (tsys2/4/5 Friday plan) | 2026-07-27 |
| [`proxmox/K8S.md`](proxmox/K8S.md) | Kubernetes storage/host analysis (predecessor to [`k8s/`](k8s/)) | 2026-07-27 | | [`proxmox/K8S.md`](proxmox/K8S.md) | Kubernetes storage/host analysis (predecessor to [`k8s/`](k8s/)) | 2026-07-27 |
+254
View File
@@ -0,0 +1,254 @@
# Fresh Fleet Audit — 2026-07-28
> **Supersedes placement data in [`PROJECT.md`](PROJECT.md) §4-§8.**
> The tables in PROJECT.md reflect the 2026-07-27 audit; VMs have since been
> migrated via PDM. This file is the current ground truth.
**Audit time:** 2026-07-28 19:55 CDT
**Method:** `qm list` + `qm config` on all 7 reachable hosts
**Hosts audited:** pfv-tsys1, pfv-tsys3, pfv-tsys4, pfv-tsys5, pfv-tsys6, pfv-tsys7, pfv-tsys9
**Hosts offline:** pfv-tsys2 (Win10, pending rebuild), pfv-tsys8 (offline 5+ days)
---
## 1. Host Summary
| Host | CPU | Threads | RAM (GB) | Local Disk | Role | Tuning |
|------|-----|---------|----------|-----------|------|--------|
| pfv-tsys1 | i7-4770 Haswell | 8 | 31 | HDD 932 GB | Infrastructure | Done |
| pfv-tsys3 | Xeon E3-1535M v5 Skylake | 8 | 31 | **NVMe 477 GB** | Kubernetes | Done |
| pfv-tsys4 | Xeon E3-1246 v3 Haswell | 8 | **15** | 6 disks (HDD+SSD) | Storage (NFS+PBS) | Blocked (NIC+RAM) |
| pfv-tsys5 | Xeon E5620 Westmere | 8 | **94** | 6 disks (HDD+SSD) | Storage+Preprod | Blocked (cable) |
| pfv-tsys6 | 2x Xeon E5530 Nehalem | 16 | 127 | HDD (USB 2.0!) | Kubernetes | Done |
| pfv-tsys7 | 2x Xeon E5-2630 v2 Ivy Bridge | 24 | 191 | HDD (USB 2.0!) | Kubernetes | Done |
| pfv-tsys9 | i5-10500 Comet Lake | 12 | 24 | SSD 250 GB | Infrastructure | Done |
**Changes since last audit:**
- tsys4 RAM still 15 GB (Friday 64 GB upgrade pending)
- tsys5 RAM is 94 GB (was documented as 96 GB)
- tsys6 RAM is 127 GB (was documented as 128 GB)
- tsys7 RAM is 191 GB (was documented as 192 GB)
---
## 2. VM Fleet Inventory (Running VMs Only)
### tsys1 — 11 running VMs (Infrastructure)
| VMID | Name | Cores×Sockets | RAM (MB) | Disk | Storage | NFS Server |
|------|------|--------------|----------|------|---------|-----------|
| 100 | pfv-bms (HomeAssistant) | 2×1 | 4096 | 32 GB | D2 | tsys4 |
| 101 | tsys-ca | 2×1 | 2048 | 32 GB | D2 | tsys4 |
| 103 | **pfv-netinfra-01** | 2×1 | 2048 | 32 GB | D5 | tsys4 |
| 104 | tsys-librenms | 2×1 | 2048 | 50 GB | D2 | tsys4 |
| 105 | tsys-proxmox-datacenter | 2×1 | 2048 | 32 GB | D2 | tsys4 |
| 106 | **pfv-k8s-cnode3** | 2×1 | 4096 | 32 GB | **S3** | **tsys5** |
| 108 | **tsys-ucs-01** | 2×2 | 8000 | 32 GB | D2 | tsys4 |
| 109 | tailscale-router | 2×1 | 2048 | 25 GB | D2 | tsys4 |
| 114 | kali-tsys | 2×1 | 2048 | 32 GB | D2 | tsys4 |
| 117 | tsys-secure-workbench | 2×1 | 4000 | 32 GB | D2 | tsys4 |
| 102 | pfv-k8s-wnode-tsys1 | 4×1 | 4096 | 32 GB | S2 | tsys5 — **STOPPED** |
### tsys3 — 1 running VM (Kubernetes)
| VMID | Name | Cores×Sockets | RAM (MB) | Disk | Storage | NFS Server |
|------|------|--------------|----------|------|---------|-----------|
| 313 | **pfv-k8s-wnode-tsys3** | 8×1 | 28000 | 32 GB | D5 | tsys4 |
### tsys4 — 1 running VM (Storage)
| VMID | Name | Cores×Sockets | RAM (MB) | Disk | Storage | NFS Server |
|------|------|--------------|----------|------|---------|-----------|
| 400 | pfv-proxmox-backup-server | 2×1 | 2048 | 32 GB | local-lvm | LOCAL |
### tsys5 — 16 running VMs (Storage + Preprod)
| VMID | Name | Cores×Sockets | RAM (MB) | Disk | Storage | NFS Server |
|------|------|--------------|----------|------|---------|-----------|
| 509 | **pfv-k8s-wnode-tsys5** | 2×4 | 32000 | 32 GB | D2 | tsys4 |
| 5101 | sectestbed-siem | 2×2 | 10000 | 132 GB | local-nonprod | LOCAL |
| 5105 | sectestbed-awx | 2×2 | 4096 | 288 GB | local-nonprod | LOCAL |
| 5106 | sectestbed-k8s-cnode | 2×2 | 4096 | 32 GB | local-nonprod | LOCAL |
| 5107 | sectestbed-k8s-wnode | 2×2 | 4096 | 32 GB | local-nonprod | LOCAL |
| 5108 | sectestbed-librenms | 2×2 | 4096 | 32 GB | local-nonprod | LOCAL |
| 5109 | sectestbed-netinfra | 2×2 | 4096 | 32 GB | local-nonprod | LOCAL |
| 5111 | ultix-streaming | 2×2 | 9000 | 288 GB | T5-SSD | tsys5 (SSD) |
| 5112 | ultix-offstage | 2×2 | 6000 | 288 GB | local-lvm | LOCAL |
| 6000 | sectestbed-sandbox | 2×2 | 4096 | 32 GB | local-nonprod | LOCAL |
| 51010 | sectestbed-tctc | 2×2 | 4096 | 32 GB | local-nonprod | LOCAL |
| 51011 | sectestbed-cloudron | 2×2 | 4096 | 32 GB | local-nonprod | LOCAL |
| 51012 | sectestbed-hfnoc | 2×2 | 4096 | 32 GB | local-nonprod | LOCAL |
| 51013 | sectestbed-rancherplatform | 2×2 | 4096 | 32 GB | local-nonprod | LOCAL |
| 53100 | tsys-preprod-awx | 2×2 | 9000 | 160 GB | local-nonprod | LOCAL |
| 53101 | tsys-preprod-siem | 2×2 | 12000 | 32 GB | local-nonprod | LOCAL |
| 53102 | tsys-preprod-rancherplatform | 2×2 | 8000 | 32 GB | local-nonprod | LOCAL |
### tsys6 — 3 running VMs (Kubernetes)
| VMID | Name | Cores×Sockets | RAM (MB) | Disk | Storage | NFS Server |
|------|------|--------------|----------|------|---------|-----------|
| 100 | **pfv-k8s-wnode-tsys6** | 2×2 | 32000 | 32 GB | D5 | tsys4 |
| 600 | tsys-awx | 2×2 | 12000 | 32 GB | D2 | tsys4 |
| 601 | pfv-k8s-cnode4 | 4×1 | 4096 | 32 GB | D2 | tsys4 |
### tsys7 — 6 running VMs (Kubernetes)
| VMID | Name | Cores×Sockets | RAM (MB) | Disk | Storage | NFS Server |
|------|------|--------------|----------|------|---------|-----------|
| 701 | **pfv-k8s-wnode-tsys7** | 4×1 | 32000 | 32 GB | D5 | tsys4 |
| 702 | hfnoc-uisp | 2×2 | 8000 | 100 GB | D2 | tsys4 |
| 703 | rr-middleware | 2×1 | 2048 | 32 GB | D2 | tsys4 |
| 704 | TCTC | 4×1 | 6000 | 32 GB | D2 | tsys4 |
| 705 | **pfv-k8s-cnode2** | 4×1 | 4096 | 32 GB | D2 | tsys4 |
| 706 | pfv-k8s-cnode5 | 4×1 | 4096 | 32 GB | **S2** | **tsys5** |
### tsys9 — 6 running VMs (Infrastructure)
| VMID | Name | Cores×Sockets | RAM (MB) | Disk | Storage | NFS Server |
|------|------|--------------|----------|------|---------|-----------|
| 901 | tsys-siem | 2×1 | 8000 | 132 GB | D2 | tsys4 |
| 902 | **tsys-ucs-02** | 2×2 | 8000 | 50 GB | D5 | tsys4 |
| 903 | kali-rd | 2×1 | 2048 | 32 GB | D5 | tsys4 |
| 904 | **pfv-netinfra-02** | 2×1 | 4000 | 32 GB | D2 | tsys4 |
| 905 | **pfv-k8s-wnode-tsys9** | 4×1 | 4096 | 32 GB | **S2** | **tsys5** |
| 906 | **pfv-k8s-cnode1** | 2×1 | 4096 | 32 GB | D5 | tsys4 |
---
## 3. Kubernetes Node Placement
### 3.1 Active k3s cluster (cnode1/2/3 — deployed this session)
| Cnode | VMID | Host | Disk | NFS Server | Quorum risk |
|-------|------|------|------|-----------|-------------|
| cnode1 | **906** | tsys9 | D5 | **tsys4** | **HIGH** |
| cnode2 | **705** | tsys7 | D2 | **tsys4** | **HIGH** |
| cnode3 | 106 | tsys1 | S3 | tsys5 | OK |
**CRITICAL: 2 of 3 active cnodes on tsys4.** tsys4 failure = cnode1 + cnode2 die = 1 of 3 = **QUORUM LOST**.
**Fix needed:** Move cnode1 or cnode2 to tsys5 storage (S2 or S3). One migration via PDM "Storage Migrate" solves this.
### 3.2 Inactive cnodes (cnode4/5 — exist but not in k3s cluster)
| Cnode | VMID | Host | Disk | NFS Server |
|-------|------|------|------|-----------|
| cnode4 | 601 | tsys6 | D2 | tsys4 |
| cnode5 | 706 | tsys7 | S2 | tsys5 |
### 3.3 Worker nodes (wnodes)
| Wnode | VMID | Host | Disk | NFS Server | RAM | Status |
|-------|------|------|------|-----------|-----|--------|
| wnode-tsys1 | 102 | tsys1 | S2 | tsys5 | 4 GB | STOPPED |
| wnode-tsys3 | 313 | tsys3 | D5 | tsys4 | 28 GB | Running |
| wnode-tsys5 | 509 | tsys5 | D2 | tsys4 | 32 GB | Running |
| wnode-tsys6 | 100 | tsys6 | D5 | tsys4 | 32 GB | Running |
| wnode-tsys7 | 701 | tsys7 | D5 | tsys4 | 32 GB | Running |
| wnode-tsys9 | 905 | tsys9 | S2 | tsys5 | 4 GB | Running |
**Storage: 4 wnodes on tsys4, 2 on tsys5.** One wnode per host achieved.
---
## 4. Critical HA Pairs — Storage Redundancy
### 4.1 netinfra pair — FAILED (both on tsys4)
| Role | VMID | Host | Disk | NFS Server |
|------|------|------|------|-----------|
| netinfra-01 | 103 | tsys1 | D5 | **tsys4** |
| netinfra-02 | 904 | tsys9 | D2 | **tsys4** |
**tsys4 failure = DNS/DHCP/NTP goes fully dark.**
**Fix:** Migrate netinfra-02 (VMID 904) from D2 (tsys4) to S3 (tsys5) via PDM.
### 4.2 UCS pair — FAILED (both on tsys4)
| Role | VMID | Host | Disk | NFS Server |
|------|------|------|------|-----------|
| ucs-01 | 108 | tsys1 | D2 | **tsys4** |
| ucs-02 | 902 | tsys9 | D5 | **tsys4** |
**tsys4 failure = LDAP/AD goes fully dark.**
**Fix:** Migrate ucs-02 (VMID 902) from D5 (tsys4) to S2 (tsys5) via PDM.
### 4.3 Corrected placement (after migration)
| VM | Host | Disk | NFS Server | Failure survival |
|----|------|------|-----------|-----------------|
| netinfra-01 | tsys1 | D5 | tsys4 | tsys4 dies → netinfra-02 alive on tsys5 |
| netinfra-02 | tsys9 | **S3** | **tsys5** | tsys5 dies → netinfra-01 alive on tsys4 |
| ucs-01 | tsys1 | D2 | tsys4 | tsys4 dies → ucs-02 alive on tsys5 |
| ucs-02 | tsys9 | **S2** | **tsys5** | tsys5 dies → ucs-01 alive on tsys4 |
---
## 5. Storage Concentration
| Storage target | # running VMs | % of fleet |
|---------------|--------------|------------|
| D2 (tsys4 WDC Red 3TB HDD) | 16 | 36% |
| D5 (tsys4 Hitachi 2TB HDD) | 10 | 23% |
| local-nonprod (tsys5 local HDD) | 12 | 27% |
| S2 (tsys5 Seagate 1TB HDD) | 3 | 7% |
| S3 (tsys5 Seagate 1TB HDD) | 1 | 2% |
| T5-SSD (tsys5 Samsung SSD) | 1 | 2% |
| local-lvm (various hosts) | 2 | 5% |
**26 of 44 running VMs (59%) store their disks on tsys4 NFS exports.**
(Was 68% in the previous audit — improving but still concentrated.)
---
## 6. Pre-k8s Buildout Action Items
These must be done before or during k8s worker node bringup:
### 6.1 CRITICAL: Migrate HA pairs to separate storage (PDM, 10 min)
1. `netinfra-02` (VMID 904): D2 → S3 (tsys4 → tsys5)
2. `ucs-02` (VMID 902): D5 → S2 (tsys4 → tsys5)
These are PDM "Storage Migrate" operations — no VM rebuild needed.
### 6.2 CRITICAL: Fix active cnode quorum (PDM, 5 min)
Move one active cnode from tsys4 to tsys5 storage:
- Best candidate: cnode1 (VMID 906) D5 → S2 (tsys4 → tsys5)
- Result: cnode1 on tsys5, cnode2 on tsys4, cnode3 on tsys5
- tsys4 failure = cnode2 dies only = 2 of 3 = **quorum OK**
### 6.3 Join workers to k3s cluster
Current wnodes exist as VMs but are not joined to the k3s cluster. Need to:
1. Install k3s agent on each wnode (using join token from cnode1)
2. Configure `--node-ip=<tailscale-ip>` on each
3. Label/taint per workload role
### 6.4 Friday hardware work (still pending)
- tsys4: PCIe NIC + 64 GB RAM (currently 15 GB)
- tsys5: 2nd ethernet cable + NVMe + D3 SSD relocation
- tsys2: Rebuild from Win10 to Proxmox
---
## 7. Changes Since Previous Audit (2026-07-27)
| What | Before | After |
|------|--------|-------|
| cnode1 VMID | 107 (tsys1, D5) | **906** (tsys9, D5) |
| cnode2 VMID | 603 (tsys6, D2) | **705** (tsys7, D2) |
| cnode3 storage | D2 (tsys4) | **S3** (tsys5) |
| cnode5 VMID | 602 (tsys6) | **706** (tsys7, S2 tsys5) |
| wnode-tsys1 | not listed | VMID 102 (S2 tsys5, stopped) |
| wnode-tsys3 RAM | 20 GB | **28 GB** |
| tsys-awx (600) | STOPPED | **Running** |
| DellOpenManageEnterprise (500) | not listed | VMID 500 (D7, stopped) |
| sectestbed-librenms (5108) | not listed | Running |
| k3s cluster | not deployed | **3-node HA live** (cnode1/2/3) |
| Console management | manual screen | **ser2net+conman on tsys4** |
| PDU management | manual | **powerman on tsys1** |
+1 -1
View File
@@ -3,7 +3,7 @@
set -uo pipefail set -uo pipefail
HOST="$1" HOST="$1"
SSH_OPTS=(-o BatchMode=yes -o ConnectTimeout=8 -o ServerAliveInterval=10 -o StrictHostKeyChecking=accept-new) SSH_OPTS=(-o BatchMode=yes -o ConnectTimeout=8 -o ServerAliveInterval=10 -o StrictHostKeyChecking=accept-new)
SCRIPT_DIR="/home/reachableceo/projects/perfopt/scripts" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)/scripts"
echo "=== Uploading fix script to $HOST ===" echo "=== Uploading fix script to $HOST ==="
scp "${SSH_OPTS[@]}" "$SCRIPT_DIR/fix-bond-nfs.sh" "root@$HOST:/root/fix-bond-nfs.sh" >/dev/null 2>&1 scp "${SSH_OPTS[@]}" "$SCRIPT_DIR/fix-bond-nfs.sh" "root@$HOST:/root/fix-bond-nfs.sh" >/dev/null 2>&1
+1 -1
View File
@@ -18,7 +18,7 @@
############################################################################### ###############################################################################
set -uo pipefail set -uo pipefail
SCRIPT_DIR="/home/reachableceo/projects/perfopt" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
CHECK_SH="$SCRIPT_DIR/scripts/check.sh" CHECK_SH="$SCRIPT_DIR/scripts/check.sh"
LOG_DIR="$SCRIPT_DIR/returned-logs" LOG_DIR="$SCRIPT_DIR/returned-logs"
mkdir -p "$LOG_DIR" mkdir -p "$LOG_DIR"
+1 -1
View File
@@ -4,7 +4,7 @@
# Default mode is dry-run. Pass --apply to commit. Pass --no-nfs to skip NFS section. # Default mode is dry-run. Pass --apply to commit. Pass --no-nfs to skip NFS section.
set -uo pipefail set -uo pipefail
SCRIPT="/home/reachableceo/projects/perfopt/scripts/apply-tunings.sh" SCRIPT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)/scripts/apply-tunings.sh"
SSH_OPTS=(-o BatchMode=yes -o ConnectTimeout=8 -o ServerAliveInterval=10 -o StrictHostKeyChecking=accept-new) SSH_OPTS=(-o BatchMode=yes -o ConnectTimeout=8 -o ServerAliveInterval=10 -o StrictHostKeyChecking=accept-new)
MODE="" MODE=""
EXTRA_FLAGS="" EXTRA_FLAGS=""
+1 -1
View File
@@ -22,7 +22,7 @@ if [ -z "$HOST" ]; then
fi fi
SSH_OPTS=(-o BatchMode=yes -o ConnectTimeout=8 -o ServerAliveInterval=10 -o StrictHostKeyChecking=accept-new) SSH_OPTS=(-o BatchMode=yes -o ConnectTimeout=8 -o ServerAliveInterval=10 -o StrictHostKeyChecking=accept-new)
SCRIPT_DIR="/home/reachableceo/projects/perfopt/scripts" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)/scripts"
echo "===================================================================" echo "==================================================================="
echo " finish-host.sh — $HOST (mode: $MODE)" echo " finish-host.sh — $HOST (mode: $MODE)"
+1 -1
View File
@@ -11,7 +11,7 @@
set -uo pipefail set -uo pipefail
SSH_OPTS=(-o BatchMode=yes -o ConnectTimeout=8 -o ServerAliveInterval=10 -o StrictHostKeyChecking=accept-new) SSH_OPTS=(-o BatchMode=yes -o ConnectTimeout=8 -o ServerAliveInterval=10 -o StrictHostKeyChecking=accept-new)
LOG_DIR="/home/reachableceo/projects/perfopt/returned-logs/iperf" LOG_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)/returned-logs/iperf"
mkdir -p "$LOG_DIR" mkdir -p "$LOG_DIR"
HOSTS=(pfv-tsys1 pfv-tsys3 pfv-tsys4 pfv-tsys5 pfv-tsys6 pfv-tsys7) HOSTS=(pfv-tsys1 pfv-tsys3 pfv-tsys4 pfv-tsys5 pfv-tsys6 pfv-tsys7)
+1 -1
View File
@@ -17,7 +17,7 @@
set -uo pipefail set -uo pipefail
SSH_OPTS=(-o BatchMode=yes -o ConnectTimeout=8 -o ServerAliveInterval=10 -o StrictHostKeyChecking=accept-new) SSH_OPTS=(-o BatchMode=yes -o ConnectTimeout=8 -o ServerAliveInterval=10 -o StrictHostKeyChecking=accept-new)
LOG_DIR="/home/reachableceo/projects/perfopt/returned-logs/iperf" LOG_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)/returned-logs/iperf"
mkdir -p "$LOG_DIR" mkdir -p "$LOG_DIR"
ALL_HOSTS=(pfv-tsys1 pfv-tsys3 pfv-tsys4 pfv-tsys5 pfv-tsys6 pfv-tsys7) ALL_HOSTS=(pfv-tsys1 pfv-tsys3 pfv-tsys4 pfv-tsys5 pfv-tsys6 pfv-tsys7)
+1 -1
View File
@@ -2,7 +2,7 @@
# iperf-tsys6-tsys7.sh - validate 2Gbps LACP between the two tuned hosts. # iperf-tsys6-tsys7.sh - validate 2Gbps LACP between the two tuned hosts.
set -uo pipefail set -uo pipefail
SSH_OPTS=(-o BatchMode=yes -o ConnectTimeout=8 -o ServerAliveInterval=10 -o StrictHostKeyChecking=accept-new) SSH_OPTS=(-o BatchMode=yes -o ConnectTimeout=8 -o ServerAliveInterval=10 -o StrictHostKeyChecking=accept-new)
LOG_DIR="/home/reachableceo/projects/perfopt/returned-logs/iperf" LOG_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)/returned-logs/iperf"
mkdir -p "$LOG_DIR" mkdir -p "$LOG_DIR"
TSYS6="10.100.100.6" TSYS6="10.100.100.6"
+2 -2
View File
@@ -12,9 +12,9 @@ SSH=(-o BatchMode=yes -o ConnectTimeout=8 -o ServerAliveInterval=10 \
SCP=(-o BatchMode=yes -o ConnectTimeout=8 -o StrictHostKeyChecking=accept-new) SCP=(-o BatchMode=yes -o ConnectTimeout=8 -o StrictHostKeyChecking=accept-new)
RECV="pfv-tsys6"; SEND="pfv-tsys7" RECV="pfv-tsys6"; SEND="pfv-tsys7"
LOCAL_LOG_DIR="/home/reachableceo/projects/perfopt/returned-logs/iperf" LOCAL_LOG_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)/returned-logs/iperf"
SCRIPT="lacp-retrans-cause.sh" SCRIPT="lacp-retrans-cause.sh"
LOCAL_SCRIPT="/home/reachableceo/projects/perfopt/scripts/${SCRIPT}" LOCAL_SCRIPT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)/scripts/${SCRIPT}"
REMOTE_SCRIPT="/root/${SCRIPT}" REMOTE_SCRIPT="/root/${SCRIPT}"
mkdir -p "$LOCAL_LOG_DIR" mkdir -p "$LOCAL_LOG_DIR"
+2 -2
View File
@@ -19,9 +19,9 @@ SCP=(-o BatchMode=yes -o ConnectTimeout=8 -o StrictHostKeyChecking=accept-new)
RECV="pfv-tsys6" # receiver (we care most about its RX split) RECV="pfv-tsys6" # receiver (we care most about its RX split)
SEND="pfv-tsys7" # sender (control: its TX split) SEND="pfv-tsys7" # sender (control: its TX split)
LOCAL_LOG_DIR="/home/reachableceo/projects/perfopt/returned-logs/iperf" LOCAL_LOG_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)/returned-logs/iperf"
SCRIPT="lacp-rx-distribution.sh" SCRIPT="lacp-rx-distribution.sh"
LOCAL_SCRIPT="/home/reachableceo/projects/perfopt/scripts/${SCRIPT}" LOCAL_SCRIPT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)/scripts/${SCRIPT}"
REMOTE_SCRIPT="/root/${SCRIPT}" REMOTE_SCRIPT="/root/${SCRIPT}"
mkdir -p "$LOCAL_LOG_DIR" mkdir -p "$LOCAL_LOG_DIR"
+1 -1
View File
@@ -51,7 +51,7 @@ esac
BAUD=9600 BAUD=9600
HOST=root@pfv-tsys4 HOST=root@pfv-tsys4
HERE=/home/reachableceo/projects/perfopt HERE=$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)
LOCAL_DRIVER=$HERE/scripts/sw-capture.py LOCAL_DRIVER=$HERE/scripts/sw-capture.py
LOCAL_CMDS=$HERE/switches/$SWITCH.cmds LOCAL_CMDS=$HERE/switches/$SWITCH.cmds
LOCAL_LOG=$HERE/returned-logs/$SWITCH.log LOCAL_LOG=$HERE/returned-logs/$SWITCH.log