Skip to main content
Version: v3.8.0

ControlPlane runtime module

Edgelet hosts at most one local Controller container per Edgelet node when you apply a kind: ControlPlane manifest. The runtime module converts the manifest into a microservice model, persists it in SQLite, and reconciles the container on every process manager tick.

For operator workflows (deploy, restart, delete), see Control plane on node.

Manifest to microservice

When you apply a ControlPlane manifest, Edgelet builds a Microservice with these defaults:

AspectDefault / rule
UUIDGenerated controller UUID (stable in SQLite)
IsControllertrue, IsSystem
Host API port51121spec.controller.port (default 51121)
Host console port80spec.console.port (default 8008)
Volumesiofog-controller-db, iofog-controller-log
TLSOptional bind mount to /etc/iofog/controller-cert/
RegistryLocal default registry id

Environment variables for the controller container are built from the manifest and the stable controller UUID.

Persistence and reconcile

LayerResponsibility
SQLite system_control_planeSingleton deployment row + manifest YAML (id=1)
EdgeletAPI / runtime facadeAsync apply, validation, operation polling
Process managerreconcileControlPlane() each monitor tick
DNS resolverUpsert/remove bridge-local FQDN records for the CP workload

At most one ControlPlane deployment per node. Reconcile recreates the container if the SQLite row exists but the engine container was removed manually.

EdgeletAPI surface

EndpointRole
POST /v1/deploy/controlplane:applyStart async apply
GET /v1/deploy/controlplane:apply/{operationId}Poll apply status
GET /v1/system/controlplaneDeployment status
POST /v1/system/controlplane/restartBounce container; optional ?pull=true
DELETE /v1/system/controlplaneRemove deployment and volumes

Registry apply remains synchronous. ControlPlane apply is asynchronous by default (long container pull/start).

DNS FQDNs

When the embedded engine is active, the controller microservice gets bridge-local names consumed by the DNS resolver:

  1. edgelet.controller.svc.bridge.local - stable alias
  2. controller.<metadata.namespace>.svc.bridge.local - namespace alias
  3. <metadata.namespace>.<metadata.name>.svc.bridge.local - standard appName.microserviceName pattern

Edgelet does not auto-update controllerUrl in config when you deploy. Set it separately. See Configuration.

Controller registration

After the local ControlPlane container is running and the Edgelet node is provisioned, Edgelet registers the controller workload once with the remote Controller (POST /api/v3/agent/controller/register). The Controller lists the controller microservice with isController: true.

The system fog must exist on Controller with isSystem: true. Registration fails with 403 on non-system fogs.

Spec updates from Controller microserviceList merge into the local ControlPlane deployment. The process manager does not add or delete a duplicate controller container.

Failure modes

SymptomCause / fix
Reconcile recreates containerRow exists; external docker rm or engine drift
ms rm rejected on CP UUIDUse edgelet controlplane delete
ms restart rejected when provisionedUse edgelet controlplane restart
Need image/env changeRedeploy: edgelet deploy -f controlplane.yaml (not restart)
Second apply 409Apply already in progress; wait or poll operation status

Watchdog

Edgelet does not delete the controller container when labels match the DB row (edgelet.iofog.org/system=true, role=controller, UUID, container ID, image ref). Manual docker run without matching identity may be removed by the watchdog.

See also

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