Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
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. |