Edgelet troubleshooting
Common issues when running Edgelet on Edgelet nodes.
Daemon won't start
Symptoms: systemctl start edgelet fails; no listening socket on :54321.
Checks:
-
Validate config paths and permissions:
ls -la /etc/edgelet/edgelet system info -
Review journal logs:
sudo journalctl -u edgelet -n 100 --no-pagertail -f /var/log/edgelet/daemon-startup.log -
Confirm
containerEngineis valid on this platform:edgelet system version -o json | jq '{allowedEngines, containerEngine}'grep containerEngine /etc/edgelet/config.yamlLinux allows
edgelet,docker, orpodman. Darwin and windows allowdockerorpodmanonly. -
Check disk space:
df -h /var/lib/edgelet /var/lib/edgelet-containerdIf usage grows after deleting microservices, orphaned volume data may remain under
/var/lib/edgelet/volumes/data/until prune runs. See Volumes.
Cgroup delegation (embedded edgelet engine)
Symptoms: daemon fails at startup with controller cpu is not available; RunPodSandbox errors; nested Docker deploy fails immediately.
Checks:
-
Confirm cgroup mode and driver:
edgelet system status -o json | jq '{cgroupMode,cgroupDriver,cgroupNested,cgroupDelegatedControllers}' -
On cgroup v2 hosts, verify delegated controllers in the edgelet cgroup:
grep -E '^(cpu|memory|pids)' /sys/fs/cgroup/cgroup.controllerscat /sys/fs/cgroup/cgroup.subtree_control -
Hybrid v1+v2: edgelet logs a warning and prefers unified v2. Migrate the host to pure cgroup v2 when possible.
-
Nested edgelet container in Docker:
--privilegedis required:docker run -d --name edgelet --privileged \-v /var/lib/edgelet:/var/lib/edgelet \-v /etc/edgelet:/etc/edgelet \ghcr.io/datasance/edgelet:1.0.0Without
--privileged, cpu/memory/pids controllers are not delegated and CRI cannot create sandboxes. -
Non-systemd init (openrc, sysvinit, s6): edgelet uses the cgroupfs driver automatically. Ensure
/sys/fs/cgroupis writable and controllers are mounted. -
LXC/VM machine root (
/.lxc, OpenRC on OrbStack Alpine): error mentionsedgelet-cgroup-prepor empty/.lxc/cgroup.controllersafter cold boot:rc-status | grep edgelet-cgroup-prepcat /proc/self/cgroupcat /sys/fs/cgroup/.lxc/cgroup.controllersReinstall edgelet so
install.shregistersedgelet-cgroup-prepin sysinit, then reboot:sudo ./install.sh --version=1.0.0sudo reboot -
RunPodSandbox/sd-bus call: Invalid unit name or type: crun withSystemdCgroup=true(manual override or old build). Reinstall the current edgelet build. Generated config must haveSystemdCgroup = falsefor crun.edgelet system status -o json | jq '{cgroupDriver,cgroupContainerdPath}'grep -E '^\[cgroup\]|path =|SystemdCgroup' /var/lib/edgelet-containerd/config.toml
Control vs data plane restart
Symptoms: Microservices disappear after systemctl restart edgelet; unexpected downtime during agent OTA.
Checks:
-
Identify which unit you restarted:
systemctl status edgelet edgelet-containerd --no-pager -
docker/podman: control restart should not drain microservices (
shutdownPolicy=leave-runningdefault):grep shutdownPolicy /etc/edgelet/config.yamledgelet system status -o json | jq '."runtime.shutdownPolicy", ."runtime.agentPhase"'docker ps --filter label=iofog.org/microservice-uuid -
Embedded split: restart
edgeletonly for control OTA; restartedgelet-containerdonly when the fat/runtime bundle changed (expect microservice stop + reconcile). -
Cold engine change: changing
containerEnginealways recreates microservices. This is expected. -
Legacy unit on VM: if
systemctl cat edgelet-containerdshowsPartOf=edgelet.service, reinstall packaging and runsystemctl daemon-reload.
Containerd socket (edgelet engine)
Symptoms: connection refused to /run/edgelet/containerd.sock; microservices stuck in pull/create.
Checks:
-
Verify socket exists:
ls -la /run/edgelet/containerd.sock -
Check embedded containerd logs in daemon journal output.
-
Shim load errors such as
address: no such fileusually mean stale runtime task metadata. Restart the data plane first:systemctl restart edgelet-containerd.servicesleep 3systemctl restart edgelet.service -
Look for orphan overlay mounts blocking cleanup:
mount | grep edgelet
EdgeletAPI 401 / auth failures
Symptoms: CLI exits 3 (Unauthorized); curl returns 401.
Checks:
-
Token file present and readable:
sudo ls -la /etc/edgelet/edgelet-api -
CLI uses correct CA:
edgelet auth whoamiedgelet auth whoami -o json -
After provisioning, ensure you are not sending an unsigned bootstrap JWT.
-
Regenerate PKI only when directed. Mismatched CA breaks existing CLI sessions.
See EdgeletAPI v1.
CLI connectivity (exit 10)
Symptoms: Error[DAEMON_UNAVAILABLE]; exit code 10.
Checks:
-
Daemon running:
systemctl is-active edgeletedgelet system status -
Socket override - if using
--socket, path must match/run/edgelet/edgelet.sock. -
Firewall - EdgeletAPI listens on localhost/TLS; remote access is not the default operator path.
External Docker / Podman
Symptoms: Cannot connect to Docker daemon; containers not starting.
sudo systemctl status docker # or podman.socket
ls -la /var/run/docker.sock
grep containerEngineUrl /etc/edgelet/config.yaml
Ensure the configured containerEngineUrl matches the running engine socket. See Container engines.
Controller connectivity
Symptoms: connectionToController not ok in edgelet system status.
edgelet system status -o json | jq .connectionToController
curl -v "$(grep controllerUrl /etc/edgelet/config.yaml | awk '{print $2}')/health"
edgelet config cert <base64-controller-cert> # if TLS verification fails
Microservice exec
Symptoms: Error[EXEC_START_TIMEOUT]; attach fails with Error[NOT_FOUND]; Controller exec works but local ms exec fails (or vice versa).
Checks:
-
Confirm the microservice container is running:
edgelet ms inspect <uuid|namespace.name>edgelet ms ls -
Retry after a start timeout. POST waits up to 15 seconds for the shell:
edgelet ms exec <uuid> -- /bin/shSee Exec sessions for the multi-session model.
-
Concurrent sessions: local CLI exec is unlimited per microservice. Controller exec is capped at 5 per microservice on Controller v3.8.0. Multiple local sessions should not block each other.
-
Orphan containerd exec (embedded engine): if a prior exec crashed without cleanup, retry after the process manager orphan sweep or restart the microservice:
edgelet ms restart <uuid> -
Controller exec only: verify Edgelet node connectivity and that Controller v3.8.0 is deployed. Status should list active Controller session ids:
edgelet system status -o json | jq '.connectionToController' -
execEnabled: Edgelet no longer gates exec on this flag. Session poll drives Controller exec. Do not expect togglingexecEnabledto fix attach issues.
Collecting diagnostics
sudo journalctl -u edgelet --since "1 hour ago" > edgelet-journal.log
edgelet system status -o json > edgelet-status.json
edgelet system info -o json > edgelet-info.json
edgelet system version -o json > edgelet-version.json
Do not share /etc/edgelet/edgelet-api or private keys in support tickets.
See also
- Installation - first-time setup and logs
- Configuration - config paths and reload
- Exec sessions - WebSocket exec model