[Feature]: MONAI Label deployment in the Kubernetes trust chart - #950
Merged
atriaybagur merged 1 commit intoAug 12, 2026
Merged
Conversation
Mirrors the compose overlay: Deployment + Service + weights PVC, gated on monailabel.enabled (default false — the default render is proven unchanged, comment-only delta). The chart's XNAT already ships the ohif-viewer plugin in its roster, so unlike compose there is no plugin step and no FLIP#662 exclusion to weigh here. Chart-specific decisions: - The XNAT archive is read straight off xnat-web's data PVC (read-only `archive` subPath). That PVC is ReadWriteOnce by default, so the pod is pinned to xnat-web's node via required podAffinity (monailabel.coScheduleWithXnat, default true); RWX storage classes can disable it. - monailabel.publicUrl is `required` when enabled rather than defaulted: XNAT hands it to the OHIF viewer, which calls it from the clinician's browser — the chart cannot derive an outside-the-cluster URL, and a wrong default fails only at click time. The helm-template CI job asserts the guard fires. - Exposed as NodePort (default 30030) plus a scoped NetworkPolicy opening exactly that port on exactly this pod through the namespace's default-deny ingress (service.allowExternalIngress). - Startup probe allows 30 minutes: first start on a cold volume downloads pretrained weights including the ~900MB SAM checkpoint. - Render coverage lives in the helm-template job, NOT ci/test-values.yaml: the kind install deploys those values and waits for pod readiness, which a ~10.4GB GPU image can never satisfy there. Signed-off-by: at24_bioeng625-pc <alexandre.triay_bagur@kcl.ac.uk>
|
✅ Acceptance criteria have been automatically imported from the linked issue(s) and added to the PR description. |
atriaybagur
marked this pull request as ready for review
August 12, 2026 14:32
atriaybagur
merged commit Aug 12, 2026
54c1caf
into
947-publish-monailabel-image-prod-compose
6 of 7 checks passed
12 tasks
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.
Description
Adds the optional MONAI Label server to the Kubernetes trust chart, mirroring the compose deployment. Stacked on #949 (merge order: #945 → #949 → this; GitHub retargets on each merge).
templates/monailabel.yaml— Deployment + Service + weights PVC + scoped NetworkPolicy, all gated onmonailabel.enabled(defaultfalse; the default render is byte-identical bar a comment-only document).archivesubPath). With the defaultReadWriteOncestorage the pod is pinned to xnat-web's node via required podAffinity (coScheduleWithXnat: true); RWX storage classes can turn that off.monailabel.publicUrlisrequiredwhen enabled: XNAT hands it to the OHIF viewer, which calls it from the clinician's browser — never proxied — so the chart cannot derive it and a wrong default fails only at click time. CI asserts the guard fires.30030) + a NetworkPolicy opening exactly that port on exactly this pod through the namespace's default-deny ingress. The API is unauthenticated (matches the compose posture, where the port is host-published) — documented, restrict at the network layer.helm-templatejob (enabled render asserts resources exist; a render withoutpublicUrlmust fail). Deliberately not inci/test-values.yaml— the kind job installs those values and waits for pod readiness, which a ~10.4 GB GPU image can never satisfy in kind.ohif-viewerplugin in its roster, so there is no plugin step and no trust XNAT: bulk image-pull wedges permanently — Reactor EventBus ring-buffer livelock (OHIF listener) + restart strands directArchive #662 exclusion decision here.Linked Issues
Fixes #948
Checklist
Type of Change
Testing
helm lintclean; workflow YAML parses.ifguard, same asnetwork-policy.yaml).Deployment/Service/PersistentVolumeClaim/NetworkPolicyfor the component; render withoutpublicUrlfails with the intended message.Additional Notes
Live K8s verification (register →
deepedit_seg/sam_2dmasks in the viewer) is the remaining acceptance criterion on #948 and should follow once #949's image is published.Acceptance Criteria
Imported from issue #948
helm lintandhelm templatepass withmonailabel.enabled=true(CI values) and default values.monailabel.enabled=false(default) the rendered chart is unchanged.deepedit_segandsam_2dproduce masks in the OHIF viewer against archive data.Follow-up to #55 / PR #945. Depends on the published image from the image-publishing issue.