Upgrade from NVCF Self-Managed 0.6.1 to 1.0.0
Upgrade from NVCF Self-Managed 0.6.1 to 1.0.0
The 1.0.0 stack tags are release aliases of control-plane 0.20.6, compute-plane 0.4.4, and observability 0.2.2. The component versions and migration stops in this procedure are unchanged.
This procedure uses staged schema changes and Kubernetes rolling updates. The control-plane API and task service can remain available while compatible schemas and service versions are rolled. Block control-plane mutations during the final validation and contract steps. Existing function workloads can continue running in compute clusters throughout the upgrade.
This procedure supports only a healthy 0.6.1 starting state. Do not use it to skip an earlier documented upgrade. Do not continue after a failed or dirty database migration, a sealed OpenBao member, a changed cluster identity, or a missing GPU inventory record.
Upgrade stops
The source Cassandra migration image is 0.10.3. A healthy 0.6.1 database has already completed the NVCF GPU specification and model specification migrations and records NVCF schema version 7. The source NVCF API maps only the post-migration data model. Do not deploy an older NVCF API runtime to repeat those migrations.
The remaining Cassandra and service changes require the following ordered gates:
The migration image contains the standard migrate CLI. It supports
goto V and up N for one migration path and migration table. The image’s
default /app/execute_sqls.sh entrypoint always runs up for every keyspace,
and Cassandra migrations 0.17.1 through 0.17.6 package NVCT migrations 4, 5,
and 6 together. The released chart does not expose a command override or a
per-keyspace target. Use a bounded Job that invokes the existing image with
exact targets, or a chart update that exposes the same control. A new migration
binary is not required.
Each bounded Job must use the preprocessed SQL path for one keyspace and the
matching table in the schema_migrations keyspace. Before invoking goto, it
must require the expected clean source version. Afterward, it must require the
exact clean target version. Never use goto to move a ledger backward. For
example, the NVCT expand Job uses the nvct_api migration path and ledger,
requires version 3, invokes goto 4, and then requires version 4.
The service rollout and the data task are separate gates. NVCT 1.64.3 provides
the required dual-read compatibility and the health backfill. ICMS 0.7.5
provides the instance lookup backfill. Both tasks expose explicit MIGRATE,
VALIDATE, and DISABLED modes and default to DISABLED.
Run migration mode to completion, switch to validation mode, require zero
mismatches, and disable the task before rolling past the bridge. A completion
log without a validation pass is not a safe checkpoint.
The two upgrade-only images are:
Use the immutable published versions listed above.
Helmfile upgrades one release at a time with --selector name=<release>.
Helm updates the Deployment and Kubernetes performs the rolling update. Use at
least two replicas for each service stop and require maxUnavailable: 0 and
maxSurge: 1. The cluster must have capacity for the surge pod. A three-member
Cassandra cluster is required to keep the database available while its
StatefulSet rolls. A one-member Cassandra deployment has unavoidable database
downtime during the server restart.
The full path is:
- Roll the Cassandra members with hooks disabled, then apply only the bounded expand migrations.
- Upgrade OpenBao and complete its migrations. The target ICMS and NVCT charts require the target OpenBao roles and policies.
- Roll ICMS 0.7.5 and NVCT 1.64.3. Run and validate both data tasks, then set
both modes back to
DISABLED. - Roll ICMS 0.7.2 and NVCT 1.66.0. Apply the NVCT contract migrations while NVCT remains online.
- Sync the remaining target control-plane and observability releases. Run the normal Cassandra release and require its migration hook to be a no-op.
- Re-register each existing compute cluster without deleting its identity, then sync compute-plane 1.0.0 and NVCA 3.10.0.
The source and target service versions remain:
The version-number decreases for ICMS and ESS reflect component lineage changes. They are the runtimes shipped with the target stack set.
Prepare the deployment host
Download and extract these target bundles into new directories:
nvcf-self-managed-stack1.0.0nvcf-compute-plane-stack1.0.0nvcf-observability-stack1.0.0, if observability is managed separately
Do not extract a target bundle over the 0.6.1 directories. Keep the source configuration available for recovery.
Set variables for the deployment. Use a kubeconfig that selects only the control-plane cluster, or verify the selected context before every command.
Use Helm 3 and Helmfile 1.1.x. Authenticate Helm and the target clusters to all registries used by the target bundles. Mirror every required target artifact before the maintenance window. Use the inventory JSON attached to each 1.0.0 stack release as the exact artifact list. See the image mirroring page for the mirroring procedure.
Use nvcf-cli 1.16.2 from the target release inventory. The target
registration flow refreshes the existing cluster metadata while preserving its
identity.
Prepare the target configuration
Start from the target bundle templates. Reconcile the site-specific settings from 0.6.1 into these target files:
Do not copy the 0.6.1 files wholesale. Preserve the existing registry, storage, endpoint, credential, ingress, certificate, and scheduling values, then add settings required by the target templates.
The Cassandra service-role password in the target secrets file must match the password already stored for the service-specific Cassandra roles. The same value must be supplied to the OpenBao migration:
If the Cassandra administrator password was changed from the chart default,
also carry the existing cassandra.dbUser values into the target secrets file.
Do not rotate Cassandra credentials as part of this upgrade.
Keep the live Cassandra storage class, size, and replica count unchanged. Record them before rendering the target release:
Render the target configuration before the maintenance window:
Review the rendered storage settings, images, registries, domains, and namespaces. Do not continue if the target render changes a Cassandra volume claim template.
Verify the 0.6.1 starting state
Confirm that every source Helm release is deployed and every active controller is ready:
Confirm that Cassandra has no pending repair or schema disagreement and that
all OpenBao members are initialized, unsealed, and ready. Identify the active
OpenBao member. Standby members report HA Mode standby; one member reports
HA Mode active.
Record the identity and version of every registered compute cluster. Run these commands with that compute cluster’s kubeconfig and context:
The source NVCA version must be 3.0.3 and agent must be healthy.
Verify the GPU inventory precondition
Resolve the Cassandra administrator password from the original 0.6.1 installation configuration. The 0.6.1 chart does not always create a Kubernetes Secret for this password, so do not assume a Secret name. Do not enable shell tracing while the password variable is set.
Every active cluster row must have a nonempty gpus_v5 value. Stop if this
check fails.
Record application baselines
Record at least one active function, function version, deployment, completed task, cluster ID, and cluster-group ID. Invoke the function and read the task before the upgrade. Use the same records for post-upgrade validation.
Back up persistent state
Create restorable backups of Cassandra, OpenBao Raft storage, NATS JetStream, the Helm values, and all target configuration files. Follow the storage provider’s backup procedure and verify the restore path before continuing.
Flush Cassandra and create a named snapshot on every Cassandra member before the storage-level backup:
The Cassandra snapshot remains on each persistent volume. It is not an off-cluster backup by itself. Copy or snapshot the volumes with your storage provider.
Do not continue until the Cassandra and OpenBao backups are complete.
Prepare the staged rollout
Do not scale the application Deployments to zero. Block configuration changes that can invalidate the upgrade baseline, but keep normal read and task traffic running for the availability test. Record the current images, replicas, and rolling strategies:
Use at least two application replicas for a zero-downtime upgrade. The rollout
must have an effective maxUnavailable of 0 and maxSurge of at least one pod.
Kubernetes calculates those values as 0 and 1 from the default 25 percent
settings when a Deployment has two replicas. A zero-downtime Cassandra server
upgrade requires at least three healthy members.
Start a continuous external probe before the first rollout. It must exercise the same API and task reads used for the retained baseline. Record every non-success response and stop the upgrade if any request fails. Keep the probe running through the final schema and service validation.
Stop 1: roll Cassandra and apply expand migrations
Upgrade only the Cassandra release with Helm hooks disabled. Preserve the existing replica count and storage settings. With three members, rotate one member at a time and require it to rejoin before continuing. A one-member development deployment has unavoidable database downtime during this step.
Run migration image 0.17.6 as bounded Jobs. Require the expected clean source
version before each goto call and require the exact clean target afterward.
Stop at these versions:
Do not use the image’s default /app/execute_sqls.sh. It runs every available
migration, including the destructive NVCT contract migrations. Each bounded
Job must select one preprocessed keyspace path and its matching migration
table, fail on an unexpected or dirty starting ledger, and stop immediately
on the first error.
Confirm Cassandra is healthy after the server roll and expand Jobs:
Do not roll either bridge until every expanded ledger has the exact version in
the table and dirty = False.
Stop 2: migrate OpenBao
The OpenBao StatefulSet uses OnDelete. The target release also changes the
JWT plugin binary and catalog checksum. The safe sequence requires two manual
pod rotations:
- Update the StatefulSet without hooks and rotate onto the target image.
- Start the normal Helm sync so the catalog-refresh hook runs.
- When the target migration Job appears, rotate the pods again so each server reloads the refreshed plugin catalog.
- Let the migration Job and Helm sync finish.
Never delete the StatefulSet, its persistent volume claims, or more than one OpenBao server pod at a time.
Update the StatefulSet without hooks
Run this command from the target control-plane bundle:
Confirm the StatefulSet template uses OnDelete and the target image. Existing
pods can still show the source image.
Perform the first OpenBao rotation
Identify the active and standby members with bao status. Rotate every standby
member first. For each standby pod, run:
Kubernetes readiness can become true before auto-unseal completes. The polling
check must report Initialized true, Sealed false, and a healthy standby HA
mode. Recheck every member, identify the current active member, and rotate it
last with the same commands.
Confirm all members are ready and use the target image before continuing:
Refresh the catalog and run migrations
Use two terminals. Start the normal target OpenBao sync in terminal 1:
The command waits while the target catalog-refresh and migration hooks run.
In terminal 2, wait until the migration Job uses OpenBao migrations 0.19.5. The migration Job is created only after the catalog-refresh hook succeeds:
As soon as the target migration Job appears, repeat the standby-first,
active-last rotation from the preceding section. This second rotation reloads
the refreshed plugin catalog. The migration Job uses OnFailure retries while
the rotation is in progress.
Wait for the sync in terminal 1 to finish. Then verify the migration Job and all OpenBao members:
All members must be initialized, unsealed, ready, and running the same target image. Do not continue if the migration Job failed or any member is unhealthy.
Stop 3: run the service backfills and contract migrations
The target service charts require the OpenBao roles and policies created at
Stop 2. Use the target sis and nvct-api charts for both bridge rollouts.
Set at least two replicas and keep the external availability probe running.
Set the published bridge image locations:
Backfill ICMS instance lookup columns
Define a helper that keeps every bridge override in each Helm invocation:
Roll the bridge with the task disabled, then run the migration and validation as separate rollouts:
Require a completed MIGRATE record with missingRequest=0, mismatched=0,
and failed=0. Then require a completed VALIDATE record with migrated=0,
missingRequest=0, mismatched=0, and failed=0. The validation record must
report the migrated active rows as current. Keep the task DISABLED after the
validation pass.
Roll the stack-pinned ICMS image by removing the bridge image overrides:
Confirm that the final Deployment uses ICMS 0.7.2 and that no bridge pod remains.
Backfill NVCT task health
Define the corresponding NVCT helper:
Roll the bridge and move through the same explicit task modes:
Require a completed MIGRATE record with withoutLegacyHealth=0, missing=0,
mismatched=0, and failed=0. Then require a completed VALIDATE record with
migrated=0, withoutLegacyHealth=0, missing=0, mismatched=0, and
failed=0. Re-read the retained task and record its new health value before
continuing.
Roll the stack-pinned NVCT 1.66.0 image by removing the bridge overrides:
After every bridge pod is gone, run the bounded NVCT migration Job from clean
version 4 to version 6. This drops health_info and health_udt. NVCT 1.66.0
remains online because it uses only the replacement health column.
Roll NVCF API 1.18.0 and ESS 0.5.0, then run the normal target Cassandra release. Its migration hook must be a no-op because all ledgers are already at their target versions.
After all steps succeed, confirm that the Cassandra migration Jobs completed
and that nodetool status reports a healthy topology:
Use the Cassandra administrator credentials from your deployment to query the
migration ledgers. Each row must have dirty = False and the following
version:
Run these CQL statements through the site’s approved Cassandra administration path:
Confirm that the NVCT task schema contains only the replacement health column:
The result must contain only health. Re-read the retained task and require
the same serialized health value recorded before the contract migration. Do
not continue if a ledger is dirty, a version differs, or the schema or retained
data check fails.
Sync the target control plane and observability stack
The selector of the reval Deployment changed after 0.6.1. Kubernetes does
not permit that field to change in place. Delete only the Deployment before
the full sync. Do not uninstall the Helm release or delete its namespace.
Sync the full target control-plane bundle. Its default control profile also installs the target observability components and function autoscaler.
This sync reruns the OpenBao hooks. They must finish successfully without another pod rotation. Confirm that every Helm release is deployed and every active Deployment or StatefulSet is ready:
Confirm the required global NATS streams still exist:
If observability is managed by a separate stack instance, keep the
self-managed ownership settings consistent with the existing deployment and
sync nvcf-observability-stack 1.0.0 as the only owner. Do not install two
owners for the same observability resources.
Upgrade each compute cluster
Export a fresh control-plane profile from the target bundle:
For each compute cluster, set its values and verify the selected context:
Confirm that nvcr-pull-secret, or the pull secret named in the compute-plane
environment, exists in nvca-operator. The operator mirrors it to
nvca-system for NVCA sidecars and managed workloads.
Re-register the existing cluster with the target control-plane profile:
Do not delete the existing cluster registration. Re-registration must preserve
the source clusterID and clusterGroupID. A new identity can orphan existing
function deployments and tasks.
Compare the generated registration values with the IDs recorded before the upgrade. Stop if either ID changed.
Install compute-plane 1.0.0:
Wait for the operator and backend, then verify the preserved identity and target NVCA version:
The IDs must match the source values, NVCA must be 3.10.0, and agent must
be healthy. Repeat this section for every compute cluster. In a single-cluster
deployment, the control-plane and compute-plane kubeconfig values can point to
the same cluster. In a multi-cluster deployment, always pass the compute
cluster’s kubeconfig and context explicitly.
Validate the upgraded deployment
Repeat the baseline checks with the same IDs:
- Get the source function and version. Their status must remain
ACTIVE. - Get the source deployment. Its ID and cluster placement must be unchanged.
- Invoke the source function and verify its response.
- Get the source task. Its ID, name, status, and completion percentage must be unchanged.
- Create a new task on a target compute cluster and wait for it to complete.
- Recheck all seven Cassandra ledgers and OpenBao health.
- Confirm every Helm release is deployed and every active controller is ready.
Use the same CLI commands from the baseline section. A successful invocation validates the API, invocation service, gRPC proxy, NATS, NVCA, retained function deployment, and compute data path. A completed new task validates the target NVCT, ICMS, ESS, NVCA, and task-worker path.
After all checks pass, reopen control-plane mutations and end the maintenance window. Clear the shell copy of the Cassandra password:
Stop and recovery criteria
Stop the upgrade if any of these conditions occurs:
- A Cassandra migration ledger is dirty or has an unexpected version.
tasks_v2still hashealth_infoor lackshealth.- The OpenBao migration Job fails.
- An OpenBao member is sealed, uninitialized, or not ready.
- A compute cluster receives a different cluster ID or cluster-group ID.
- The required NATS streams are missing.
- A retained function, deployment, or task cannot be read after the upgrade.
Do not run a normal 0.6.1 Helm sync after the target Cassandra or OpenBao migrations have completed. The target services can write data that the source schemas and runtimes do not understand. Recovery after a completed data stop requires restoring the Cassandra, OpenBao, and NATS backups as a consistent set, restoring the 0.6.1 configuration, and then reinstalling the source stack.
Do not delete compute-cluster registrations during recovery. Restore the control plane first, then reapply the source compute-plane bundle with the preserved cluster identity.