Skip to main content
Version: v3.8.0

Workload continuity

Principle​

Restarting edgelet (control plane) must not stop microservice containers unless you restart the runtime unit or perform a cold engine change.

Layersystemd unitOwns
Data planeedgelet-containerd.serviceembedded containerd, CRI socket, MS containers
Control planeedgelet.servicesupervisor, field agent, Edgelet API, reconcile

docker / podman: the host engine is the data plane. Edgelet does not stop microservices on control restart.

docker / podman (leave-running)​

Default shutdownPolicy=leave-running for external engines.

ActionMS containers
systemctl restart edgeletKeep running — same container ID
edgelet shutdown (control stop)No drain — reconcile reattaches on start

Config (/etc/edgelet/config.yaml):

shutdownPolicy: leave-running # default for docker/podman
shutdownGracePeriodSeconds: 90 # used for optional maintenance / data-plane stops
pruningFrequency: 24 # hours between image prune cycles
watchdogEnabled: true # orphan container cleanup

Verify after control restart:

docker ps --filter label=edgelet.iofog.org/microservice-uid
edgelet system status -o json | jq '."runtime.agentPhase", ."runtime.shutdownPolicy"'

Reattach uses labels + DB, not Docker RestartPolicy.

Embedded engine (runtime split)​

Production embedded installs use two units:

systemctl restart edgelet # control only — MS survive
systemctl restart edgelet-containerd # data plane — MS stop then reconcile

edgelet-containerd.service is not PartOf=edgelet.service. Stopping or restarting only edgelet leaves the data plane running.

Full embedded shutdown (backup, uninstall, wipe):

sudo systemctl stop edgelet-containerd.service edgelet.service

Wrong-order manual restart (embedded split)​

When both units need a restart, restart the data plane before the control plane:

# Wrong — bypasses After= ordering on manual restart:
systemctl restart edgelet && systemctl restart edgelet-containerd

# Correct:
systemctl restart edgelet-containerd.service
sleep 3
systemctl restart edgelet.service

Before runtime split (monolithic embedded)​

Until edgelet-containerd.service is active with runtime split, a monolithic systemctl restart edgelet still drains MS (shutdownPolicy=drain-all default). Expect brief MS outage.

Migration: enable edgelet-containerd, install the edgelet.service.d/edgelet.conf drop-in, restart data plane then control.

Status during control restart​

  • Brief MS UNKNOWN on the Controller dashboard is OK.
  • Local status exposes runtime.agentPhase=restarting during control stop/start.
  • Field-agent status POST annotates MS entries with controlRestart: true.

Cold engine change​

Changing containerEngine still requires quiesce, MS cleanup, pendingRestart, service restart, and recreate from DB. Workload continuity does not relax this path. See Deployment and Container engines.

OTA restart matrix​

Bundle changeRestart
Thin edgelet binary onlysystemctl restart edgelet
Fat / containerd runtime bundlesystemctl restart edgelet-containerd then edgelet

See Installation for hash-based OTA details.

See also​

Group 3See anything wrong with the document? Help us improve it!