Configuration
These are the Helm chart’s configurable values. Override them with --set <key>=<value> or a values file (-f values.yaml) at install or upgrade time.
When installed through tt-operator,
the same keys apply under a tt-fabric-manager. prefix.
For bare-metal and Docker deployments the chart is not involved; edit the YAML config file directly, as described in the configuration reference.
Image
Key |
Default |
Description |
|---|---|---|
|
|
Image used by both the controller and the agent |
|
chart |
Image tag |
|
|
Image pull policy |
|
|
Pull secrets that already exist in the install namespace |
|
Override the chart name used in resource names |
|
|
Override the full release name used in resource names |
|
|
Create a ServiceAccount for the pods |
|
|
Name of the ServiceAccount to create or use |
Scaleout configs (FSDs)
Factory System Descriptors are supplied to both pods, mounted read-only at
/scaleout_configs, from one of two sources:
Key |
Default |
Description |
|---|---|---|
|
|
Host directory holding the FSDs. Ignored when |
|
|
OCI image whose filesystem provides the FSDs, mounted as a Kubernetes image volume instead of the host path, e.g. |
The image volume route requires the ImageVolume feature (beta and on by default
since Kubernetes 1.33). Pulls reuse the pod’s imagePullSecrets through the
service account.
Mounting the configs is not enough on its own — point
controller.factorySystemDescriptorSearchPath at a path inside the mount to
actually enable the FSD-backed features.
Controller
Key |
Default |
Description |
|---|---|---|
|
|
Replica count. The controller holds topology state in memory, so treat it as stateful and leave this at 1 |
|
unset |
Path searched for FSD textprotos, normally under |
|
unset |
Path to a Physical Grouping Descriptor, giving the mapper hardware-specific tray layout knowledge |
|
|
Shapes that |
|
|
Container resource requests and limits |
|
|
Readiness probe |
|
unset |
Liveness probe |
|
|
Node selector |
|
|
Affinity rules |
|
|
Tolerations |
|
|
Extra pod annotations |
|
|
Extra pod labels |
|
|
Pod security context |
|
|
Container security context |
The controller always serves gRPC on port 50052, and its heartbeat timings are fixed by the chart (60s interval, 90s timeout, 120s reconnect grace). These are not exposed as values; change them by templating your own ConfigMap if you need to.
CPU requirement
The controller links tt-metalium, which is compiled for the x86-64-v3
microarchitecture level: AVX, AVX2, BMI1, BMI2, FMA, F16C, LZCNT and MOVBE. Those
instructions run in libtt_metal’s static initializers, before main, so a
controller scheduled onto a node that lacks them dies immediately on SIGILL —
container exit code 132, no log output, CrashLoopBackOff. Common triggers are
a pre-Haswell host in an otherwise modern pool, a hypervisor or cloud instance
exposing a generic CPU model that masks AVX2/BMI2, and running the amd64 image on
arm64 under emulation.
The agent shares the same dependency but only runs on accelerator hosts, so in
practice this bites the controller, which is normally scheduled away from them.
Where the controller can land on a heterogeneous pool, constrain it with a required
controller.affinity node affinity. If Node Feature Discovery’s cpu source is
enabled, key on feature.node.kubernetes.io/cpu-cpuid.AVX2 directly. If it is not
— as in values.exabox.yaml, where NFD publishes only pci-* labels — there is no
CPU feature label to require, and pinning to known-good hosts by
kubernetes.io/hostname is the honest fallback. Either way, a pod left Pending
with an unsatisfied node affinity is far easier to diagnose than a silent crash
loop.
To confirm a suspected node, compare the dynamic loader’s view against the ISA level:
/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 --help | grep 'x86-64-v'
grep -o -E 'avx2|bmi2|fma' /proc/cpuinfo | sort -u
Web UI
See Web UI & HTTP API for what these expose.
Key |
Default |
Description |
|---|---|---|
|
|
Serve the HTTP JSON API and web UI alongside gRPC |
|
|
Container port for the HTTP server |
|
|
Static UI assets inside the image. Set to |
Warning
The HTTP endpoint is unauthenticated. Only expose it on trusted networks.
Agent
The agent runs as a privileged DaemonSet, registering under the node name as its host ID and advertising its pod IP on port 50053.
Key |
Default |
Description |
|---|---|---|
|
|
Overrides the default node targeting (see below) |
|
Legacy node selector. Still honoured, but ANDs with whatever affinity is in effect |
|
|
|
Tolerations |
|
|
Container resource requests and limits |
|
|
Liveness probe |
|
|
Readiness probe |
|
Extra arguments appended to the agent command, e.g. |
|
|
Additional volumes and mounts |
|
|
|
Extra pod annotations |
|
|
Extra pod labels |
|
|
Pod security context |
|
|
Container security context. The container always runs privileged, as UMD needs PCI config space access |
By default the DaemonSet lands on every Tenstorrent-equipped node, matching the
union of tenstorrent.com/has-tt=true (applied manually, e.g. via tt-ansible)
and feature.node.kubernetes.io/pci-1200_1e52.present=true (applied
automatically by NFD). Setting agent.affinity replaces that whole expression.
Run tt-fabric-manager-agent --help for the flags you can pass through
agent.extraArgs; the configuration reference covers the
config-file keys instead.
OpenTelemetry
Key |
Default |
Description |
|---|---|---|
|
|
Emit OTEL logs, traces, and metrics from the controller |
|
|
Reported service name |
|
|
Reported deployment environment |
|
|
Metric export interval |
Telemetry currently goes to stdout in OStream/OTLP-style format, so pair it with a sidecar Collector or stdout scraping until OTLP/gRPC export lands.
Ingress
Two independent Ingress objects, because the gRPC backend needs HTTP/2 while the
UI is plain HTTP. Both share the ingress controller’s external ports (80/443) and
are routed by Host header, so they need distinct hostnames.
Key |
Default |
Description |
|---|---|---|
|
|
Ingress for the external gRPC endpoint |
|
|
Hostname for the gRPC endpoint |
|
|
Ingress class |
|
|
Ingress annotations |
|
|
TLS configuration |
|
|
Time to establish a connection to the controller |
|
|
Time the proxy waits for the controller to start responding |
|
|
How long an idle backend connection is kept |
|
|
Ingress for the web UI. Requires |
|
|
Hostname for the web UI |
|
|
Ingress class for the UI |
|
|
Ingress annotations for the UI |
|
|
TLS configuration for the UI |
Enabling ingress also creates a Traefik ServersTransport carrying those
forwarding timeouts, which the gRPC Ingress references by annotation. The UI
Ingress does not use it, so the web UI keeps the ingress controller’s own
defaults.
The timeouts used to be 900s, because a placement ran inside a single blocking RPC and every hop of the stack therefore had to outlive a whole solve. Placement is now a long-running operation that the client starts and polls, so no request stays open for longer than an ordinary RPC and these are sized accordingly.
Raise responseHeaderTimeout if callers still use the blocking
GetValidPlacementsMGD — which is what tt-fabric-manager-cli --sync sends —
since that holds one request open for as long as the solve takes.
Example
controller:
factorySystemDescriptorSearchPath: /scaleout_configs/mysite/factory_system_descriptor.textproto
web:
enabled: true
ingress:
enabled: true
host: ttfm.example.com
ui:
enabled: true
host: ttfm-ui.example.com
Site-specific values files live alongside the chart, for example
values.exabox.yaml.