ModelDeployment and operator configuration reference for Foundry Local

This article is a reference for the ModelDeployment CRD spec and status fields, the Model CRD spec and status fields, and the inference operator configuration settings.

ModelDeployment spec fields

Field Type Required Default Description
displayName string No — Human-readable deployment name.
model object Yes — Local model reference. Set exactly one of assetId, ref, or custom.
model.assetId string Conditional — Full asset ID from GET /api/v1/models, identifying an exact catalog model version and variant or a registered BYO artifact. Maximum 256 characters.
model.ref string Conditional — Name of a registered BYO Model resource in the same namespace.
model.custom object Conditional — Inline BYO artifact definition. Deployment automatically creates or reuses a matching Model registration.
model.custom.task string No — Task for an inline BYO model. For ONNX, use chat-completion, embeddings or automatic-speech-recognition.
workloadType string Yes — generative or predictive.
compute string Conditional — cpu or gpu. Required for inline BYO; can be resolved from model metadata for assetId or ref references.
replicas integer No 1 Number of pod replicas (1–100).
port integer No 8080 Container port (1024–65535).
resources.requests.cpu string No 100m CPU request.
resources.requests.memory string No 256Mi Memory request.
resources.limits.cpu string No 1000m CPU limit.
resources.limits.memory string No 1Gi Memory limit.
resources.limits.gpu integer No — Number of GPUs (0–8).
runtime string Conditional — Generative inference runtime: onnx-genai or vllm. Required for new generative inline BYO deployments; can be resolved from model metadata for assetId or ref references. vLLM requires GPU compute. Not used for predictive deployments.
platform string No generic generic or jetson. Use generic plus an ARM64 node selector for ARM64 CPU predictive BYO (preview). jetson is the NVIDIA Jetson Thor GPU path (preview): vLLM generative or inline predictive ONNX BYO, not generic ARM64 or CPU support.
runtimeClassName string No unset Pod RuntimeClass. For platform: jetson, an empty/omitted value defaults to nvidia; an explicit nonempty value is preserved. The RuntimeClass must already be configured. The Thor deployment path is available in preview.
guardrails.enabled boolean No -- Guardrails is available in preview. Omitted value means inherit the installation setting, not unconditionally false. An explicit false disables screening for that deployment. An explicit true requires a reachable, trusted Guardrails service; it does not provision one by itself.
vllm object No - vLLM-specific configuration. Only used when runtime: vllm.
vllm.realtime boolean No false Set to true to enable live speech recognition at /v1/realtime. Requires runtime: vllm, compute: gpu and a compatible live-transcription model.
vllm.preferences object No - vLLM engine argument overrides (open schema). See vLLM planner documentation
vllm.preferences.language_model_only boolean No Model/policy-dependent Set to false when required to enable image or audio input in chat with a compatible vLLM model. The administrator must allow user-supplied preferences through operatorConfig.vllm.allowPreferences.
vllm.modelCacheStorageGi integer No 100 Size of the model cache PVC in GiB (minimum 1). Increase this value for large models that exceed the 100-GiB default. See Configure model cache storage.
nodeSelector object No — ARM64 model-serving support is available in preview. Node labels for scheduling. ARM64 CPU requires kubernetes.io/arch: arm64 explicitly. platform: jetson supplies that architecture label and rejects a conflicting architecture; additional selectors are preserved. The architecture selector alone does not distinguish Thor from other ARM64 hardware.
skipGpuResource boolean No false Skip the nvidia.com/gpu limit. Requires nodeSelector when set to true.
tolerations array No — Pod tolerations.
env array No — Environment variables for the model container.
authenticationMethods array No — Additional data-plane authentication methods for this deployment. Omitting this field preserves existing behavior.
authenticationMethods[].method string Yes — Authentication method. Currently supports serviceAccountToken.
authenticationMethods[].enabled boolean No true Enables or disables the authentication method.
authenticationMethods[].roles array Conditional — Required when serviceAccountToken is enabled. Contains role and subject assignments.
authenticationMethods[].roles[].role string No (defaulted) GeneralInferenceUser SAT role assigned to the listed ServiceAccount objects.
authenticationMethods[].roles[].authorizedSubjects array Yes — ServiceAccount objects that receive the role.
authenticationMethods[].roles[].authorizedSubjects[].serviceAccountName string Yes — Caller ServiceAccount name.
authenticationMethods[].roles[].authorizedSubjects[].serviceAccountNamespace string Yes — Caller ServiceAccount namespace. It can differ from the ModelDeployment namespace.
endpoint.exposure string No internal Exposure mode for the Gateway API HTTPRoute. One of internal (route through the cluster-internal Gateway — the default when exposure is unset or when endpoint is omitted entirely), external (also attach the route to the external LoadBalancer Gateway), or none (no HTTPRoute; ClusterIP Service only). The legacy endpoint.enabled field is honored only when exposure is not set.
endpoint.enabled boolean No false Deprecated. Retained for backward compatibility. When true and exposure is unset, the operator treats it as exposure: internal. New deployments should use exposure directly.
endpoint.host string No — Hostname used by the HTTPRoute for host-based routing. Optional — leave unset to match on path only.
endpoint.path string No /<deployment-name> URL path prefix served by the HTTPRoute. The operator matches with PathPrefix semantics.
endpoint.rewritePath string No / Target path the prefix is rewritten to before forwarding to the backend. Replaces the old nginx rewrite-target annotation.
endpoint.gatewayAnnotations object No — Implementation-specific annotations applied to the HTTPRoute (for example, Istio networking.istio.io/* overrides).
endpoint.ingressClassName string No — Deprecated and ignored. Was used to select the nginx IngressClass; no longer in the data path.
endpoint.annotations object No — Deprecated and ignored. Was used to pass nginx Ingress annotations; replaced by endpoint.gatewayAnnotations.
endpoint.tls.enabled boolean No false Enable TLS for the per-deployment route. When false, TLS is still terminated by the Gateway listener using its own certificate.
endpoint.tls.secretName string Conditional — Name of a kubernetes.io/tls secret in the same namespace. Required when endpoint.tls.enabled: true.
vllm.epp.enabled boolean No replica-based Enable Endpoint Picker (EPP) intelligent routing for this vLLM deployment. If unset, defaults to true when replicas > 1 and false when replicas == 1. An explicit value (true or false) always wins. The default re-evaluates on scaling: a deployment created at one replica with the field unset brings up the EPP stack the moment it is scaled to two or more, and tears it down again on scale-back. Requires runtime: vllm, the Gateway API Inference Extension CRDs, and Istio configured with pilot.env.ENABLE_GATEWAY_API_INFERENCE_EXTENSION=true. See Inference-aware routing with the Endpoint Picker (EPP).

For catalog deployments, copy the full assetId of the required version and variant from GET /api/v1/models. Runtime and compute can be omitted; if supplied, they must match the selected catalog entry. New manifests must use model.assetId, not model.catalog name/version selectors.

For a registered BYO model, set model.assetId to its oci:// asset ID, or set model.ref to the Model resource's name. The deployment inherits compute and, for generative workloads, runtime from the registration, so you don't need to repeat these settings. Explicitly supplied values must match the registration.

For inline generative BYO deployments using model.custom, set both compute and runtime explicitly. For predictive BYO deployments, set workloadType: predictive; inline predictive deployments also require compute. Omit runtime from predictive ModelDeployments.

Chat, text embeddings and speech recognition use workloadType: generative. Predictive models use workloadType: predictive with ONNX on CPU or GPU and require BYO models. Set model.custom.task for an inline ONNX BYO model or capabilities.task on a named Model. Catalog models provide their task metadata. For vLLM, use a compatible model for the selected task; image and audio input in chat use the chat completions API. ARM64 model-serving support is available in preview. On ARM64, ONNX is supported only for predictive BYO; use vLLM for generative GPU deployments. See ARM64 workload support (preview).

Thor memory defaults

These defaults apply to the NVIDIA Jetson Thor GPU deployment path, which is available in preview.

For platform: jetson with compute: gpu, when both memory request and limit are omitted, the operator defaults generative workloads to 16 GiB request / 24 GiB limit and predictive workloads to 4 GiB request / 6 GiB limit. These are starting defaults, not measured model minimums. User memory settings take precedence; if either is supplied, the operator does not fill in the other with the Thor pair. Thor unified CPU/GPU memory counts against the pod limit. Generic 256-MiB/1-GiB defaults in the field table are not Thor GPU defaults.

Kubernetes service account token roles

Role Allowed requests
GeneralInferenceUser GET and POST data-plane requests to the selected ModelDeployment.

GeneralInferenceUser is currently the only supported SAT role. For setup examples, see Configure Kubernetes service account token authentication.

Annotation migration

The nginx Ingress annotations that earlier releases honored on endpoint.annotations are no longer applied. Replace them with the Istio Gateway API equivalents on endpoint.gatewayAnnotations, the per-deployment HTTPRoute spec, or the cluster-wide external Gateway:

Old nginx annotation New mechanism
nginx.ingress.kubernetes.io/rewrite-target: /$2 spec.endpoint.rewritePath: "/" (default already strips the prefix).
nginx.ingress.kubernetes.io/proxy-body-size Configured on the Gateway listener via Istio EnvoyFilter, or on the route via gatewayAnnotations.
nginx.ingress.kubernetes.io/proxy-read-timeout / proxy-send-timeout endpoint.gatewayAnnotations.networking.istio.io/timeout (Istio HTTPRoute timeout extension), or spec.timeouts.request on the HTTPRoute when emitted.
nginx.ingress.kubernetes.io/configuration-snippet Not portable. Express the intent as Istio VirtualService, EnvoyFilter, or BackendTLSPolicy.
cert-manager.io/cluster-issuer Not applicable — the operator issues certificates via cert-manager Certificate resources owned by the Gateway, not the HTTPRoute.

GPU configuration examples

GPU with skip GPU resource:

spec:
  compute: gpu
  skipGpuResource: true
  nodeSelector:
    kubernetes.io/gpu-partition: "1g.5gb"

Note

To use skipGpuResource: true, set nodeSelector.

GPU with node selector and tolerations:

spec:
  compute: gpu
  nodeSelector:
    accelerator: nvidia-a100
  tolerations:
    - key: nvidia.com/gpu
      operator: Exists
      effect: NoSchedule

Configure model cache storage

The model cache persistent volume claim (PVC) defaults to 100 GiB. Large models, such as magistral, can exceed this size, so set spec.vllm.modelCacheStorageGi to a higher value when you deploy them. This field applies only to deployments that use runtime: vllm.

spec:
  compute: gpu
  runtime: vllm
  vllm:
    modelCacheStorageGi: 200

ModelDeployment status fields

Field Type Description
state string Deployment state: Pending, Creating, Running, Updating, Error, or Terminating.
message string Human-readable status message.
replicas.desired integer Desired number of replicas.
replicas.ready integer Number of ready replicas.
replicas.available integer Number of available replicas.
readyReplicas integer Deprecated. Use replicats.ready instead.
deploymentReady boolean true when all replicas are ready.
serviceReady boolean true when the Service resource is created.
internalEndpoint string Internal cluster endpoint URL.
endpointReady boolean 'true' when the HTTPRoute is created and the parent Gateway has marked it Accepted.
httpRouteReady boolean true when the HTTPRoute resource exists and is bound to the internal Gateway. Mirrors endpointReady for clarity in Gateway API mode.
externalEndpoint string External URL when exposure: external is set (populated once the external Gateway has assigned a LoadBalancer address).
resolvedModel.name string Resolved model name.
resolvedModel.assetId string Full asset ID of the resolved catalog model or registered BYO artifact, when available.
resolvedModel.alias string Catalog alias, when available.
resolvedModel.version string Resolved model version, when available.
resolvedModel.runtime string Resolved inference runtime.
resolvedModel.compute string Resolved compute type.
resolvedModel.variant string Selected variant ID.
resolvedModel.image string Container image used for this deployment.
authentication.keysSecretName string Name of the secret containing API keys.
conditions array Detailed status conditions.
lastUpdated datetime Timestamp of last status update.

Model CRD spec fields

The Model CRD registers BYO (custom) models and their artifact address, credentials reference, metadata, runtime, and compute. Registration alone does not download artifacts or start an inference endpoint. Catalog models do not use Model resources; deploy them through spec.model.assetId in a ModelDeployment.

Field Type Required Description
displayName string No Human-readable model name.
description string No Model description.
publisher string No Model publisher.
license string No License identifier.
licenseUrl string No URL to the full license text.
source object Yes BYO source configuration containing custom.
source.custom object Yes OCI artifact address and registry credentials reference.
source.custom.registry string Yes OCI registry host.
source.custom.repository string Yes Repository path in the registry.
source.custom.tag string Yes Artifact tag.
source.custom.credentials.secretRef.name string Yes Name of the Kubernetes Secret containing registry credentials.
variants array No Hardware-specific variant overrides.
requirements object No Resource requirements.
capabilities object No Model capabilities.
capabilities.task string No Task for a named Model. For ONNX, use chat-completion, embeddings or automatic-speech-recognition.
runtime string Yes onnx-genai or vllm. Required for new registrations, including predictive models. vLLM requires GPU compute.
compute string Yes cpu or gpu. Required for new registrations, including predictive models.

Model CRD status fields

Available means the BYO registration is available for deployment. It does not mean model artifacts have been downloaded or an inference endpoint is running.

Field Type Description
phase string Model phase: Pending, Available, or Error.
message string Human-readable status message.
conditions array Detailed status conditions.
lastUpdated datetime Timestamp of last status update.

Inference operator configuration

The inference operator reads its configuration from a ConfigMap mounted at /etc/inference-operator/config.yaml.

Configuration file example

# Container registry for inference images
registry: "myregistry.azurecr.io"

# Container images for different workload types
images:
  generative_cpu:
    repository: generative-cpu
    tag: "latest"
  generative_gpu:
    repository: generative-gpu
    tag: "latest"
  predictive_cpu_oras:
    repository: predictive-cpu-byo
    tag: "latest"
  predictive_gpu_oras:
    repository: predictive-gpu-byo
    tag: "latest"
  Vllm_gpu:
    repository: vllm-server
    tag: "latest"
# Gateway API networking defaults 
networking: 
  internalGateway: 
    gatewayName: inference-internal-gateway 
    gatewayClassName: istio 
    listenerName: https 
  externalGateway: 
    gatewayName: inference-external-gateway 
    gatewayClassName: istio 
    serviceType: LoadBalancer 
    listenerName: https 
    port: 443 
    # Annotations forwarded to the auto-created LoadBalancer Service. 
    # Default points the Azure LB health probe at Istio's /healthz/ready 
    # on port 15021 so the gateway's "404 on GET /" does not mark 
    # backends unhealthy. 
    annotations: 
      networking.istio.io/service-annotations: | 
        { 
          "service.beta.kubernetes.io/azure-load-balancer-health-probe-request-path": "/healthz/ready", 
          "service.beta.kubernetes.io/port_443_health-probe_port": "15021", 
          "service.beta.kubernetes.io/port_443_health-probe_protocol": "http" 
        } 
    tls: 
      # Customer-supplied TLS secret for external traffic termination. 
      # Leave empty to auto-issue from the internal CA. 
      secretName: "" 
  # EPP (Endpoint Picker) — shared infrastructure config used by every 
  # vLLM deployment that opts in via spec.vllm.epp.enabled. 
  epp: 
    image: 
      repository: mcr.microsoft.com/oss/v2/gateway-api-inference-extension/epp 
      tag: v1.3.1 
    replicas: 1 
    resources: 
      requests: { cpu: 250m, memory: 512Mi } 
      limits:   { cpu: "2",  memory: 2Gi } 
    targetPort: 8443 
    metricsDataSource: 
      scheme: https 
      insecureSkipVerify: true 
# Catalog settings
catalog:
  configmapName: "foundry-local-catalog"
  configmapNamespace: "foundry-local-operator"

Configuration fields

Field Type Default Description
registry string "" Container registry prefix for inference images.
images.<type>.repository string Varies by workload type Image repository path. Types: generative_cpu, generative_gpu, generative_cpu_oras, generative_gpu_oras, predictive_cpu_oras, predictive_gpu_oras, vllm_gpu.
images.<type>.tag string latest Image tag.
networking.internalGateway.gatewayName string inference-internal-gateway Name of the cluster-internal Gateway the operator attaches HTTPRoutes to.
networking.internalGateway.gatewayClassName string istio GatewayClass to use. Must match an installed Gateway API provider.
networking.internalGateway.listenerName string https Listener (section) name on the internal Gateway.
networking.externalGateway.gatewayName string inference-external-gateway Name of the external Gateway created on demand when any deployment uses exposure: external.
networking.externalGateway.gatewayClassName string istio GatewayClass for the external Gateway.
networking.externalGateway.port integer 443 Port on the external LoadBalancer Service.
networking.externalGateway.annotations object (Azure LB health probe defaults) Annotations applied to the external Gateway, including networking.istio.io/service-annotations for cloud-provider Service settings.
networking.externalGateway.tls.secretName string "" TLS secret for external listener termination. Empty means auto-issue from the internal CA when global TLS is enabled.
networking.epp.image.repository / .tag string mcr.microsoft.com/oss/v2/gateway-api-inference-extension/epp / v1.3.1 Container image used for every EPP instance.
networking.epp.replicas integer 1 Number of EPP pod replicas per deployment that opts in.
networking.epp.resources object (250m / 512Mi requests, 2 / 2Gi limits) Resource requests/limits for each EPP pod.
networking.epp.targetPort integer 8443 Pod port on the vLLM backend that EPP-selected traffic is forwarded to.
networking.epp.metricsDataSource.scheme string https Scheme used to scrape vLLM metrics for scoring.
networking.epp.metricsDataSource.insecureSkipVerify boolean true Skip TLS verification on metrics scrape. Keep true when the vLLM sidecar uses a self-signed cert from the internal CA.
catalog.configmapName string foundry-local-catalog Name of the catalog ConfigMap.
catalog.configmapNamespace string foundry-local-operator Namespace of the catalog ConfigMap.

Kubernetes service account token deployment settings

These settings apply to the Foundry Local installation. They aren't ModelDeployment fields.

Field Type Default Description
satAuth.enabled boolean true Enables support for ModelDeployments that opt in to SAT authentication.
satAuth.audience string foundry-local Audience required on accepted Kubernetes service account tokens.