zededa:patch-envelopes
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| zededa:patch-envelopes [2026/07/21 19:09] – old revision restored (2026/07/21 19:04) mc | zededa:patch-envelopes [2026/07/23 23:24] (current) – mc | ||
|---|---|---|---|
| Line 14: | Line 14: | ||
| attach a patch envelope to the app instance and update //just// that data. Typical scenarios: | attach a patch envelope to the app instance and update //just// that data. Typical scenarios: | ||
| - | * Pushing | + | * Making |
| * Rotating credentials, | * Rotating credentials, | ||
| * Delivering site-specific or device-specific parameters to a generic image | * Delivering site-specific or device-specific parameters to a generic image | ||
| Line 21: | Line 21: | ||
| You manage it from the controller (the '' | You manage it from the controller (the '' | ||
| it to the app locally. | it to the app locally. | ||
| + | |||
| + | ===== What can the binary artifact be? ===== | ||
| + | |||
| + | You attach one or more **binary artifacts** to a patch envelope and present them to the app | ||
| + | instance; the app then pulls them from the metadata service. So what can that artifact | ||
| + | actually be? | ||
| + | |||
| + | **Anything — it is an opaque blob to EVE.** EVE does not parse, validate, or execute the | ||
| + | artifact; it only delivers the bytes into the app's reach. So a binary artifact can be: | ||
| + | |||
| + | * an '' | ||
| + | * a config file / YAML / JSON / '' | ||
| + | * certs, keys, a license file, a token | ||
| + | * a firmware image, a tarball / zip, a small dataset, a DB seed | ||
| + | * a file with **any** extension ('' | ||
| + | * essentially any file you would otherwise have to bake into the image | ||
| + | |||
| + | **EVE never runs it.** For an '' | ||
| + | Windows VM) is what pulls it and executes it. EVE is agnostic about what the blob is or which | ||
| + | OS consumes it. | ||
| + | |||
| + | ==== Can I store the binary in my datastore and just consume it via the patch envelope? ==== | ||
| + | |||
| + | **Yes — that is the //external artifact// model** (see [[#inline vs. external artifacts]] | ||
| + | below), and it is the right choice for anything larger than the inline limit (e.g. an '' | ||
| + | |||
| + | * Put the binary in a **datastore**, | ||
| + | * The app **still pulls it** via the metadata service ('' | ||
| + | * External artifacts **inherit the datastore' | ||
| + | |||
| + | > The exact datastore types supported for patch-envelope external artifacts (HTTP/ | ||
| + | > Azure blob, container registry, …) may be narrower than the full image-datastore list — | ||
| + | > verify against the '' | ||
| ===== Does the app need to constantly poll http:// | ===== Does the app need to constantly poll http:// | ||
| - | **No — you do //not// need constant/ | + | The patch envelope metadata service is **pull-only**. There is **no push, no |
| + | notification, | ||
| + | new config exists, it **has to poll** '' | ||
| - | The metadata service at '' | + | Two different things are worth separating: |
| - | you have to hammer. The normal pattern is: | + | |
| - | * The app queries it **when it needs the data** — typically | + | * **" |
| - | * It is //not// required | + | * **" |
| + | |||
| + | So the accurate statement is: **yes, the app must poll** — you just choose the interval | ||
| + | (every 30 s, every 5 min, whatever | ||
| + | hashes** to avoid re-applying unchanged blobs. It is still polling; | ||
| + | |||
| + | The only way to avoid polling entirely is to **not have the app auto-discover updates** — | ||
| + | i.e. only fetch on startup, and force a re-fetch | ||
| + | the instance, or bump the app so its entrypoint runs again). That is not the app " | ||
| + | a new config — that is you pushing a lifecycle event. | ||
| + | |||
| + | ==== Bottom line for your design ==== | ||
| + | |||
| + | * Want the running app to pick up config changes on its own → **it must poll** ('' | ||
| + | * Don't want polling → fetch once at boot only, and treat any config change as " | ||
| + | |||
| + | There is **no server-push option** in the current | ||
| ==== Metadata endpoints ==== | ==== Metadata endpoints ==== | ||
| Line 42: | Line 92: | ||
| > instance (the same '' | > instance (the same '' | ||
| > An app on a pure switch NI with no local-NI path will not see it. | > An app on a pure switch NI with no local-NI path will not see it. | ||
| + | |||
| + | ==== ⚠ Gotcha — reachability of 169.254.169.254 ==== | ||
| + | |||
| + | The metadata service **lives inside EVE** on the edge node — it is **not** exposed outside the | ||
| + | node. This has direct consequences for how the workload is networked: | ||
| + | |||
| + | * **Local-type NI can reach it; Switch-type cannot.** A **Local** network instance routes to '' | ||
| + | * **Multi-NIC default-route trap.** If a workload is attached to **two** network instances (e.g. one Local + one Switch, or two with default routes) and **both provide a default gateway**, the guest may pick the **Switch** interface as its default route — and then traffic to '' | ||
| + | * **Fix — configure it on the Local network instance, NOT inside the guest.** EVE hands routes to the app through the **Local NI configuration** (advertised to the attached app via the NI's DHCP), not via manual '' | ||
| + | prefix | ||
| + | gateway = "< | ||
| + | }</ | ||
| **How to detect changes without busy-polling: | **How to detect changes without busy-polling: | ||
| Line 52: | Line 114: | ||
| - **Inline artifacts (≤ 10 KB)** — carried inside the EdgeDevConfig itself and served directly by the metadata server. Good for small configs. | - **Inline artifacts (≤ 10 KB)** — carried inside the EdgeDevConfig itself and served directly by the metadata server. Good for small configs. | ||
| - | - **External artifacts** — represented as **volumes**, | + | - **External artifacts** — represented as **volumes**, |
| ===== Practical takeaway ===== | ===== Practical takeaway ===== | ||
zededa/patch-envelopes.1784660948.txt.gz · Last modified: by mc
