Table of Contents

How ZEDEDA Cloud directs EVE-K (edge node cluster)

This section documents how objects created in ZEDEDA Cloud are translated into configuration on an EVE-K edge node cluster (3-node k3s). All flows have been traced live on device e418565d-9d93-47ee-b7ea-aba4c9c7e912.

Key principle

Kubernetes is never in the config path. ZEDEDA Cloud sends a protobuf DeviceConfig message to the device over HTTPS. The EVE pillar agents (all running inside a single binary /opt/zededa/bin/zedbox) receive this config and translate it into host-level state via a pubsub filesystem. k3s is only touched at the very end when a workload is ready to launch.

Overview diagram

When does the device receive config?

Not all objects behave the same way:

Object Pushed to device when Confirmed
Network Instance Assigned to device – immediate Yes (live)
App Instance Assigned to device directly Yes (live)
Datastore App referencing it is assigned Yes (live)
Image (ContentTree) App referencing it is assigned Yes (live)
Volume App referencing it is assigned Yes (live)

The four ZEDEDA objects

Click each sub-page for the full confirmed deep dive.

Pubsub filesystem quick reference

All live config and status is readable as plain JSON on the EVE host:

# Watch all pubsub dirs in real time
watch -n1 'echo "=NI="; ls /run/zedagent/NetworkInstanceConfig/;
echo "=NIStatus="; ls /run/zedrouter/NetworkInstanceStatus/;
echo "=DS="; ls /run/zedagent/DatastoreConfig/;
echo "=CT="; ls /run/zedagent/ContentTreeConfig/;
echo "=VOL="; ls /run/zedagent/VolumeConfig/;
echo "=APP="; ls /run/zedagent/AppInstanceConfig/;
echo "=DL="; ls /run/downloader/DownloaderStatus/;
echo "=VS="; ls /run/volumemgr/VolumeStatus/;
echo "=ANS="; ls /run/zedrouter/AppNetworkStatus/;
echo "=DC="; ls /run/domainmgr/ 2>/dev/null | grep -v sock'
 
# Watch k3s side
watch -n2 'kubectl get vms,vmis,pvc,network-attachment-definitions -n eve-kube-app 2>/dev/null'
 
# Watch EVE device log (clean output)
tail -f /persist/newlog/collect/current.device.log | \
  python3 -c "
import sys, json
for line in sys.stdin:
    try:
        o = json.loads(line.strip())
        i = json.loads(o.get('content','{}'))
        print(f'[{i.get(\"time\",\"\")[:19]}] [{i.get(\"source\",\"?\")}] {i.get(\"level\",\"\").upper()}: {i.get(\"msg\",\"\")}')
    except: pass
" | grep -iE 'domain|volume|kube|NAD|download|verify|zedmanager|zedkube|network|activate'

See also