Helm Upgrade Crash Example

A repository document, rendered for the site. View source markdown.

Generated at: 2026-07-30T12:38:02.000Z UTC · source: committed helm-expt evidence for this rendered repository document.

UNOFFICIAL/EXPERIMENTAL

A customer once described a major outage caused by a Helm chart upgrade. The important product claim here is not that ConfigHub makes every upgrade safe. The claim is narrower and more useful:

Helm upgrade becomes a staged, reviewable, rehearsable, gated change with
evidence at each stage, instead of one opaque production mutation.

The Failure Mode

The risky path is familiar:

helm upgrade ...

That single command can hide many different changes:

The problem is not that Helm is bad. The problem is that the upgrade is too easy to treat as one operation when it actually contains several lifecycle decisions.

How The Staged Model Helps

For a serious chart, the ConfigHub/installer path breaks the upgrade into checks a team can inspect.

StageWhat The Team Sees
Render old and newExact Kubernetes objects for the supported version and candidate version.
CompareObject and field diffs, not only values-file diffs.
Classify riskCRDs, hooks, webhooks, storage, RBAC, images, target facts, generated facts, and removed objects are named.
RehearseThe old and new paths can be tested in clean targets before production.
GateScans, policy, changesets, approvals, and target prerequisites can block the operation.
ApplyConfigHub records what was delivered as Units, variants, and revisions.
ObserveReceipts record what the cluster accepted and what actually converged.

This does not guarantee that production cannot fail. It makes more failure modes visible before production, and it leaves a receipt trail when something does fail.

Concrete Example: kube-prometheus-stack

The first serious upgrade seed is:

prometheus-community/kube-prometheus-stack
85.3.3 -> 86.1.0
base: default

This chart is useful because it includes CRDs, admission webhooks, generated credentials, dependencies, RBAC, and many rendered monitoring objects.

Current evidence in this repo:

EvidenceWhat It ProvesLink
Upgrade seed85.3.3 stays supported; 86.1.0 is a candidate until upgrade lanes pass.kube-prometheus-stack upgrade seed
CRD delta10 CRDs in both versions; 6 changed; changes are recorded at schema-path level.CRD delta receipt
Live CRD rehearsalA fresh API server accepted the old CRDs, accepted the upgraded CRDs, and accepted a monitoring object server-side dry-run after upgrade.CRD live receipt
Live workload rehearsalPlain Helm installed 85.3.3, upgraded to 86.1.0, and workloads converged again on the tested kind profile.workload live receipt
Blast-radius scoringSome value changes have measured object reach; failing cases are published rather than hidden.blast-radius accuracy

This is already useful. It still does not claim that every production upgrade path is safe.

Example Workflow

The exact space, target, chart, and values depend on the user. The shape is:

# 1. Verify the supported version and candidate version surfaces are current.
npm run refresh:survival:verify

# 2. Compare the committed old and new rendered object sets.
mkdir -p .tmp/upgrade-review
diff -u \
  recipes/prometheus-community/kube-prometheus-stack/85.3.3/revisions/default/r001/rendered/release-objects.yaml \
  recipes/prometheus-community/kube-prometheus-stack/86.1.0/revisions/default/r001/rendered/release-objects.yaml \
  > .tmp/upgrade-review/kps-85.3.3-to-86.1.0.diff || true

# 3. Inspect the committed CRD delta for the serious candidate.
sed -n '1,160p' \
  data/serious-chart-reviews/kps-crd-upgrade-delta-85.3.3-to-86.1.0.yaml

# 4. Check the live CRD upgrade rehearsal receipt.
npm run kps:crd-upgrade-live:verify

# 5. Check the live regular-Helm workload upgrade rehearsal receipt.
npm run kps:workload-upgrade-live:verify

# 6. Check the measured blast-radius cases.
npm run blast-radius:accuracy:verify

# 7. Check current parity and live evidence already committed for the corpus.
npm run kind-parity:verify
npm run live-parity:verify

For a fresh upgrade on a new chart or private values file, the same workflow would be run with new rendered inputs and new receipts. The ConfigHub operation then becomes a reviewed change, not a blind upgrade:

New to cub? Install the cub CLI first. You can pull and render public catalog packages without an account. Commands that save or change ConfigHub data require you to sign in.

# Pseudo-command shape. Use the current cub commands for your space and target.
cub unit diff --space <candidate-space>
cub changeset create --space <candidate-space> <upgrade-review>
cub function vet --space <candidate-space>
cub unit approve --space <candidate-space> --changeset <upgrade-review>
cub unit apply --space <candidate-space> --changeset <upgrade-review> --wait

The point is that the reviewer can see the exact object change, the scan result, the target prerequisites, and the observation receipts before production is declared healthy.

What This Would Have Caught

This model is especially useful for upgrade failures caused by hidden scope:

Consul is a useful companion example. The secure-mesh path needs target facts for TLS and secrets, and the proof target needs the right Kubernetes topology. That is not a ConfigHub worker requirement. It is the install contract becoming visible before the install is treated as supported.

What Not To Claim

Do not claim that this repo has solved all Helm upgrades.

Do not claim that the kube-prometheus-stack candidate is a supported replacement for every target. The current evidence is scoped to the recorded version pair, base, values, and kind profile.

Do not claim that render parity alone proves upgrade safety. Render parity is the baseline. Upgrade safety needs lifecycle review, target prerequisites, scan/gate receipts, live before/after observations, and a scoped support decision.

Do not claim that ConfigHub-managed upgrade orchestration and rollback are complete for this example yet. The repo has a render-level CRD delta, a live API-server CRD upgrade rehearsal, and a live regular-Helm workload upgrade rehearsal. ConfigHub-managed upgrade receipt, rollback receipt, soak receipt, private-overlay upgrade receipt, and production-target upgrade receipt remain future work.

Where This Fits

This is the day-2 version of the seven-stage model:

Lifecycle StageUpgrade Use
1. Source and inputsLock old chart, new chart, values, dependencies, and target facts.
2. RenderProduce old and new object sets with the same declared profiles.
3. CompareReview object, field, CRD, hook, image, storage, and RBAC changes.
4. Package and uploadTurn the candidate into reviewable ConfigHub Units and receipts.
5. Variant and operationReview changesets, approvals, scans, and target-specific gates.
6. DeliverApply or reconcile through the declared target path.
7. ObserveRecord live readiness, controller status, drift, rollback, and freshness.

Use Serious Chart Proof for the kube-prometheus-stack proof path and Upgrade Story Plan for the upgrade lane definition.