Prerequisites
Before you deploy Self-Hosted Deployment
읽는 시간 8분최근 업데이트: 하루 전
Access to the container registry
Ensure that you have credentials for the Unity private container registry . Unity provides these credentials. You need this information to download shdctl, pull release packages, and sync container images and ORAS artifacts to your private registry.
uccmpprivatecloud.azurecr.ioTooling
Ensure that you have this tooling:
-
Access to a terminal, and basic knowledge of the command line
-
One of these tools if you use Microsoft Windows:
- Windows Subsystem for Linux (WSL)
- Git for Windows
-
ORAS CLI, for the shdctl install script, which downloads shdctl from the registry
-
Helm (version 3.9 or later), to install the Helm charts
-
kubectl, to interact with your Kubernetes cluster
-
Docker, to sync the container images to your private registry
-
ArgoCD (recommended), for continuous delivery via GitOps. If you choose the ArgoCD deployment method, install it in the target cluster before you deploy: shdctl applies a single bootstrapand ArgoCD takes over from there. Every application is created in the deployment namespace, so install ArgoCD in that namespace, or configure it to watch it: ArgoCD's "Applications in any namespace" needs the namespace in both its
Applicationsetting and theapplication.namespacesproject'sdefault. An ArgoCD that watches only its own namespace leaves the applications unsynced, and reports no error. If you deploy with Helm, you don't need ArgoCD at all.sourceNamespaces -
shdctl is the Unity CLI tool that manages the entire deployment lifecycle. Its install steps, requirements, and registry credential setup are in Install shdctl. If you used vpctl before, install shdctl 1.0.0 or later: vpctl can't pull Self-Hosted Deployment 2.0.0 or later.
Kubernetes
The deployment requires a Kubernetes cluster that you manage.
Use Kubernetes version 1.34 or later.
Your cluster must include at least 3 schedulable nodes in the general workloads pool. MongoDB (Percona Server for MongoDB) and RabbitMQ run as 3-replica clusters by default and place each replica on a different node by using on . PostgreSQL and Garage object storage also run 3 replicas by default, but don't require separate nodes. If your cluster has only two nodes, some pods remain in the state because the scheduler can't satisfy the anti-affinity requirement.
podAntiAffinitykubernetes.io/hostnamePendingStorage classes
The cluster must provide two storage classes:
- A default storage class for general-purpose persistent volumes (block storage), marked as the cluster default with the annotation. For example, a local-path provisioner, a SAN-backed CSI driver, or any block storage provisioner.
storageclass.kubernetes.io/is-default-class: "true" - A ReadWriteMany (RWX) storage class for shared volumes that multiple pods can mount simultaneously. For example, an NFS provisioner, a distributed filesystem, or any CSI driver that supports the access mode.
ReadWriteMany
In the manifest file, names the RWX class. names the class for Garage and the Unity Licensing Server only: every other ReadWriteOnce volume uses the cluster's default storage class, so the cluster must have one even if the manifest names a class.
configuration.kubernetes.storage.readWriteManyStorageClassdefaultStorageClassMetrics API
The cluster must serve the API, which the platform's horizontal pod autoscalers require. Most distributions provide it through . Without it, autoscaled workloads can't read their resource usage and don't scale.
metrics.k8s.iometrics-serverNamespaces
Services come preconfigured for use within a single Kubernetes namespace. You configure the target namespace in the manifest file.
Create the namespace before you deploy. The deployment doesn't create it for you.
Node pools
The platform separates general application workloads from asset transformation jobs. Configure your cluster with three node pools (or equivalent node groups):
Node pool | Node label | Taint | Recommended node size | Purpose |
|---|---|---|---|---|
| General workloads | None required | None | 8–32 vCPUs; compute, general-purpose, or memory-optimized instances | Application services, databases, messaging |
| Transformations | | None | 8–32 vCPUs and at least 64 GiB of memory; general-purpose or memory-optimized instances | Transformation workflow pods |
| Transformations (large) | | | 32–64 vCPUs and at least 256 GiB of memory; general-purpose or memory-optimized instances | Escalation pool for memory-intensive transformations; only pods that explicitly tolerate the taint are scheduled here |
Transformation steps request up to 32 GiB of memory on the pool, and their retries up to 220 GiB on the pool. A step that no node can fit stays until its workflow times out.
argocpuargocpu-largePendingThe exact mechanism to create node pools depends on your Kubernetes distribution (for example, static node labels, a node autoscaler, or a cluster API provider). If an autoscaler other than Karpenter scales the transformation pool from zero, reports the pool as missing while it is empty; that failure is expected.
shdctl cluster checkGPU nodes are optional. By default, transformation actions that can use a GPU run on the pool with a software renderer. If your cluster has GPU nodes that advertise the resource, for example through the NVIDIA device plugin, set in the manifest so that those actions request a GPU.
argocpunvidia.com/gpuconfiguration.overrides.automation-manager.values.env.vpcGpuAvailable: trueNetwork policies
During deployment to an existing cluster, you may need to control the flow of network traffic by using network policies. You can deploy most Kubernetes resources in a single namespace, which you can use to scope network isolation from other services that run in your cluster.
Clusters behind an HTTP proxy
If your AKS cluster sends its outbound traffic through an HTTP proxy (AKS HTTP proxy), AKS injects , and into every pod. Platform services call each other by their short Service names, which no entry matches, so those calls go to the proxy and fail.
HTTP_PROXYHTTPS_PROXYNO_PROXYNO_PROXYTo keep the platform pods off the proxy, add the AKS opt-out annotation to every pod in the manifest file. Nodes still pull images through the proxy, but the pods get no internet access:
configuration: kubernetes: podAnnotations: kubernetes.azure.com/no-http-proxy-vars: "true"
The automation-manager job pulls the release manifest from your registry itself, so it still needs the proxy. Unless your cluster reaches the registry without the proxy, pass it through the chart's overrides:
configuration: overrides: automation-manager: values: env: httpsProxy: http://<proxy>:<port> noProxy: .svc,.cluster.local,localhost,127.0.0.1
configuration.kubernetes.podAnnotationsThe in the release package can create such a cluster: sets the proxy, makes the API server private, and denies all other outbound traffic from the cluster's subnet. Its README describes each variable.
azure-baseline-exampleaks_http_proxyaks_private_cluster_enabledaks_egress_via_proxy_onlyWhat the proxy must allow
- AKS's own outbound traffic. Nodes bootstrap and keep running through the proxy, so it must allow the destinations in AKS outbound network and FQDN rules, for example and
mcr.microsoft.com.packages.aks.azure.com - Your container registry. Nodes pull every image through the proxy, and the automation-manager job reaches the registry through it too: the registry in , or
configuration.kubernetes.docker.repositoryif you pull from it directly. Allow the endpoints the registry serves image layers from as well; for Azure Container Registry, refer to Configure rules to access an Azure container registry behind a firewall.uccmpprivatecloud.azurecr.io - Requests from the nodes. Pod traffic reaches the proxy from its node's address, so allow the node subnet as a source.
- HTTP and HTTPS only. HTTPS goes through the proxy as on port 443, and plain HTTP on port 80. Outbound traffic that isn't HTTP, such as SMTP or SSH, has no path through the proxy.
CONNECT - TLS inspection. If the proxy decrypts HTTPS, give the cluster its CA certificate (in the AKS HTTP proxy configuration). The certificates must use subject alternative names.
trustedCa
Container registry
By default, the platform pulls container images directly from the Unity source registry (). This is the simplest setup and doesn't require a separate registry.
uccmpprivatecloud.azurecr.ioIf your environment is air-gapped or if you need full control over artifact distribution, you can mirror artifacts to your own private container registry. Any OCI-compliant registry is supported, for example Harbor, JFrog Artifactory, or a cloud-managed registry such as Amazon ECR or Azure Container Registry. Use these commands to mirror artifacts from the Unity source registry to your private registry:
- : this command syncs the Docker container images.
shdctl artifact sync images - : this command syncs the ORAS artifacts, for example, the Pixyz workflow templates.
shdctl artifact sync oras - : this command checks that your registry holds every image your manifest needs.
shdctl artifact sync verify
System requirements
Ensure that you have these elements:
-
A valid hostname that can be updated to point to the IP of the load balancer
-
A valid Unity Version Control (UVCS) license to run the UVCS server
-
A valid Unity Asset Transformer SDK license to run transformations on assetsA valid Unity Asset Transformer license is required for all users who perform asset transformations. The platform uses static licenses, so a floating license server is not required.
Validate your cluster
Once your exists, check the prerequisites on this page automatically. The command reads the namespace, the storage classes, and the ArgoCD settings from the manifest, and step 3 of the deployment runs it:
manifest.yamlshdctl cluster check
The command verifies:
- The Kubernetes version.
- The number of schedulable nodes.
- The transformation node pools.
- The storage classes.
- The target namespace.
- The metrics API.
- The in-cluster ArgoCD installation if your manifest configures ArgoCD. On the Helm deployment path, these checks are skipped.
The command reads from the cluster and doesn't change it. It prints a remediation hint for anything that doesn't pass.
Add to verify that each storage class can provision a volume, including support.
--probe-storageReadWriteManyFor the full list of checks and options, refer to shdctl cluster command.