Create and Manage App Deployments
An App Deployment deploys AI/ML workloads such as training frameworks, inference servers, or experiment tracking tools onto a Compute Pool using Profile Bundles. This guide describes how to create, clone, and delete App Deployments.
App Deployments follow an immutable deployment pattern. To change settings, clone the existing deployment, adjust the configuration, and deploy a new one. This approach ensures each deployment is a known, reproducible configuration.
You can create App Deployments using the PaletteAI UI or using YAML Kubernetes manifests.
Create App Deployment
Create a new App Deployment by selecting Profile Bundles and a Compute Pool target.
Prerequisites
- UI Workflow
- YAML Workflow
-
A Project in
Readystatus. -
A Profile Bundle of type Application that defines the workload to deploy.
-
One of the following Compute Pool options:
- An existing Compute Pool in
Runningstatus, or - A Profile Bundle of type Infrastructure or Fullstack if you want to create a new Compute Pool during the App Deployment workflow.
- An existing Compute Pool in
-
A user with Project Editor or Admin permissions.
-
kubectl installed and available in your
$PATH. -
The
KUBECONFIGenvironment variable set to the path of the PaletteAI hub cluster'skubeconfigfile.export KUBECONFIG=<kubeconfig-location> -
A Project namespace for the Project you are deploying to.
-
One or more Profile Bundles that define the workload to deploy.
Enablement
- UI Workflow
- YAML Workflow
-
Log in to PaletteAI, and then open your Project.
-
In the left main menu, select App Deployments.
-
Select Deploy App.
-
In the General Info screen, set the name and metadata for your deployment.
-
Enter a unique Name. The name must be 3-33 characters, start with a lowercase letter, end with a lowercase letter or number, and contain only lowercase letters, numbers, and hyphens. The name must be unique within the Project.
-
(Optional) Add a Description.
-
(Optional) Select Add link to attach external URLs (for example, a model registry or documentation link). Each link must start with
http://orhttps://. -
(Optional) Expand Metadata to add labels and annotations for sorting and filtering.
Select Next.
-
-
In the Profile Bundles screen, select the Profile Bundles to apply to this deployment.
-
Select Add Profile Bundle. In the selection drawer, choose a Profile Bundle from the table. Select Add Bundle.
-
If you selected an Infrastructure Profile Bundle, you must also add an Application Profile Bundle. Select Add Profile Bundle again to add it.
-
For each Profile Bundle, select the Version. If the Profile Bundle supports multiple cloud types, select the Cloud Type.
infoIf you selected an Infrastructure Profile Bundle without an Application Profile Bundle, the wizard requires you to add one before proceeding. Fullstack Profile Bundles include application layers and do not require a separate Application Profile Bundle.
Select Next.
-
-
In the Variables screen, configure variables for the selected Profile Bundles. Variables are parameters defined by the workload profile, such as namespace names, Helm chart values, model paths, or resource limits.
-
The variables table displays all configurable variables with Name, Value, and Description columns. When Merge variables is disabled, the source profile name appears as a prefix in the Name column.
-
Required variables are marked with an asterisk (
*) next to the name. Enter or update the Value for each variable. -
(Optional) Select the gear icon in the top-right to open the deployment settings drawer.
Field Description Required Namespace The namespace where workloads are deployed. Defaults to the Project namespace. Must start and end with alphanumeric characters and can only contain lowercase letters, numbers, hyphens, and periods. ✅ Merge variables Controls how variables with the same name across multiple profiles are handled. When enabled (the default), each variable name appears once and the provided value applies to all profiles. When disabled, each profile source has its own row and values are set per profile. ❌ Labels Key-value pairs applied to the workload. Expand Metadata to configure. ❌ Annotations Key-value pairs applied to the workload. Expand Metadata to configure. ❌ Select Confirm.
Select Next.
-
-
In the Compute Pool screen, choose the compute environment where your application runs.
Field Description Required Compute Pool type Choose Dedicated for exclusive access to physical resources with no resource contention (for example, running a distributed PyTorch training job on dedicated GPUs), or Shared to share resources across multiple teams (for example, running development experiments or batch inference jobs alongside other workloads). ✅ Select from existing Select an existing Compute Pool in Runningstatus from the selection drawer.Conditional Create new Provision a new Compute Pool as part of this deployment. An additional setup step appears after this screen. Conditional -
If you selected Select from existing, choose a Compute Pool from the selection drawer.
-
If you selected Create new, you configure the new Compute Pool in the next step.
Select Next.
-
-
(Conditional) In the Compute Pool setup screen, configure the infrastructure for the new Compute Pool.
infoThis step appears only when you select Create new in the previous step. If you selected an existing Compute Pool, the wizard skips this step.
The configuration includes control plane pools, worker pools, edge configuration, and deployment settings. These fields are the same as the Compute Pool creation wizard. Refer to Create and Manage Compute Pools for detailed field descriptions and the Compute Pool Configuration Reference for YAML-level details.
Select Next.
-
In the Review & Deploy screen, review and confirm your deployment configuration. The summary displays an overview of your general information, Profile Bundles, compute pool selection, and deployment settings.
-
Review your settings. The summary is read-only. To make changes, select a previous step in the left sidebar to navigate back.
-
Select Submit to create the App Deployment.
-
Create an AIWorkload resource in your Project namespace. The AIWorkload references Profile Bundles and either an existing Compute Pool or an inline cluster variant definition.
Deploy to an existing Compute Pool:
apiVersion: spectrocloud.com/v1alpha1
kind: AIWorkload
metadata:
name: my-app
namespace: <project-namespace>
labels:
palette.ai/project: '<project-namespace>'
spec:
computePoolRef:
name: '<existing-computepool-name>'
namespace: '<project-namespace>'
profileBundles:
- name: '<profilebundle-name>'
namespace: '<project-namespace>'
workloadDeploymentConfigs:
- workloadProfileRef:
name: '<workload-profile-name>'
namespace: 'mural-system'
targetWorkload:
name: '<deployment-name>'
namespace: '<project-namespace>'
variables:
<variable-name>: '<value>'
Create a new dedicated Compute Pool inline:
apiVersion: spectrocloud.com/v1alpha1
kind: AIWorkload
metadata:
name: my-app
namespace: <project-namespace>
labels:
palette.ai/project: '<project-namespace>'
spec:
clusterVariant:
dedicated:
paletteClusterDeploymentConfig:
cloudType: 'edge-native'
deletionPolicy: 'delete'
nodePoolRequirements:
controlPlanePool:
nodeCount: 1
workerPools:
- architecture: 'AMD64'
cpu:
cpuCount: 4
memory:
memory: '16 GB'
gpu:
family: 'NVIDIA A100'
gpuCount: 1
edge:
vip: '<vip-address>'
profileBundles:
- name: '<profilebundle-name>'
namespace: '<project-namespace>'
cloudType: 'edge-native'
workloadDeploymentConfigs:
- workloadProfileRef:
name: '<workload-profile-name>'
namespace: 'mural-system'
targetWorkload:
name: '<deployment-name>'
namespace: '<project-namespace>'
variables:
<variable-name>: '<value>'
Apply the manifest:
kubectl apply --filename aiworkload.yaml
Key fields:
| Field | Description | Required |
|---|---|---|
spec.profileBundles | References to Profile Bundles. At least one required. | ✅ |
spec.workloadDeploymentConfigs | One entry per workload to deploy. Each requires a workloadProfileRef and targetWorkload with name and namespace. | ✅ |
spec.computePoolRef | Reference to an existing Compute Pool. Mutually exclusive with clusterVariant. | Conditional |
spec.clusterVariant | Inline Compute Pool definition (dedicated, shared, or imported). Mutually exclusive with computePoolRef. | Conditional |
spec.workloadDeploymentConfigs[].variables | Variable overrides for the workload profile. Required if the workload profile defines mandatory variables. | ❌ |
spec.workloadDeploymentConfigs[].syncWithPalette | Sync variables with Palette cluster profile variables. Default: false. | ❌ |
spec.hardwareRequests | CPU, memory, and GPU requirements per architecture. Required for shared Compute Pools. | Conditional |
workloadProfileRef points to the profile definition in mural-system that describes the workload structure. targetWorkload defines where the resulting workload is deployed (name and namespace in your Project).
hardwareRequests example (required for shared Compute Pools):
spec:
hardwareRequests:
- architecture: AMD64
totalCPU: 4
totalMemory: '16 GB'
gpu:
- family: 'NVIDIA A100'
gpuCount: 1
For inline Compute Pool configuration fields (clusterVariant), refer to the Compute Pool Configuration Reference.
Validate
- UI Workflow
- YAML Workflow
-
In the left main menu, select App Deployments.
-
Confirm that the App Deployment appears with status Provisioning.
-
Confirm that the status changes to Running. If you created a new Compute Pool, provisioning includes both the Compute Pool and the application deployment, which may take 10-15 minutes.
-
If the status remains Provisioning or changes to Failed, select the App Deployment and review its events for errors.
-
Check that the
AIWorkloadstatus transitions toRunning:kubectl get aiworkload <name> --namespace <project-namespace> --watch -
Verify the
WorkloadDeploymentCreatedandWorkloadDeploymentReadyconditions:kubectl get aiworkload <name> --namespace <project-namespace> --output jsonpath='{.status.conditions}' | jq -
If you created a new Compute Pool inline, verify the Compute Pool is also
Running:kubectl get computepool --namespace <project-namespace> -
If the
AIWorkloadis stuck inProvisioningor showsFailed, check events for errors:kubectl describe aiworkload <name> --namespace <project-namespace>
Clone App Deployment
Create a new App Deployment from an existing one. Cloning pre-fills the creation wizard with the configuration from the source deployment, allowing you to adjust settings before deploying.
Prerequisites
- UI Workflow
- YAML Workflow
-
An existing App Deployment.
-
A user with Project Editor or Admin permissions.
-
kubectl installed and available in your
$PATH. -
The
KUBECONFIGenvironment variable set to the path of the PaletteAI hub cluster'skubeconfigfile.export KUBECONFIG=<kubeconfig-location> -
An existing
AIWorkloadin the Project namespace.
Enablement
- UI Workflow
- YAML Workflow
-
Log in to PaletteAI, and then open your Project.
-
In the left main menu, select App Deployments.
-
In the App Deployment row, select the action menu and then select Clone.
-
The creation wizard opens with the source deployment's configuration pre-filled. Modify any fields as needed.
-
Select Submit to create the new App Deployment.
-
Export the existing
AIWorkloadmanifest.kubectl get aiworkload <source-name> --namespace <project-namespace> --output yaml > aiworkload.yaml -
Update
metadata.nameand any other settings (Profile Bundle versions, variables, and Compute Pool references). -
Apply the updated manifest.
kubectl apply --filename aiworkload.yaml
Validate
- UI Workflow
- YAML Workflow
-
In the left main menu, select App Deployments.
-
Confirm the cloned App Deployment appears with status Provisioning.
-
Confirm that the status changes to Running.
Verify the cloned AIWorkload transitions to Running.
kubectl get aiworkload <name> --namespace <project-namespace> --watch
Delete App Deployment
Delete an App Deployment when you no longer need it. Deleting an App Deployment removes the deployed workloads. If the App Deployment created a new Compute Pool with deletionPolicy: "delete", the Compute Pool is also deleted. If the policy is "orphan" or the deployment references an existing Compute Pool, the Compute Pool remains.
Deleting an App Deployment removes the deployed workloads and cannot be undone. Back up important data before you delete.
Prerequisites
- UI Workflow
- YAML Workflow
- A user with Project Editor or Admin permissions.
-
kubectl installed and available in your
$PATH. -
The
KUBECONFIGenvironment variable set to the path of the PaletteAI hub cluster'skubeconfigfile.export KUBECONFIG=<kubeconfig-location>
Enablement
- UI Workflow
- YAML Workflow
-
Log in to PaletteAI, and then open your Project.
-
In the left main menu, select App Deployments.
-
In the App Deployment row, select the action menu and then select Delete.
-
In the confirmation dialog, review the warning that this action cannot be undone.
-
Select Delete to confirm, or Cancel to keep the App Deployment.
kubectl delete aiworkload <name> --namespace <project-namespace>
Validate
- UI Workflow
- YAML Workflow
-
In the left main menu, select App Deployments.
-
Verify the App Deployment no longer appears in the list.
-
Confirm the
AIWorkloadresource is removed.kubectl get aiworkload --namespace <project-namespace> -
If the App Deployment created a Compute Pool inline with
deletionPolicy: "orphan", the Compute Pool remains. Delete it separately if it is no longer needed.kubectl delete computepool <name> --namespace <project-namespace>
Next Steps
After you create an App Deployment, you can Expose App Deployments to make your application accessible. Review the App Deployments concepts page to understand how workloads are provisioned, and refer to Create and Manage Compute Pools to prepare infrastructure for future deployments.