Repository navigation
fix(connectivity): the Hugging Face cache claim is applied by a post-install,post-upgrade hook Job outside Helm's wait — WaitForFirstConsumer no longer fails the release (giantswarm/agent-platform#483) - #489
Merged
Conversation
…install,post-upgrade hook Job, outside Helm's wait — it Binds with its first predictor, so WaitForFirstConsumer no longer fails the release (#483) Signed-off-by: Timo Derstappen <teemow@gmail.com>
Published Helm chart
|
| Chart | agent-platform-connectivity |
| Version | 4.28.1-dev.hf-cache-pvc-wait-483.2026-09-16.09-52-16.h97fe4a5 |
| OCI reference | oci://gsoci.azurecr.io/charts/giantswarm/agent-platform-connectivity:4.28.1-dev.hf-cache-pvc-wait-483.2026-09-16.09-52-16.h97fe4a5 |
| Digest | sha256:431107b79f67fd2602aecac2b22e6e5ac256582b6ce760cee640413442e95b9d |
| Registry | public — gsoci.azurecr.io |
| Git catalog | giantswarm-test-catalog (index) |
Pull this chart
helm pull oci://gsoci.azurecr.io/charts/giantswarm/agent-platform-connectivity --version 4.28.1-dev.hf-cache-pvc-wait-483.2026-09-16.09-52-16.h97fe4a5Posted by architect-orb · build 8625 · commit 97fe4a5 · updated in place on every push
Published Helm chart
|
| Chart | agent-platform |
| Version | 4.28.1-dev.hf-cache-pvc-wait-483.2026-09-16.09-52-16.h97fe4a5 |
| OCI reference | oci://gsoci.azurecr.io/charts/giantswarm/agent-platform:4.28.1-dev.hf-cache-pvc-wait-483.2026-09-16.09-52-16.h97fe4a5 |
| Digest | sha256:48c4583c382419168722d3f4fdc7ba2d70d6511a1c94b1ec93afa1f5337b6ebb |
| Registry | public — gsoci.azurecr.io |
| Git catalog | giantswarm-test-catalog (index) |
Pull this chart
helm pull oci://gsoci.azurecr.io/charts/giantswarm/agent-platform --version 4.28.1-dev.hf-cache-pvc-wait-483.2026-09-16.09-52-16.h97fe4a5Posted by architect-orb · build 8626 · commit 97fe4a5 · updated in place on every push
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #483. Follows #326 (the serving slice, whose lab proof surfaced this); epic giantswarm/giantswarm#37639.
Problem
With
components.modelServingon, the connectivity chart rendered the Hugging Face cache claimmodelServing.cache.pvc(hf-cache,helm.sh/resource-policy: keep) in the serving namespace as a release resource with no consumer of its own. The first predictor (or download Job) that mounts it is what Binds it, so under a StorageClass withvolumeBindingMode: WaitForFirstConsumer— kind'sstandard, the defaultgp3of Giant Swarm's AWS clusters — the claim stayedPending, helm-controller's wait counted it as not ready, and the release failed on every install and upgrade with the switch on:five attempts, then stalled — with
kserve-resourcesbefore it and substrate, kagent, agent-manager and model-manager behind it (the #481 lab proof ran withmodelServing.cache.enabled: falsefor that reason).Solution
The claim is applied by a
post-install,post-upgradehook Job, never rendered as a release resource (templates/model-serving/cache-pvc.yaml; the chart's hook includeagent-platform.hooks.joband its identity<release>-hooks, the way the Postgres connection Secrets are derived). Hook objects are outside Helm's wait: the Job server-side-applies the claim (kubectl apply --server-side --force-conflicts --field-manager=agent-platform-connectivity, one JSON line), logscreatedorpresentand the phase, and exits — nothing waits for the claim to Bind. It binds where its first consumer schedules, which is what a zonal volume (gp3) needs: the GPU pool's zone, not the zone of whatever pod would have claimed it first.hf-cachein the serving namespace, thekeepannotation (now documentary — the claim is not Helm's, so an uninstall or acache.enabledflip leaves it by construction),accessModes,size,storageClassNameincl."-"(the empty class),volumeName;existingClaimrenders nothing and publishes the name as before.get,create,patchonpersistentvolumeclaimsonly while the claim is the chart's — neverdelete;agent-platform.hooks.enabledcounts the cache hook, so the slice (no Substrate, no Postgres) renders the identity for it.sizechange is applied by the next upgrade's hook (the class has to allow expansion); an immutable field (storageClassName,accessModes,volumeName) fails the hook — and the release — naming the field, as before.Immediate-binding class (the same zone lottery, and not the fleet's default); a release-widedisableWait(blind to the platform's dependency chain).values.yaml(both charts), the connectivity README ("The Hugging Face cache claim"), the root README's serving-slice section,examples/serving-slice.yaml, CHANGELOG; helm-docs regenerated. Installations without the switch render byte-identically.Verification
agentlab proof
Second lab (
agentlab-483, kind, StorageClassstandard—rancher.io/local-path,WaitForFirstConsumer, no expansion), cert-manager v1.19.1 installed as the KServe controllers' prerequisite; the lab's platform release on 4.28.0 first (12 HelmReleases Ready; the lab's--model-manager=falsedoes not switch the default-on component off on 4.28.0, socomponents.model-manager.enabled: falsein the overlay), thenplatform.chartBranchon this branch's dev build4.28.1-dev.hf-cache-pvc-wait-483.2026-09-16.09-52-16.h97fe4a5with the serving half ofexamples/serving-slice.yamlandmodelServing.cache.enabled: true— the shape #326's proof had to run with the cache off.0.2.4) andagent-platform-connectivityv3 on the dev build:Ready=True UpgradeSucceeded— 17/17 HelmReleases Ready, no crash-looping pod. The hook Jobagent-platform-connectivity-model-serving-cacheran once the release's own wait had passed (SuccessfulCreate→Completedwithin 3 s, its objects removed byhook-succeeded). The claim it applied:hf-cacheat/mnt/models) scheduled, the provisioner ran (ExternalProvisioning → Provisioning → ProvisioningSucceeded), the pod wrote/mnt/models/proof/okand exited, and the claim readsBound pvc-a86dc22a… 500Gi RWO standard.Ready=True UpgradeSucceeded(v4), the claim untouched (Bound, same volume), 17/17 Ready. A reconcile without a values change makes no Helm revision and runs no hook.agentlab platform-test: 7 PASS with the slice on (Claude Code → muster → mcp-kubernetes → apiserver; forwarded id_token RBAC; kagent route JWT Strict; agent-manager as the caller; atelet image cache; per-server OAuth; fake fleet off).agentlab downafterwards.Not exercised in kind: a real predictor on a GPU node binding the claim in the pool's zone (the
gp3half of the acceptance criteria is the same mechanism — the class binds on the first consumer, the release never waits for it).