The Nodes view shows CPU and memory usage alongside allocatable capacity for each node, helping you assess node saturation and plan scaling.

Nodes List Page Columns
Node Name
- This column is derived from the resource attribute
k8s.node.name. - Identifier of the Kubernetes node.
- Click the name to open the node detail page and drill into per-node CPU, memory, filesystem, network, top-pod charts, logs, and events.
Cluster Name
- This column is derived from the resource attribute
k8s.cluster.name. - Cluster the node belongs to.
- In multi-cluster setups, use this to scope troubleshooting (scheduling failures, version skew, control-plane incidents) to a single cluster.
CPU Usage (cores)
- This column relies on the OTel metric
k8s.node.cpu.usagefrom the kubeletstats receiver, defined as "Total CPU usage (sum of all cores per second) averaged over the sample window". - Total CPU consumed across all pods on the node, expressed in CPU-core units: a value of
1.0means one full core in use. - Compare against CPU Alloc (cores) to gauge saturation; when the gap closes, the node is a candidate for workload rebalancing, pod rightsizing, or cluster scale-out.
CPU Alloc (cores)
- This column relies on the OTel metric
k8s.node.allocatable_cpufrom the k8s_cluster receiver; disabled by default: enable via the receiver'sallocatable_types_to_report: [cpu]config. - CPU capacity available for pod scheduling, computed as
node capacity − kube-reserved − system-reserved − eviction-hardper the K8sReserve Compute Resourcesguide. The scheduler compares this against the sum ofrequests.cpuacross already-scheduled pods (not their actual usage) when deciding if a new pod fits. - CPU Usage (cores) approaching this value signals CPU saturation, not scheduling headroom: a node can be usage-idle but request-full (rejects new pods) or usage-hot but request-light (still schedulable). If new pods stay
Pending, check aggregaterequests.cpuagainst this value, not usage; revisit reservations, pod requests, or add capacity.
Memory Usage (WSS)
- This column relies on the OTel metric
k8s.node.memory.working_setfrom the kubeletstats receiver, sourced from the kubelet's stats-summary API. - Working Set Size across all pods on the node: anonymous pages plus active file pages, excluding inactive file pages (which the kernel can reclaim under pressure); this is the value the kubelet evaluates against
memory.availableto set the MemoryPressure condition. - A node trending toward its Memory Allocatable is at imminent eviction risk; the kubelet evicts in QoS order: BestEffort → Burstable → Guaranteed.
Memory Allocatable
- This column relies on the OTel metric
k8s.node.allocatable_memoryfrom the k8s_cluster receiver; disabled by default: enable via the receiver'sallocatable_types_to_report: [memory]config. - Memory available for pod scheduling, computed as
node capacity − kube-reserved − system-reserved − eviction-hard. The scheduler uses this to decide if a new pod'srequests.memoryfits. - When Memory Usage (WSS) closes in on this value and
memory.availabledrops below the kubelet's hard threshold (default100Mi), MemoryPressure is set with0sgrace and eviction begins.
Node Condition
- This column relies on the OTel metric
k8s.node.condition_readyfrom the k8s_cluster receiver, encoded1= True / Ready,0= False / NotReady,-1= Unknown. - The kubelet periodically posts node status to the API server:
True(kubelet healthy, accepting pods),False(kubelet reporting unhealthy), andUnknown(no kubelet update arrived within the grace period; recorded by the node controller, not the kubelet itself). - A NotReady node taints with
node.kubernetes.io/not-ready:NoExecute; pods are evicted after the default 5-minute toleration window: investigate the kubelet and the kubelet→API-server network path.
Pod Counts by Phase
- This column relies on the OTel metric
k8s.pod.phasefrom the k8s_cluster receiver, encoded1= Pending,2= Running,3= Succeeded,4= Failed,5= Unknown. - Counts of pods on this node grouped by their latest observed lifecycle phase within the selected window, per the Kubernetes pod-lifecycle spec.
- A
Pendingspike on a single node typically means the scheduler can't place pods there (check CPU Alloc / Memory Allocatable headroom and node taints);Failed/Unknownspikes warrant drilling into those pods' events and logs from the node detail page.
Pod Counts by Status
- This column relies on the OTel metric(s):
k8s.pod.phase,k8s.pod.status_reason, andk8s.container.status.reasonfrom the k8s_cluster receiver. The latter two are disabled by default in the upstream receiver but enabled by default in the k8s-infra chart; all three must be flowing for this column to be populated. - Counts of the pods on this node grouped by their kubectl-style display status within the selected window. The status is derived exactly as on the Pods view. See Pod Status for the full priority cascade, the statuses it surfaces, and the statuses it cannot derive.
- A cluster of
OOMKilled/Evictedpods on a single node points to memory pressure on that node specifically, while concentratedCrashLoopBackOffmay indicate a node-local fault (disk, container runtime, networking) rather than an application bug; open the node detail page to inspect events and logs.
Node Detail Page
Click a node name to open the detail page. The header shows Node Name and Cluster Name. The detail page includes four tabs: Metrics, Logs, Traces, and Events.

