llm.completion.mode (external | inCluster). Embeddings are Qwen 1024 only and run through the in-cluster vLLM/TEI-compatible embedding path.
For AWS EKS enterprise deployments, the recommended in-cluster shape is:
- Completions: vLLM serves
Qwen/Qwen3.5-9Bbehindvllm-instruction. - Embeddings: TEI embedding serves
Qwen/Qwen3-Embedding-0.6Bbehindtei-embedding, with 1024-dimensional vectors and fixed replicas by default.
When to enable in-cluster inference
In-cluster inference makes sense when:- Low-latency retrieval: embedding calls sit on the memory-search hot path and should avoid public API round trips.
- Data residency: user data must stay inside the customer’s AWS account or Kubernetes network.
- Air-gapped deployment: no internet egress is permitted; model images and weights are mirrored into private registries.
- Embedding-volume cost: embedding traffic dominates model spend and the model fits on a small GPU pool.
Architecture
The chart uses separate serving stacks for the two model roles:- vLLM instruction Service —
vllm-instruction.<namespace>.svc:8000serves chat/completions whenllm.completion.mode: inCluster. - TEI embedding Service —
tei-embedding.<namespace>.svc:8000serves embeddings whenllm.embedding.mode: inClusterandteiEmbedding.enabled: true. - Endpoint env vars on API + worker pods —
NEBULA_LLM_VLLM_API_BASEpoints at vLLM for completions;NEBULA_EMBEDDING_VLLM_API_BASEpoints at TEI embeddings. The runtime uses the vLLM embedding provider for TEI.
llm.inCluster.enabled: true for the in-cluster embedding path. The chart maps completion.mode to the matching in-image TOML profile and emits model endpoint overrides directly through env vars.
Sizing Reference
Qwen3.5 enables thinking mode by default. Add
extraArgs: ["--reasoning-parser", "qwen3"] on the instruction profile so vLLM parses the <think>...</think> blocks into structured response fields rather than streaming them as raw text. The default EKS in-cluster overlay sets this already.
TEI embeddings should run on the dedicated embedding-gpu Karpenter NodePool. The TEI StatefulSet uses per-pod model cache PVCs so each replica keeps a warm model cache; Karpenter adds G6 nodes as pending embedding pods request GPUs.
HuggingFace Token Provisioning
The default EKS models do not require a HuggingFace access token:Qwen/Qwen3.5-9B— publicly available, no token requiredQwen/Qwen3-Embedding-0.6B— publicly available, no token required
teiEmbedding.image.
Enabling On EKS
The bundle ships an EKS overlay athelm/examples/eks/values-vllm-inCluster.yaml. Stack it on top of the base values file:
llm.completion.mode and llm.embedding.mode to inCluster, enables the vLLM instruction profile, and enables one TEI embedding replica:
-f my-values.yaml after the overlay; pass the same -f flags to helm upgrade. Embedding identity is fixed to Qwen/Qwen3-Embedding-0.6B at 1024 dimensions.
Topologies
Embeddings always run in-cluster:
The chart maps completion mode to
NEBULA_CONFIG_NAME automatically. When teiEmbedding.enabled: true, embedding topologies select Qwen3/TEI config profiles by default. Completion model overrides flow through NEBULA_LLM_<provider>_MODEL; embedding model and dimension are fixed to Qwen3-Embedding at 1024 dimensions.
Embedding providers are not configurable. External completions still use their LLM env-var family; embeddings use the VLLM-compatible env-var family for the fixed Qwen path.
Troubleshooting
TEI embedding pods stay Pending
TEI embedding pods stay Pending
Check
kubectl describe pod <tei-embedding-pod> -n nebula. Common causes are a missing embedding-gpu NodePool, no NVIDIA device plugin, a node selector that does not match worker-pool: embedding-gpu, or a missing toleration for the pool taint.Embedding endpoint timing out
Embedding endpoint timing out
Verify the Service has ready endpoints:
kubectl -n nebula get endpoints tei-embedding. If the endpoint list is empty, inspect the StatefulSet and pod logs with kubectl -n nebula describe sts tei-embedding and kubectl -n nebula logs sts/tei-embedding.TEI embedding needs more throughput
TEI embedding needs more throughput
Increase
teiEmbedding.replicas and confirm Karpenter can provision one G6/L4 node per pending GPU replica. Enable the optional CPU HPA only after validating it tracks your workload; GPU saturation is usually better handled by queue-depth, latency, or DCGM/KEDA metrics.vLLM instruction pod stays Pending
vLLM instruction pod stays Pending
Check that the instruction profile’s GPU node selector and tolerations match the customer GPU NodePool, and verify the NVIDIA device plugin is installed so
nvidia.com/gpu is allocatable.Model download stuck
Model download stuck
First boot downloads model artifacts from Hugging Face. If pods log connection errors, allow outbound HTTPS to
huggingface.co or mirror the image and model artifacts into private infrastructure. If logs show 401 Unauthorized, provision an HF_TOKEN secret.