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] – [What is it used for?] mc | zededa:patch-envelopes [2026/07/23 23:24] (current) – mc | ||
|---|---|---|---|
| Line 7: | Line 7: | ||
| the app**. It is a container of one or more **binary artifacts (blobs)**: base64-encoded | the app**. It is a container of one or more **binary artifacts (blobs)**: base64-encoded | ||
| objects that can be anything — a config file, a YAML, certs, a license key, a small binary, etc. | objects that can be anything — a config file, a YAML, certs, a license key, a small binary, etc. | ||
| + | |||
| + | ===== What is it used for? ===== | ||
| + | |||
| + | The core use case is **decoupling mutable data/config from the immutable app image**. Instead | ||
| + | of baking config into the image (and re-rolling the image every time something changes), you | ||
| + | attach a patch envelope to the app instance and update //just// that data. Typical scenarios: | ||
| + | |||
| + | * Making updated configuration available to a running app without downtime (the app pulls it from the metadata service — nothing is pushed to the guest) | ||
| + | * Rotating credentials, | ||
| + | * Delivering site-specific or device-specific parameters to a generic image | ||
| + | * Any case where " | ||
| + | |||
| + | You manage it from the controller (the '' | ||
| + | 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:// | ||
| Line 34: | Line 81: | ||
| There is **no server-push option** in the current patch-envelope design. | There is **no server-push option** in the current patch-envelope design. | ||
| - | ===== Does the app need to constantly poll http:// | ||
| - | |||
| - | **No — you do //not// need constant/ | ||
| - | |||
| - | The metadata service at '' | ||
| - | you have to hammer. The normal pattern is: | ||
| - | |||
| - | * The app queries it **when it needs the data** — typically **once at startup** (in your entrypoint/ | ||
| - | * It is //not// required to be a tight '' | ||
| ==== Metadata endpoints ==== | ==== Metadata endpoints ==== | ||
| Line 54: | 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 64: | 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.1784660970.txt.gz · Last modified: by mc
