Migrate Legacy Workloads
The controllers and CRDs behind native workload types (workspace, training, distributed training, standard inference, distributed inference) are removed in v3.0 and replaced by a single, unified controller and CRD. Running and pending native workloads that were submitted through a legacy workload type before upgrading are affected by the upgrade and lose some capabilities until resubmitted.
Resubmit each affected workload to restore full functionality. Workloads can be resubmitted independently, so you can resubmit them in stages after upgrading. Resubmit an affected workload either manually through the NVIDIA Run:ai UI, API, or CLI, or, to reuse each workload’s existing configuration instead of re-entering it by hand, using the migration script against the control plane API.
Affected Capabilities
Resubmit affected workloads to restore the capabilities listed in the table below.
Submit Workload via UI/API/CLI
Resubmitting an affected workload through the NVIDIA Run:ai UI, API, or CLI binds it to the unified controller, resolving the affected capabilities listed in the table above.
- Identify the affected workloads using the Affected Capabilities table above.
- Make a copy of each workload - using Make a Copy in the NVIDIA Run:ai UI, or by resubmitting the same configuration through the API or CLI.
- Give the copy a different name so it can coexist with the legacy workload during verification. Submit it as-is, with the same fields and configuration - no changes are required.
- Verify the replacement works as expected.
- Stop or delete the legacy workload once the replacement is verified.
Note
If the workload must keep its original name, delete the temporary replacement and resubmit it with the original name, then verify it again.
Submit Workload via Migration Script
Warning
Do not turn this procedure into an unattended bulk migration unless credential restoration and workload-specific safety checks are handled explicitly.
This script recreates a legacy workload under a new name through the NVIDIA Run:ai control plane API, reusing its existing configuration instead of requiring you to re-enter it by hand. It uses only control plane APIs - no kubectl or Kubernetes API access required.
Set RESOURCE, OLD_ID, and REPLACEMENT_NAME for the workload you want to migrate, then run the steps below. Repeat the steps for each additional workload. The runai CLI, curl, and jq must be installed.
Configure the Target
Configure the target once per session - it does not need to be repeated per workload.
-
Set the control plane URL, authentication URL, and target cluster ID:
-
Authenticate using a separate CLI configuration, so the migration does not change your regular CLI profile:
Warning
Do not print the token or enable shell tracing while it is set.
Identify the Legacy Workloads
-
Identify the legacy workloads to migrate, either by project or across the entire cluster. Project-by-project migration is recommended, even when the goal is to recreate every legacy workload in the cluster. It limits the number of simultaneously running copies, makes credential review manageable, and provides a clear rollback boundary.
One project at a time (recommended)
Cluster-wide inventory
-
Set the project name:
-
List workloads in that project and cluster:
-
Complete and verify the workloads in this project before selecting the next project.
-
-
Record each legacy workload’s ID, name, and type.
-
Set the resource variables for one workload:
-
Set
RESOURCEto the typed API resource matching the workload’s type: -
Set
OLD_IDto the legacy workload’s ID, recorded in the previous step. -
Set
REPLACEMENT_NAMEto a temporary name, so the legacy workload remains available during verification.
-
-
Create a private temporary directory for the migration files, then get the workload:
-
Inspect the response before creating the replacement. Pay particular attention to:
- Environment variables
- Image-pull secrets
- Storage credentials
- User credentials
- Tokens, passwords, and private keys
Warning
A GET response can be sanitized. It must not be assumed to contain reusable secret values. Never submit a redaction marker as a real credential.
Submit the Replacement
-
Transform the response and assign the temporary replacement name. The following response-only fields must be removed:
workloadIdrequestedNamedepartmentIdcreatedBycreatedAtdeletedAtdesiredPhaseactualPhase
If the GET response omitted or redacted credentials, restore their original values in
"$PAYLOAD_FILE"now. Keep the file private and delete it after the migration. -
Review the complete payload before submitting it:
-
Post the transformed request to the same typed API. The target cluster must support the required workload capabilities for the replacement to be created successfully.
The API normally returns
202 Accepted. SaveNEW_ID; it is required for verification and lifecycle operations.If the request fails, do not repeatedly resubmit it without first checking whether a replacement was created.
Verify the Replacement
-
Verify the Workloads V2 representation:
Verify that:
- The returned ID and name identify the replacement.
syncStatusisSynced.- Workspace and Training workloads contain a
batch/v1Jobmanifest. - Distributed training workloads contain the expected distributed-workload manifest, such as a
kubeflow.org/v1PyTorchJob. - Standard inference workloads contain a
serving.knative.dev/v1Servicemanifest. - Distributed inference workloads contain a
leaderworkerset.x-k8s.io/v1LeaderWorkerSetmanifest.
-
Compare the typed specifications. Normalize the source and replacement GET responses:
Note
The replacement API can add explicit defaults. For example, it can return
spec.security.privileged: falsewhen that field was absent from the legacy response. This default does not grant privileges, but every difference must still be reviewed.Do not print a diff in shared logs if the normalized files contain restored credentials.
-
Confirm that the replacement is listed as a Workloads V2 workload:
-
Inspect the pods reported by the control plane:
Verify that:
- Pod creation, storage, network access, credentials, resource allocation, and application behavior are as expected. Rendered pods need not be byte-for-byte identical, since the newer submission path uses newer controllers and generated identities.
- A standard inference workload configured to scale to zero can have no running pods while idle - verify the Knative service state and send a test inference request to confirm that it scales up and serves traffic.
- For distributed inference, verify the expected leader and worker topology, the serving endpoint, and communication between replicas.
Delete the Legacy Workload
The steps above leave the legacy workload untouched.
- Fully verify the temporary replacement.
- Delete the legacy workload through the NVIDIA Run:ai control plane API.
- If retaining the original name is required, delete the verified temporary replacement and repeat the creation request with the original name.
- Verify the final workload again.
Repeat for the Remaining Workloads
You can migrate workloads one by one, or across all workloads in a project or the entire cluster. Either way, after one replacement passes verification:
- Remove the private temporary directory or allow the shell trap to remove it.
- Set
RESOURCE,OLD_ID, andREPLACEMENT_NAMEfor the next workload. - Repeat the steps above for the next workload.
For a cluster-wide recreation, finish and validate all selected workloads in one project before moving to the next project. Track the old and new workload IDs for every project so cutover and rollback remain unambiguous.