Skip to content

Control-plane pods: offline-restart-safe update model (design) — jobs-manager/pods-monitor/resource-monitor (from #552) #569

Description

@shujaatTracebloc

Split out of #552. The requests-proxy hardcoded-Always bug is fixed in its own PR; this ticket tracks the harder, fleet-affecting part: making the always-running control-plane pods survive an offline Docker/WSL restart without breaking how they update. It needs a deliberate design decision, not a one-line pull-policy flip.

The constraint

  • jobs-manager + pods-monitor are updated by the image-refresh CronJob, which polls the registry and does kubectl rollout restart — this relies on imagePullPolicy: Always to pull the new digest. Flipping them to IfNotPresent silently breaks auto-updates.
  • resource-monitor is not touched by image-refresh; its Always is pure offline-fragility (updates only via a chart release / ref change).
  • Offline-safe (IfNotPresent/digest+cache) and auto-update-via-rollout-restart (Always) are mutually exclusive unless the reference itself changes on update (i.e. a digest).

Options

A — prodDigest pin (mirror resolve-ingestor-digest.sh). Add prodDigest/prodPin for jobsManager/podsMonitor/resourceMonitor (and align requestsProxy), render repo@digest + IfNotPresent where the pin applies, and retire image-refresh's poll-restart for the pinned images (updates come via a release-time digest re-resolve + Chart bump that auto-upgrade propagates). Restart-safe + reproducible in prod; dev/staging stay floating+Always (still offline-fragile). Needs registry digest resolution + a release step. This is what #552 originally proposed.

B — digest-on-update. Switch the images to IfNotPresent and change image-refresh to pin the new digest via kubectl set image repo@digest (instead of rollout restart). Offline-safe and auto-updating in dev+prod, self-contained in the chart. Must handle the helm upgrade --reset-then-reuse-values interaction: a chart release re-renders :tag and reverts the set-image, so image-refresh re-pins on its next tick (a brief, self-healing window). Out-of-band set image is also invisible to Helm (drift).

Recommendation

Decide A vs B before implementing. A matches the existing ingestor.prodDigest pattern and is lower-risk but prod-only; B fixes dev too (which is where the incident client runs) but reworks the refresh contract. Also decide whether requests-proxy (which runs the jobs-manager image) should track the same pin as jobsManager.

Refs: #552, #565 (installer-side), the requests-proxy fix PR.
Severity: Tier 1 — breaks-on-restart. Confidence: CONFIRMED.

Metadata

Metadata

Labels

devopsDevOps / CI-CD / build & deployneeds-refinementNeeds PO/lead refinement before moving to Readywork-type:bugDefect or regression

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions