Kubernetes Operator Chart#
Overview#
The nvidia-studio-voice-h4m-operator Helm chart installs the Studio Voice Kubernetes operator. The controller watches NvidiaStudioVoiceMediaFunction custom resources and reconciles a deployment for the Studio Voice NIM, SDP ConfigMaps (/sdps), and status.
Operator chart: Deploys only the controller and CRDs. It does not install an
NvidiaStudioVoiceMediaFunctioncustom resource or the NIM workload—apply a custom resource after installation to provision the NIM.Operand: Each custom resource instance drives one Studio Voice NIM workload (audio in and enhanced audio out) according to the inputs, outputs, and parameters declared in that resource.
Installation#
Prerequisites#
Before running helm install, complete all prerequisite steps (Rivermax license, image pull and model pull secrets, GPU node, Multus attachment for SMPTE ST 2110). For more information, refer to Getting Started.
Pull the Chart#
If not already done, add the Helm repository and pull the chart:
helm pull nim-repo/nvidia-studio-voice-h4m-operator --version 1.2.0
For the full repository setup, refer to Pull Helm Charts.
Helm Installation#
The chart installs the operator deployment and registers the NvidiaStudioVoiceMediaFunction CRD. For all available Helm values and --set keys, refer to Operator Configuration.
The chart expects a pre-created image pull secret for nvcr.io (default name ngc-api-key). If your secret names differ, override as follows:
helm install studio-voice-operator \
nvidia-studio-voice-h4m-operator-1.2.0.tgz \
--set imagePullSecrets[0].name=<operator-pull-secret> \
--set mediaFunction.imagePullSecrets[0].name=<nim-pull-secret>
When the defaults match your cluster, you can use the following command:
helm install studio-voice-operator \
nvidia-studio-voice-h4m-operator-1.2.0.tgz
|
Purpose |
Default |
|---|---|---|
|
Image pull secret for the operator pod. |
|
|
Image pull secret for NIM pods that the operator creates. |
|
|
Inline registry password for the operator (alternative to a pre-created secret). |
|
|
Inline registry password for NIM pods. |
|
Note
The model pull secret and node hostname are set on the custom resource, not Helm values (spec.parameters.ngcSecret, spec.nodeSelector). Refer to Create the Custom Resource.
Note
If helm install fails with an Apply failed with 1 conflict error citing the NvidiaStudioVoiceMediaFunction CRD, the CRD was previously applied with kubectl apply (field manager kubectl-client-side-apply) and Helm cannot take ownership of its fields. Take over the field manager once with kubectl replace, and then re-run helm install:
tar xf nvidia-studio-voice-h4m-operator-1.2.0.tgz
kubectl replace -f nvidia-studio-voice-h4m-operator/crds/nvidiastudiovoicemediafunction-crd.yaml
helm install studio-voice-operator nvidia-studio-voice-h4m-operator-1.2.0.tgz
On Red Hat OpenShift, replace kubectl with oc.
Wait for the controller to be ready:
kubectl rollout status deployment/studio-voice-operator-controller-manager --timeout=180s
On Red Hat OpenShift, replace kubectl with oc.
Create the Custom Resource#
After the operator controller is ready, save a manifest (for example, studio-voice-media-function.yaml) and configure the following areas:
Area |
Field |
Notes |
|---|---|---|
GPU node |
|
Labels for the node that runs the NIM pod (for example, |
Model pull secret |
|
Must match the model pull secret created in Getting Started. |
Pipeline I/O |
|
SMPTE ST 2110 static (fixed sessions and addresses) or NMOS-managed connections. |
Pipeline tuning |
|
Refer to Operator Configuration. |
Apply the manifest:
kubectl apply -f studio-voice-media-function.yaml
Applying the CR reconciles and starts the Studio Voice NIM in NMOS mode; refer to Chrome Remote Desktop for NMOS Connection Manager UI access and setup steps.
On Red Hat OpenShift, replace kubectl with oc.
Example Manifest#
Reference a custom resource with a placeholder node name, ngc-api-key for model download, and audio format defaults.
apiVersion: nvidia.com/v1alpha1
kind: NvidiaStudioVoiceMediaFunction
metadata:
labels:
app.kubernetes.io/name: studio-voice-operator
app.kubernetes.io/managed-by: helm
name: nvidia-studio-voice-nim-media-function
spec:
schedulerName: topo-aware-scheduler
nodeSelector:
kubernetes.io/hostname: <gpu-node-name>
parameters:
highSpeedNetwork:
- name: media-a-tx-net
resources:
requests:
cpu: "4"
memory: "8Gi"
hugepages-2Mi: "2Gi"
nvidia.com/gpu: "1"
limits:
cpu: "4"
memory: "8Gi"
hugepages-2Mi: "2Gi"
nvidia.com/gpu: "1"
ngcSecret:
secretName: ngc-api-key
secretKey: NGC_API_KEY
nimModelCache:
path: /opt/nim/.cache
pvc:
enabled: false
# claimName: <CR.name>-model-cache # default
size: 10Gi
# storageClassName: "" # empty -> cluster default
nimLogs:
path: /workspace/nim-logs
pvc:
enabled: false
# claimName: <CR.name>-nim-logs # default
size: 5Gi
# storageClassName: "" # empty -> cluster default
securityContext:
runAsUser: 1000
runAsGroup: 1000
runAsNonRoot: true
allowPrivilegeEscalation: true
capabilities:
add:
- IPC_LOCK
- NET_RAW
- SYS_NICE
- DAC_READ_SEARCH
drop:
- ALL
podSecurityContext:
fsGroup: 1000
seccompProfileType: RuntimeDefault
label: "Studio-Voice-NIM"
description: "Studio Voice NIM - audio enhancement, ST2110"
nmosEnabled: true
nimEnabled: true
loggingLevel: 3
inputs:
audio_input:
control:
nmos: {}
transport:
rtp:
packet_time: 1
format:
audio:
sample_rate: 48000
channel_count: 1
sample_depth: 24
media_type: "audio/L24"
sessionName: audio_in
localInterfaceName: net1
hostIP: "234.5.8.9"
hostPort: "5003"
hostNumSubnetBits: 24
outputs:
audio_output:
control:
nmos: {}
transport:
rtp:
packet_time: 1
format:
audio:
sample_rate: 48000
channel_count: 1
sample_depth: 24
media_type: "audio/L24"
sessionName: audio_out
localInterfaceName: net1
hostIP: "234.5.8.9"
hostPort: "5004"
hostNumSubnetBits: 24
Extended Parameters (Optional)#
As needed, you can add optional spec.parameters fields, including resources (CPU, memory, GPU, hugepages) and nimLogs / nimModelCache PVC settings (path, pvc.enabled, pvc.size, pvc.storageClassName, pvc.claimName). For field-by-field details, refer to Operator Configuration in the configuration reference. For PVC configuration, refer to Advanced Usage. CPU affinity is set on the NIM service Helm chart (env.CPU_AFFINITY) and is not exposed on the custom resource.
Verify#
After applying the custom resource:
kubectl get nvidiastudiovoicemediafunctions
kubectl get pods -l app.kubernetes.io/managed-by=studio-voice-operator
Inspect custom resource status conditions:
kubectl get nvidiastudiovoicemediafunction <cr-name> \
-o json | jq '.status.conditions'
Confirm the CRD is installed:
kubectl get crd nvidiastudiovoicemediafunctions.nvidia.com
On Red Hat OpenShift, replace kubectl with oc. For log access, refer to Observability.
Uninstall#
First, delete all custom resource instances so the operator can remove the managed deployments and ConfigMaps; then remove the Helm release. Delete the CRD cluster-wide only if coordinated with cluster administrators; it affects all namespaces.
kubectl delete nvidiastudiovoicemediafunctions.nvidia.com --all
helm uninstall studio-voice-operator
# Optional — removes the custom resource definition cluster-wide:
kubectl delete crd nvidiastudiovoicemediafunctions.nvidia.com
On Red Hat OpenShift, replace kubectl with oc.
Note
The *-model-cache and *-nim-logs PVCs carry helm.sh/resource-policy: keep and are not removed by helm uninstall. This preserves the cached model across reinstalls; clean them up manually when no longer needed:
kubectl delete pvc -l app.kubernetes.io/instance=studio-voice-operator -n <your-namespace>
For troubleshooting and known limitations, refer to Advanced Usage.
See Also#
Getting Started — NGC authentication, secrets, and prerequisites.
Installation — Service, operator, and demo chart installation patterns.
Configuration Reference — Helm values and operator custom resource field reference.