Nodes Metrics - Charts and Panels
CPU Usage (cores)
- This chart relies on the OTel metrics
k8s.node.cpu.usage(kubeletstats receiver),k8s.node.allocatable_cpu(k8s_cluster receiver, disabled by default), andk8s.container.cpu_request(kubeletstats) summed across containers on the node. - Plots five series:
k8s.node.cpu.usageaggregated three ways within each step interval (Avg, Max, Min), the Allocatable capacity as a reference line, and the sum of container CPU Requests scheduled on the node. The Max-Min band shows intra-interval volatility. - When the Usage band approaches Allocatable, the node is CPU-saturated and pods may start throttling; when Requests far exceeds Usage, scheduling reservations are sitting idle and pod
requests.cpucan be tightened to pack the node better.
Memory Usage (bytes)
- This chart relies on the OTel metrics
k8s.node.memory.usage,k8s.node.memory.working_set,k8s.node.memory.rss(kubeletstats),k8s.node.allocatable_memory(k8s_cluster, disabled by default), andk8s.container.memory_request(kubeletstats) summed across containers on the node. - Plots seven series: usage Avg / Max / Min, Working Set, RSS, Allocatable, and total container Requests.
working_set(anonymous + active file pages, excluding reclaimable inactive file pages) is the value the kubelet uses for eviction decisions;usageincludes reclaimable page cache and so reads higher than working set. - Working Set approaching Allocatable signals imminent MemoryPressure-driven eviction; the gap between Usage and Working Set is the reclaimable page cache the kernel can free first, before the kubelet starts evicting pods.
CPU Usage (%)
- This chart relies on the OTel metrics
k8s.node.cpu.usage,k8s.node.allocatable_cpu, andk8s.container.cpu_request: combined via formulasusage / allocatableandusage / requests. - Two lines: usage as a percentage of node Allocatable, and usage as a percentage of the sum of container CPU requests scheduled on the node.
- Allocatable % approaching 100% means the node is running out of schedulable CPU; Requests % consistently above 100% means workloads are bursting above their reservations (allowed, but a signal requests are under-provisioned and pods may contend for CPU under load).
Memory Usage (%)
- This chart relies on the OTel metrics
k8s.node.memory.usage,k8s.node.allocatable_memory, andk8s.container.memory_request: combined via formulasusage / allocatableandusage / requests. - Two lines: memory usage as a percentage of node Allocatable, and as a percentage of the sum of container memory requests scheduled on the node. Note this uses
k8s.node.memory.usage(which includes reclaimable page cache), not working set, so it tracks slightly higher than the kubelet's own eviction signal. - When Allocatable % approaches 100%, drill into Memory Usage (bytes) to check whether Working Set is also at the threshold; sustained pressure triggers MemoryPressure and pod eviction in QoS order.
Pods by CPU (top 10)
- This chart relies on the OTel metric
k8s.pod.cpu.usagefrom the kubeletstats receiver, grouped byk8s.pod.nameand limited to 10 lines. - One line per pod on this node, showing its CPU consumption in CPU-core units.
- Use this to identify noisy-neighbor pods consuming a disproportionate share of node CPU: candidates for tighter
limits.cpu, isolation onto a dedicated node pool via taints/tolerations, or a QoS-class adjustment so they're chosen first under pressure.
Pods by Memory (top 10)
- This chart relies on the OTel metric
k8s.pod.memory.usagefrom the kubeletstats receiver, grouped byk8s.pod.nameand limited to 10 lines. - One line per pod on this node, showing its memory consumption in bytes.
- Within a QoS class, the kubelet evicts the pod whose memory usage most exceeds its
requests.memoryfirst: use this chart to spot those pods before MemoryPressure hits and either right-size their requests or move them off the node.
Network Error Count
- This chart relies on the OTel metric
k8s.node.network.errorsfrom the kubeletstats receiver, a cumulative Sum with attributesdirection(receive / transmit) andinterface(NIC name), shown as a per-second increase. - One line per
direction :: interfacecombination, sourced from the kubelet's per-interface error counters. - Sustained non-zero values warrant attention: common causes are misconfigured CNI plugins, faulty NICs, MTU mismatches, or a noisy neighbor saturating the host network; K8s does not auto-evict on network errors, so follow up via the CNI plugin's troubleshooting docs.
Network IO Rate
- This chart relies on the OTel metric
k8s.node.network.iofrom the kubeletstats receiver, a cumulative Sum in bytes with attributesdirectionandinterface, shown as a per-second rate. - One line per
direction :: interfacecombination, showing transmit and receive throughput per NIC. - Use this to identify which interface (and indirectly which workload) is driving network load on the node; K8s has no eviction signal for network bandwidth, so saturation is addressed via NetworkPolicy, moving heavy workloads to dedicated nodes, or scaling out.
Filesystem Usage (bytes)
- This chart relies on the OTel metrics
k8s.node.filesystem.usage,k8s.node.filesystem.capacity, andk8s.node.filesystem.availablefrom the kubeletstats receiver. - Three series: Capacity (total provisioned), Available (free), Usage (consumed), for the node's primary (
nodefs) filesystem as reported by the kubelet's stats-summary API. - When Available drops below 10% of Capacity, the kubelet sets DiskPressure, garbage-collects dead pods/containers, and starts evicting pods; if
imagefsis on a separate device the threshold is 15% of its capacity.
Filesystem Usage (%)
- This chart relies on the OTel metrics
k8s.node.filesystem.usageandk8s.node.filesystem.capacity: combined via the formulausage / capacity. - One line: percentage of the node's
nodefscurrently consumed. - When this approaches 90% (i.e., Available below 10% of Capacity), the kubelet triggers DiskPressure and pod eviction begins; bound disk consumption with per-pod
ephemeral-storagelimits, tune image GC, or expand the underlying volume.
Next steps
- Kubernetes Monitoring: back to the Kubernetes Monitoring overview.
- Setup Kubernetes Metrics: configure the receivers this page's metrics depend on, including the optional allocatable metrics.
- Pods and Clusters: drill into the workloads running on these nodes or roll up to the cluster level.