Resource Tuning for Edge & Tiny Nodes
Reserve resources for the kubelet, set eviction thresholds, and trim the agent so a busy Pod can't take the node down.
On a 1–2 GB edge box, the danger is not your app crashing — it is the node going NotReady because the kubelet got starved of CPU or memory. Senior edge operators defend the system agents first.
Reserve headroom
- Use
--kubelet-argto set system-reserved and kube-reserved so scheduling never consumes the memory the OS and kubelet need. - Tune eviction hard thresholds so the kubelet reclaims memory gracefully instead of the kernel OOM-killer firing at random.
Right-size every Pod
Always set requests and limits. On tiny nodes a single unbounded Pod with a leak triggers the OOM killer and can cascade. Requests also stop the scheduler from overcommitting a node that has no room.
Trim the agent
Drop components you do not use: --disable=metrics-server if you have no autoscaling, disable the local-storage provisioner if you use hostPath, and keep the image set minimal. Every megabyte counts on flash storage.
Example
# /etc/rancher/k3s/config.yaml on a small edge node
disable:
- metrics-server
kubelet-arg:
- "system-reserved=cpu=100m,memory=128Mi"
- "kube-reserved=cpu=100m,memory=128Mi"
- "eviction-hard=memory.available<100Mi,nodefs.available<10%"
- "image-gc-high-threshold=80"
- "image-gc-low-threshold=60"
# Restart to apply: sudo systemctl restart k3sWhen to use it
- An operator sets kubelet reserved CPU and memory on a 512 MB Raspberry Pi so the k3s agent itself is never evicted by a misbehaving application pod.
- An edge SRE lowers the eviction thresholds so pods are evicted early when disk fills, preventing the node from entering a NotReady state.
- A team disables the k3s built-in metrics-server on a memory-constrained device and scrapes metrics externally to recover 30 MB of RAM.
More examples
Reserve kubelet system resources
Reserves CPU and memory for the OS and k3s agent, and sets eviction thresholds to protect the node from pod memory pressure.
# /etc/rancher/k3s/config.yaml
kubelet-arg:
- 'system-reserved=cpu=100m,memory=100Mi'
- 'kube-reserved=cpu=100m,memory=100Mi'
- 'eviction-hard=memory.available<100Mi,nodefs.available<5%'Disable unused k3s components
Removes all optional bundled components on install to recover memory for application workloads on resource-constrained edge hardware.
curl -sfL https://get.k3s.io | \
INSTALL_K3S_EXEC='
--disable traefik
--disable servicelb
--disable metrics-server
--disable local-storage
' sh -
free -mhSet tight pod resource limits
Assigns minimal CPU and memory to a sensor pod so it fits within the budget left after kubelet system reservations.
containers:
- name: sensor
image: factory/sensor:v2
resources:
requests:
cpu: '30m'
memory: '24Mi'
limits:
cpu: '100m'
memory: '48Mi'
Discussion