Follow-up to #294, which left raw node IPs in the pve scrape config. This removes every hardcoded IP:
Cluster job (cluster=1,node=0): target → pve.apps.svc.cluster.local. Its EndpointSlice load-balances the PVE API across all three nodes, so cluster-wide metrics follow whichever node is up instead of pausing when jupiter (.201) specifically is down — the trade-off #294 called out in its own comment.
Node job (cluster=0,node=1): targets → jupiter/neptune/saturn.renner.uno instead of .201/.202/.203. Per-node identity is preserved (one target per node), the instance label now reads the hostname, and a renumbered node follows DNS without editing this file.
No IP address remains in the block.
Verified live from inside the cluster:
?target=pve.apps.svc.cluster.local&cluster=1 → pve_up for cluster + all three nodes
proxmox-cluster dashboard is max by (id) and does not filter on instance, so the label change breaks no panel.
Follow-up to #294, which left raw node IPs in the pve scrape config. This removes every hardcoded IP:
- **Cluster job** (`cluster=1,node=0`): target → `pve.apps.svc.cluster.local`. Its EndpointSlice load-balances the PVE API across all three nodes, so cluster-wide metrics follow whichever node is up instead of pausing when jupiter (.201) specifically is down — the trade-off #294 called out in its own comment.
- **Node job** (`cluster=0,node=1`): targets → `jupiter/neptune/saturn.renner.uno` instead of `.201/.202/.203`. Per-node identity is preserved (one target per node), the `instance` label now reads the hostname, and a renumbered node follows DNS without editing this file.
No IP address remains in the block.
**Verified live from inside the cluster:**
- `?target=pve.apps.svc.cluster.local&cluster=1` → `pve_up` for cluster + all three nodes
- `?target=jupiter.renner.uno&node=1` → jupiter node-local metrics
proxmox-cluster dashboard is `max by (id)` and does not filter on `instance`, so the label change breaks no panel.
The pve cluster-collector job hardcoded 10.2.40.201, so cluster-wide
metrics (pve_up, guest info, storage) paused whenever jupiter
specifically was down, even with the cluster healthy. Point it at the
pve Service DNS (pve.apps.svc.cluster.local) whose EndpointSlice
load-balances the PVE API across all three nodes, so the scrape
follows whichever node is up. Node-local job keeps the three explicit
targets — it needs per-node identity.
Verified: exporter returns pve_up for cluster + all nodes when
targeted at the Service DNS.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015K7gLUVVnutvDnzV2TrMRJ
No hardcoded IP remains in the pve scrape config: the node job now
targets jupiter/neptune/saturn.renner.uno. instance label reads the
hostname, and a renumbered node follows DNS without a config edit.
Verified: exporter returns node-local metrics when targeted at
jupiter.renner.uno from inside the cluster.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015K7gLUVVnutvDnzV2TrMRJ
claude-bot
changed title from fix(monitoring): scrape pve cluster metrics via Service VIP, not a fixed node to fix(monitoring): scrape pve via Service VIP + node FQDNs, no hardcoded IPs2026-07-17 18:24:11 +00:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Follow-up to #294, which left raw node IPs in the pve scrape config. This removes every hardcoded IP:
cluster=1,node=0): target →pve.apps.svc.cluster.local. Its EndpointSlice load-balances the PVE API across all three nodes, so cluster-wide metrics follow whichever node is up instead of pausing when jupiter (.201) specifically is down — the trade-off #294 called out in its own comment.cluster=0,node=1): targets →jupiter/neptune/saturn.renner.unoinstead of.201/.202/.203. Per-node identity is preserved (one target per node), theinstancelabel now reads the hostname, and a renumbered node follows DNS without editing this file.No IP address remains in the block.
Verified live from inside the cluster:
?target=pve.apps.svc.cluster.local&cluster=1→pve_upfor cluster + all three nodes?target=jupiter.renner.uno&node=1→ jupiter node-local metricsproxmox-cluster dashboard is
max by (id)and does not filter oninstance, so the label change breaks no panel.fix(monitoring): scrape pve cluster metrics via Service VIP, not a fixed nodeto fix(monitoring): scrape pve via Service VIP + node FQDNs, no hardcoded IPs