Node metrics on master: where the numbers disagree

rancher/dashboard issue 16247 · master preview (built after PR 18858) · cluster created-dashboard-2 · 2026-11-02

How these screenshots were taken

Baseline
0

With no reserved resources, every page agrees

real data, nothing changed
Real data
Cluster Dashboard: memory Used 6.84 / 11.37 GiB = 60.16%
Cluster Dashboard capacity cards, real data
Node detail, pool1: memory 5.6 of 7.63 GiB = 73%. The node list shows 73% for the same node.
Node detail gauges for pool1, real data
Inconsistencies, shown live
1

The same node shows a different memory % on the node list and the node detail page, and the cluster figure matches neither

node.js:224 ramUsagePercentage (÷ capacity) · detail/node.vue:231 (÷ allocatable) · index.vue:421,431 ((usage − reserved) ÷ allocatable)
Simulated reservation
Node list: pool1 RAM 74% (usage ÷ capacity). Note CPU here is ÷ allocatable, so even the two columns use different rules.
Node list with pool1 at 74% RAM
Node detail, pool1: Memory 85%, red (usage ÷ allocatable).
Node detail with pool1 memory at 85%
Cluster Dashboard: memory Used 51.87%: the usage of both nodes minus what they reserve, ÷ their allocatable.
Cluster dashboard memory used 51.87%
WhereFormula on masterCalculationShows
Node list, pool1usage ÷ capacity5.62 ÷ 7.63 GiB74%
Node detail, pool1usage ÷ allocatable5.62 ÷ 6.63 GiB85%
Cluster Dashboard(usage − (capacity − allocatable)) ÷ allocatable(6.86 − 2) ÷ 9.37 GiB51.87%
For comparison: sum of the node listusage ÷ capacity6.86 ÷ 11.37 GiB60.4%
2

The cluster totals leave out nodes that the node list still shows

index.vue:201 schedulableWorkerNodes (schedulable AND worker)
Simulated cordon
Node list: the autoscale node is Cordoned but still listed, using 33% RAM.
Node list with autoscale node cordoned
Cluster Dashboard: totals drop to pool1 only (3.9 cores, 6.63 GiB, 110 pods). The cordoned node's usage and capacity disappear from every gauge, so the dashboard no longer adds up to the list.
Cluster dashboard counting only pool1

The same happens for any node without the worker role, such as a dedicated control-plane node. PR 18858 made this choice on purpose (count only where pods can be scheduled), but nothing on the page says so.

3

The same Cluster Dashboard shows different numbers depending on whether you opened the Nodes page first

index.vue:126 loads management nodes only for local · node.js:145 isWorker · list/node.vue:199 loads them · index.vue:172 clears them from the wrong store
Simulated imported cluster

This simulates an imported cluster whose Kubernetes nodes have no node-role.kubernetes.io/worker label (common for k3s, EKS, AKS and GKE nodes), with the same reservation as scenario 1. Rancher's own node records still mark them as workers.

A. Dashboard opened directly: Memory Used 75.35%, CPU Used 8.96%
Dashboard opened directly, memory 75.35%
B. Same tab, after visiting Nodes and coming back: Memory Used 54.00%, CPU Used 5.51%
Dashboard after visiting nodes, memory 54.00%
4

Used can go negative, and a negative value is drawn as a full bar

index.vue:421 useful = usage − systemReservedCpu (no lower bound)
Simulated larger reservation
Cluster Dashboard with 0.4 CPU reserved per node: CPU Used −0.29 / 5.2 cores = −5.62%, and the bar is drawn full and green.
CPU used -5.62% with a full green bar

Usage was 0.51 cores against 0.8 reserved. The reservation is larger than a typical EKS node's, picked to make the effect visible. It happens whenever a cluster is quieter than its reservations, for example idle nodes on AKS or Harvester (harvester-118 reserves 1.06 of 24 cores).

From the code only, not shown here