feat(operator): add DisaggregatedSet pathway - #11645
Conversation
Signed-off-by: Peter Pan <Peter.Pan@daocloud.io>
This comment has been minimized.
This comment has been minimized.
Move the leader/worker pod template rendering out of generateLeaderWorkerSet so the DisaggregatedSet pathway can reuse it without instantiating a separate DynamoComponentDeploymentReconciler. No behavior change for the existing LWS pathway. Signed-off-by: Peter Pan <Peter.Pan@daocloud.io>
Reduce controller complexity in the DGD reconcile path, remove an unused DisaggregatedSet helper, add the missing SPDX header for the envtest CRD fixture, and replace the stale SGLang diffusion doc links that were failing lychee. Signed-off-by: Peter Pan <Peter.Pan@daocloud.io>
Run the DisaggregatedSet envtest against the existing controller suite environment so the CRD conversion webhook is available. Signed-off-by: Peter Pan <Peter.Pan@daocloud.io>
WalkthroughThe operator now discovers and authorizes the DisaggregatedSet API, selects eligible multinode components, reconciles DisaggregatedSet resources and readiness, routes DGD reconciliation accordingly, adds envtest coverage, and updates SGLang diffusion documentation links. ChangesDisaggregatedSet operator integration
Documentation link updates
Estimated code review effort: 4 (Complex) | ~60 minutes 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
Comment |
Document how DisaggregatedSet works with the LWS multinode path, including installation, selection, and fallback behavior. Signed-off-by: Peter Pan <Peter.Pan@daocloud.io>
Signed-off-by: Peter Pan <Peter.Pan@daocloud.io>
Signed-off-by: Peter Pan <Peter.Pan@daocloud.io>
Signed-off-by: Peter Pan <Peter.Pan@daocloud.io>
|
Phase-2 live-cluster E2E is now open as Draft #12352 (stacked on this PR). Running it against OrbStack with real LWS v0.9.0 + Volcano v1.14.0 found two controller issues, both fixed here in focused commits:
The full lifecycle suite now passes twice consecutively, 7/7 each run: real DS/LWS creation and readiness, metadata propagation, restart, annotation removal, DS→DCD fallback, deleted model-Service recreation, replacement readiness, and Service ownership handoff. |
Signed-off-by: Peter Pan <Peter.Pan@daocloud.io>
360f225 to
7854e10
Compare
|
/ok to test 7854e10 |
Signed-off-by: Peter Pan <Peter.Pan@daocloud.io>
Signed-off-by: Peter Pan <Peter.Pan@daocloud.io>
Signed-off-by: Peter Pan <Peter.Pan@daocloud.io>
Signed-off-by: Peter Pan <Peter.Pan@daocloud.io>
|
/ok to test 84e63e5 |
Keep the new DisaggregatedSet envtest suite out of the clustertest build so operator integration does not fail on the envtest-only k8sClient setup. Signed-off-by: Peter Pan <Peter.Pan@daocloud.io>
|
Pushed a fix for the Operator Integration compile failure on the latest head (8763efe). Pre-merge operator checks are green now. Could you please re-run full CI with |
|
Adding context for reviewers: follow-up live-cluster e2e coverage is in #12352, which depends on this PR and stays unmerged until this one lands. I also reran the DisaggregatedSet live tests on a real Kubernetes cluster after the latest fixes; both consecutive runs passed 7/7 (54.8s and 49.9s). |
|
Now that #12283 has merged (associated with #12035), the DGD controller has a composition-first architecture. I think this PR should be reworked on top of current The key design point is that DisaggregatedSet should become a third complete graph-level workload program:
DisaggregatedSet is a graph-level program because one DisaggregatedSet can coordinate multiple DGD components while unselected components remain ordinary DCDs. LWS itself is not another DGD program: it remains a workload mechanism used by DCD and by the DisaggregatedSet implementation. The outer DGD reconciler should only select the program, invoke it, and persist its returned status/events. The DisaggregatedSet program should own its sequencing and compose concrete collaborators for:
In particular, the DisaggregatedSet implementation should not construct or call a complete DCD reconciler. The renderer extraction previously included in this PR is also no longer needed because #12283 introduced the narrower The existing large DisaggregatedSet controller file should ideally be decomposed by responsibility rather than moving all its methods unchanged onto another large type. Nested reconcilers should have narrow dependencies and must not write DGD status directly. Status changes and queued events should be returned through the workload-program result and persisted once by the outer controller. Restart coalescing for selected roles should remain DisaggregatedSet-specific. It should not alter the common restart flow to introduce generic provider lifecycle behavior. Similarly, DCD/Grove/DisaggregatedSet transitions and Service ownership handoff should be implemented as narrow provider-specific compatibility cleanup, not as a universal zero-downtime cutover abstraction. I suggest rebuilding the implementation from current This should preserve the behavior and feature scope already implemented here while making DisaggregatedSet coherent with the architecture now present on |
|
rework moved to #12625 |
|
Closing, implementation of DisaggSet support refactored in this PR: #12625 |
Summary
disaggregatedset.x-k8s.io/v1with its required LWS API independently from the existing LWS + Volcano pathwaystatus.roleStatusesdirectly when the installed DS API exposes it and require exact replica convergence<set>-<revision>-<role>child names always fit the 63-character DNS label limitWorkload routing is ordered, not mutually exclusive:
Grove > opt-in DS > DCD. On a Grove-enabled cluster, selecting DS requires bothnvidia.com/enable-grove: "false"andnvidia.com/enable-disaggregatedset: "true"; installing the DS API alone never changes existing workload routing.Compatibility and scope
v0.9.0or newer; Dynamo currently builds and tests againstv0.9.0status.roleStatusesas authoritative when accompanied by generation-observation evidence and otherwise reads target-revision child LeaderWorkerSets; if neither source proves readiness, cutover remains pending and the previous workload stays servingThe Dynamo platform chart intentionally does not add a synthetic
disaggregatedset.enabledvalue. DS is supplied by an external LWS installation and detected at runtime.Validation
KUBEBUILDER_ASSETS="$PWD/bin/k8s/1.30.0-darwin-arm64" go test ./internal/controller ./internal/controller_common/... ./cmd/... -count=1KUBEBUILDER_ASSETS="$PWD/bin/k8s/1.30.0-darwin-arm64" go test ./internal/controller -run '^TestDisaggregatedSetRealLWSCRDValidationAndConvergence$' -count=1 -vmodified=falsego vet ./internal/controller ./internal/controller_common/... ./cmd/...GOTOOLCHAIN=go1.26.3 go run github.com/golangci/golangci-lint/cmd/golangci-lint@v1.62.2 run --timeout=5muvx pre-commit run --files <changed files>make manifestsmake generate-helm-docsdocker buildx build --platform linux/amd64 --target linter --build-context snapshot=../snapshot --build-context operator=../operator .docker buildx build --platform linux/amd64 --target tester --build-context snapshot=../snapshot --build-context operator=../operator .d65d7965tob47ae5a3, then removed the old revision7854e10ff5, focused DisaggregatedSet regressions and the controller DisaggregatedSet test set pass; lightweight CI is rerunning after the latest lint-only commitFollow-up testing
Draft #12352 implements the dependent phase-2 live-cluster E2E suite and remains intentionally outside this feature PR. It adds pinned dependency preparation plus
make test-e2e-disaggregatedsetfor ordinary kubeconfig-backed clusters; it must not merge before this PR.Review focus
deploy/operator/internal/controller/dynamographdeployment_disaggregatedset.godeploy/operator/internal/controller/dynamographdeployment_controller.godeploy/operator/internal/controller/dynamocomponentdeployment_controller.goRelated issues
Relates to #10205
Addresses the correctness findings in yankay#4