Posted on October 5, 2026 by Onkar Raghunath Shelke. CNCF/LFX mentor across four KubeStellar mentorship projects (2025 Terms 2 and 3). GSoC 2026 contributor with Red Hat, on JBoss Web Server tooling. A worker node pages with NodeFilesystemFilesFillingUp. It’s on course to run out of inodes. You check the disk first, because that’s what everyone checks first, and it reads 83% used: 103G used, 22G available. Then you check inodes: 67% used, 11M used, 5. The disk is the fuller of the two, and the inode table is the one that paged. That’s not a contradiction.
NodeFilesystemFilesFillingUp is a trajectory alert built on predict_linear, so it fires on the slope, not on the level. Nothing was wrong with 67%. What was wrong was how fast it was getting there, and the fact that the only mechanism in kubelet that would have intervened is the one that evicts pods. Two notes on what follows. I no longer have access to that cluster, so I can’t paste the original df, du or tune2fs captures. Where a number comes from the incident record I say so, and where I’ve reconstructed something from arithmetic I show the arithmetic.
The ext4 demonstrations further down you can run yourself in about two seconds. Kubelet’s defence against images filling a node is image garbage collection. Once the image filesystem passes imageGCHighThresholdPercent (85 by default), it deletes unused images, oldest first, until usage drops to imageGCLowThresholdPercent (80). Both of those are percentages of bytes. Image GC never looks at file counts. Kubelet isn’t blind to inodes, though, and it’s worth being exact here, because the detail changes the conclusion. On Linux the default hard eviction set is five signals (pkg/kubelet/eviction/defaults_linux.
go, quoted here at tag v1. 0): var DefaultEvictionHard = map[ string ] string { "memory. available" : "100Mi" , "nodefs. available" : "10%" , "nodefs. inodesFree" : "5%" , "imagefs. available" : "15%" , "imagefs. inodesFree" : "5%" , } Both filesystems get an inode threshold, and both sit at 5% free. That’s a Linux-only file. The two next to it are shorter: defaults_windows. go each carry three signals, memory. available, with no inode thresholds at all. On Linux the coverage is there. Check it against whatever version you’re running, because these fil
