Wingsmith
Configuration

Operator Configuration

HANGAR_* variables for operator: hub connection, namespaces, read-only mode, DCGM, pools, fabric.

The operator is configured entirely through environment variables. Three are required: cluster ID, hub URL, and enrolment token.

Required

VariableDescription
HANGAR_CLUSTER_IDThe plane-assigned cluster id
HANGAR_HUB_URLwss:// hub address; ws:// only with HANGAR_HUB_ALLOW_INSECURE=true
HANGAR_ENROLMENT_TOKENThe cluster’s enrolment token

Hub connection

VariableDefaultDescription
HANGAR_HUB_ALLOW_INSECUREfalseAccept a ws:// hub URL, which sends the token in the clear; local development only
HANGAR_HUB_CA_FILEnonePEM bundle for verifying the hub
HANGAR_HUB_INSECURE_SKIP_VERIFYfalseSkip TLS verification; local development only, logs a warning at startup
HANGAR_HEARTBEAT_INTERVAL10sApplication-level ping interval
HANGAR_LIVENESS_TIMEOUT30sSilence tolerated before redialling; must exceed the interval
HANGAR_BACKOFF_MIN / HANGAR_BACKOFF_MAX1s / 30sReconnect backoff, full jitter

Namespaces

VariableDefaultDescription
HANGAR_NAMESPACEhangar-systemWhere the custom resources and the lease live
HANGAR_WORKLOAD_NAMESPACEdynamoWhere rendered workloads and prefetch jobs go

Read-only mode

VariableDefaultDescription
HANGAR_READ_ONLYfalseObserve and report only: no reconciler runs and operations are refused
HANGAR_ALLOWED_OPERATIONSnoneOperation kinds a read-only operator still runs, comma-separated

A read-only operator has no reconciler to tear anything down. It runs one small controller that removes the finalizer from any declaration being deleted and leaves anything rendered in place.

On a managed cluster all three operation types (cordon, drain, benchmark) are allowed. On a read-only cluster they come from HANGAR_ALLOWED_OPERATIONS (empty by default, so none).

DCGM scraping

VariableDefaultDescription
HANGAR_DCGM_ENDPOINTin-cluster exporterWhere device identity is scraped
HANGAR_DCGM_SELECTORnonePod label selector for DCGM exporters
HANGAR_DCGM_TIMEOUT5sScrape timeout

The operator scrapes DCGM’s Prometheus metrics for device identity (UUIDs), device classes, topology domains, and health.

Pools and placement

VariableDefaultDescription
HANGAR_POOL_LABEL_KEYhangar.dev/poolNode label workers are placed by
HANGAR_GPU_POOL_VALUEgpuValue for the GPU pool
HANGAR_CACHE_POOL_VALUEcacheValue for the weight download pool

Tolerations and taints

VariableDefaultDescription
HANGAR_GPU_TOLERATION_KEYnvidia.com/gpuThe taint GPU workers tolerate
HANGAR_GPU_TOLERATION_VALUEnoneValue for the GPU toleration; no value tolerates any value of the key
HANGAR_CACHE_TAINT_KEYhangar.dev/cacheTaint key for weight download nodes
HANGAR_CACHE_TAINT_VALUEnoneValue for the cache taint

Prefetch (weight downloads)

VariableDefaultDescription
HANGAR_MODEL_CACHE_PVCmodel-cacheWhere weights are cached
HANGAR_LOCAL_MODEL_CACHE_DIRnoneLocal model cache directory
HANGAR_PREFETCH_CPUnonePrefetch job CPU request
HANGAR_PREFETCH_MEMORYnonePrefetch job memory request
HANGAR_PREFETCH_MEMORY_LIMITnonePrefetch job memory limit

The operator prefetches model weights with a Job before any worker starts. Weights are cached on a ReadWriteMany PVC mounted by name.

Images

VariableDefaultDescription
HANGAR_ENGINE_PULL_SECRETSnoneImage pull secrets for engine workers
HANGAR_ALLOWED_IMAGE_PREFIXESnoneRegistries or repositories every engine, frontend, and prefetch image must come from; empty allows any

HANGAR_ALLOWED_IMAGE_PREFIXES is a security boundary. When set, the operator refuses any image that does not start with one of the listed prefixes before creating an object.

Frontend

