Deploy a Gaia worker with Helm
Deploy a yasp-eval worker on a Kubernetes cluster from the published yasp-eval-worker chart.
Use this for a GPU cluster or a fleet; for a single host use the Docker deploy instead.
Run these from a machine with kubectl/helm configured for the target cluster and yasp-agent installed. Fill each <…> from your cluster.
1. Get a registry key
The chart pull and the image pull both authenticate with a registry key. Get yours and export it as REGISTRY_KEY, with your API key in YASP_API_KEY.
2. Add the chart repository
helm repo add yasp-public https://nexus.yasp.ai/repository/helm/ --username token --password "$REGISTRY_KEY"
helm repo update yasp-public
3. Create the cluster Secrets
Set your context and namespace, then create the image-pull Secret (one chart-level imagePullSecrets covers both the controller and the per-task Job pods):
export CTX=<kube-context>; export NS=<namespace>
kubectl --context="$CTX" create namespace "$NS" --dry-run=client -o yaml | kubectl --context="$CTX" apply -f -
kubectl --context="$CTX" -n "$NS" create secret docker-registry yasp-nexus-pull \
--docker-server=docker.yasp.ai --docker-username=token --docker-password="$REGISTRY_KEY" \
--dry-run=client -o yaml | kubectl --context="$CTX" apply -f -
Store a Gaia (eval) long-lived worker register key (~6 months) so the worker can register.
export GAIA_WORKER_KEY=$(yasp-toolkit eval key)
export GAIA_WORKER_KEY=$(curl -fsS -X POST \
-H "Authorization: Bearer $YASP_API_KEY" -G \
--data-urlencode "audience=eval-api" \
--data-urlencode "scope=eval-register" \
"https://compile.yasp.ai/api/token")
kubectl --context="$CTX" -n "$NS" create secret generic yasp-eval-register-key \
--from-literal=token="$GAIA_WORKER_KEY" \
--dry-run=client -o yaml | kubectl --context="$CTX" apply -f -
Alternatively, you can continue to use your API key:
kubectl --context="$CTX" -n "$NS" create secret generic yasp-eval-register-key \
--from-literal=token="$YASP_API_KEY" \
--dry-run=client -o yaml | kubectl --context="$CTX" apply -f -
4. Install the chart
One release number drives both the chart and the image — the yasp-toolkit registry
helm-version command below prints it. The chart --version and the image tag are the same
value (no v prefix). The eval chart uses a single image.repository containing the full
registry path, and two router URLs:
router.evalApiBase— the Eval router the worker registers against (https://compile.yasp.ai/eval).auth.apiHost— the platform API used for token exchange (https://compile.yasp.ai/api).
List the exact GPU product labels on the cluster's nodes — the value for
job.nodeSelector.nvidia.com/gpu.product:
kubectl --context="$CTX" get nodes \
-o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.metadata.labels.nvidia\.com/gpu\.product}{"\n"}{end}'
Then install:
export VERSION=$(yasp-toolkit registry helm-version yasp-eval-worker --latest)
helm --kube-context="$CTX" upgrade --install <release> yasp-public/yasp-eval-worker \
--version "$VERSION" \
--namespace "$NS" \
--set router.evalApiBase=https://compile.yasp.ai/eval \
--set auth.apiHost=https://compile.yasp.ai/api \
--set auth.existingSecret=yasp-eval-register-key \
--set auth.secretKey=token \
--set image.repository=docker.yasp.ai/yasp-eval/<nvidia|amd> \
--set image.tag="$VERSION" \
--set 'imagePullSecrets[0].name=yasp-nexus-pull' \
--set 'worker.tags.host=<gpu-node>' \
--set "worker.tags.version=$VERSION" \
--set "worker.tags.last_update=$(date +%F)" \
--set job.gpu.enabled=true --set job.gpu.resourceKey=nvidia.com/gpu --set job.gpu.count=1 \
--set 'job.nodeSelector.nvidia\.com/gpu\.product=<EXACT-GPU-PRODUCT-LABEL>' \
--set job.runtimeClassName=nvidia \
--set-json 'job.tolerations=[{"key":"nvidia.com/gpu","operator":"Exists","effect":"NoSchedule"}]'
The chart is now stored in the release, so you can drop the repo entry: helm repo remove
yasp-public.
Per-cluster knobs to validate rather than assume:
job.runtimeClassName— set to the cluster's NVIDIA RuntimeClass (commonlynvidia) only ifnvidiais not already the nodes' default runtime.controller.replicaCount— set equal to the number ofnvidia.com/gpuunits on the node (MIG slices or multiple cards) so each GPU gets its own worker registration.- GPU name auto-detects — leave
worker.gpuNameunset; the worker runs ayasp-eval detectJob on first registration. worker.tags.routing=<name>— registers the worker in a separate routing pool for testing instead of the shared stable pool.
5. Verify
kubectl --context="$CTX" -n "$NS" rollout status deploy/<release>-yasp-eval-worker --timeout=600s
kubectl --context="$CTX" -n "$NS" logs deploy/<release>-yasp-eval-worker --tail=20 \
| grep -iE 'API Key OK|worker_registered'
yasp-toolkit eval workers
Agent-assisted deploy and upgrades
From the yasp shell the deploy-eval-worker-helm skill automates this flow, and
upgrade-helm-releases bumps existing releases to the latest version across the cluster.