VariableDefaultDescription
HANGAR_FRONTEND_ENABLEDfalseRender one frontend per model
HANGAR_FRONTEND_IMAGEnoneThe frontend’s image
HANGAR_FRONTEND_REPLICAS2Frontend replica count
HANGAR_FRONTEND_PULL_SECRETSnoneFrontend image pull secrets
HANGAR_FRONTEND_CPUnoneFrontend CPU request
HANGAR_FRONTEND_MEMORYnoneFrontend memory request
HANGAR_FRONTEND_MEMORY_LIMITnoneFrontend memory limit
HANGAR_FRONTEND_ANTHROPIC_APItrueServe /v1/messages
HANGAR_FRONTEND_ANTHROPIC_STRIP_PREAMBLEtrueDrop a fixed client preamble so the prefix cache can hit
HANGAR_FRONTEND_GLOBAL_DYNAMO_NAMESPACEtruePut each graph’s frontend and workers in the shared Dynamo namespace; false gives each graph its own

Read only with HANGAR_FRONTEND_ENABLED. When true, the operator renders a Dynamo frontend into each model’s own graph.

Multi-node and fabric

VariableDefaultDescription
HANGAR_MULTINODEfalseAssert a leader-worker backend (Grove or LeaderWorkerSet) when discovery cannot see it
HANGAR_FABRICnoneRDMA fabric workers move KV over: empty, efa, or rdma
HANGAR_FABRIC_DEVICES0 (except efa)Interfaces per worker pod
HANGAR_FABRIC_RESOURCEvpc.amazonaws.com/efa under efaExtended resource for the fabric
HANGAR_FABRIC_PRIVILEGEDtrue under efa, else falseRun fabric workers privileged with host IPC
HANGAR_EFA_DEVICESnoneLegacy alias for HANGAR_FABRIC=efa with that many devices; refused alongside the new keys
HANGAR_NIXL_BACKENDSnoneNIXL plugins the KV connector registers; LIBFABRIC on EFA

For AWS EFA:

HANGAR_FABRIC=efa
HANGAR_FABRIC_DEVICES=4
HANGAR_FABRIC_RESOURCE=vpc.amazonaws.com/efa
HANGAR_FABRIC_PRIVILEGED=true

For RDMA (requires setting the resource):

HANGAR_FABRIC=rdma
HANGAR_FABRIC_DEVICES=2
HANGAR_FABRIC_RESOURCE=rdma/hca

Benchmarks

VariableDefaultDescription
HANGAR_INFERENCE_ENDPOINTdiscoveredThe frontend a benchmark aims at
HANGAR_BENCHMARK_TIMEOUT30mBenchmark run timeout
HANGAR_BENCHMARK_CPU500mBenchmark job CPU request
HANGAR_BENCHMARK_MEMORY1GiBenchmark job memory request
HANGAR_BENCHMARK_IMAGESpinned aiperf and evalscope imagesHarness images a benchmark may run, matched exactly
HANGAR_BENCHMARK_TOKEN_SECRETnoneSecret in the workload namespace handed to benchmark jobs as environment, for a gated tokenizer
HANGAR_BENCHMARK_ARTIFACT_BASEnoneWhere raw benchmark records would be uploaded; nothing uploads yet

The operator runs benchmarks the plane sends as Jobs in the workload namespace. HANGAR_BENCHMARK_IMAGES is a security boundary: the operator refuses any harness image not on the list.

Observation and sync

VariableDefaultDescription
HANGAR_OBSERVE_INTERVAL30sObservation tick
HANGAR_OBSERVE_TIMEOUT60sObservation deadline
HANGAR_OBSERVE_STALE_AFTER5mReadiness fails when the last observation is older
HANGAR_RESYNC_INTERVAL15mHow often the whole observed inventory is restated, which retires objects the cluster no longer has
HANGAR_SEND_QUEUE_SIZE1024Outbound queue bound

Leader election and health

VariableDefaultDescription
HANGAR_LEADER_ELECTIONtrueController-runtime leader election
HANGAR_HEALTH_ADDR:8081/healthz, /readyz
HANGAR_METRICS_ADDR0Controller-runtime metrics; 0 disables

Run one replica. Leader election is on by default and guards against two operators running at once during a rollout. A replica waiting for the lease reports not ready because it holds no hub session.

Liveness is unconditional. Readiness carries the hub session and the observation loop: a partitioned operator is alive, because the cluster is meant to keep working when the plane is unreachable.

Logging

VariableDefaultDescription
HANGAR_LOG_LEVELinfoLog level
HANGAR_LOG_FORMATjsonLog format

The operator renders for NVIDIA GPUs only: workers request nvidia.com/gpu, and device identity comes from DCGM. Other accelerators are not supported.