This is a different install path from Helm. OLM installs the
operator, the CRDs, the mutating webhooks and their serving certificates, so
cert-manager is not needed. It does not create the resources the Helm chart
creates for you; this page covers them. Don’t install from the catalog on a cluster that
already runs the Helm chart: both own the same CRDs and webhooks. Uninstall the chart first,
and note that deleting its CRDs also deletes every engine and coordinator it created.
Prerequisites
OpenShift 4.20 or later
OpenShift 4.20 or later
The certified bundle supports OpenShift 4.20 and later. On an older cluster the
operator does not appear in the catalog.
NVIDIA GPU nodes and the GPU Operator, driver R580 or later
NVIDIA GPU nodes and the GPU Operator, driver R580 or later
GPU nodes are x86_64 with NVIDIA data-center GPUs. Install the NVIDIA GPU Operator
(with its Node Feature Discovery dependency) from the software catalog and create its
default
ClusterPolicy. The serving image is built on CUDA 13.0, so GPU nodes need an
NVIDIA driver R580 or later. The GPU Operator installs the driver too, and which
version depends on the GPU Operator release: older releases default to an earlier branch
(v25.3 defaults to R570), so check the driver it deployed. The GPU Operator also labels GPU
nodes nvidia.com/gpu.present=true and registers the nvidia RuntimeClass, which the
cache engines use. On GPU Operator versions before v25.10.0, also
enable CDI.Check that your GPU nodes are labeled and that the driver is R580 or later:Node resources
Node resources
Each cache engine runs one pod on every GPU node. The pod requests 4 CPUs and
l1.sizeGB + 5 GiB of memory (limit 1.5×), on top of your vLLM pods. The serving image is
about 10 GB, so allow at least 30 GB of free container storage on each GPU node.cluster-admin
cluster-admin
Installing an operator, editing the cluster pull secret and granting an SCC are
cluster-admin actions.
A Tensormesh registry access token
A Tensormesh registry access token
The access token from the Tensormesh team, the same one used for Helm installs and the
CLI. If you don’t have it, contact Tensormesh. Every
Tensormesh image (the operator, the serving image that also runs the cache engines and the
coordinator, the LMCache payload and the CacheBlend plugin) is pulled from
artifacts.tensormesh.ai.Network, proxy and FIPS
Network, proxy and FIPS
The examples download model weights from Hugging Face (
huggingface.co). The operator
does not pass the cluster-wide proxy settings to the pods it creates or connects: if your
cluster uses a proxy, set HTTP_PROXY, HTTPS_PROXY and NO_PROXY on your vLLM
Deployment and through spec.env on the engines, and include .svc, .cluster.local and
your cluster’s pod and service networks in NO_PROXY, so that traffic between vLLM, the
engines and the coordinator stays inside the cluster. Disconnected (air-gapped) clusters
are not supported in this release, and Tensormesh Platform is not supported on clusters
installed in FIPS mode: its images are not built for FIPS 140 compliance.1. Add the Tensormesh registry access token
Do this first. OLM pulls the operator image as soon as you install, so without the token the operator pod stays inImagePullBackOff.
Add the token to the cluster’s global pull secret, which covers every node and every
namespace. The pull secret holds every registry credential of the cluster, so the commands
run in a private temporary directory, and the token is read from a prompt rather than typed
on the command line:
2. Install the operator
- In the OpenShift web console, go to Ecosystem → Software Catalog.
- Search for Tensormesh Platform; the listing carries the Certified badge. Click Install.
- Keep the
stablechannel and the default installation mode, All namespaces on the cluster, and confirm. For Update approval, see Upgrade: with Manual, you decide when the operator upgrades, but OLM then applies Manual approval to every operator in theopenshift-operatorsnamespace and upgrades them together.
openshift-operators namespace, together with the three
CRDs and the mutating webhooks. Check that it is running:
ImagePullBackOff, check step 1, then delete the pod once the
pull-secret rollout has finished; it restarts and pulls the image.
3. Prepare a workload namespace
The coordinator, the cache engine and the vLLM pods that use it must all run in the same namespace: an engine finds its coordinator in its own namespace, the webhook looks up the engine in the pod’s namespace, and OpenShift gives each namespace its own UID range, so pods in different namespaces can’t share memory with an engine. This page usesllm-serving; if
you use another namespace, replace llm-serving everywhere below.
Create the namespace and a ServiceAccount for the Tensormesh workloads:
tensormesh
ServiceAccount. The default engine needs no extra permissions; CacheBlend
and SGLang need host IPC, which you grant to this ServiceAccount there.
4. Create the coordinator and the engine
TheLMCacheCoordinator tracks which cache engines are alive and drives cache eviction
across them; engines register with it at startup. Every setup needs one coordinator per
namespace.
Then choose one engine for the namespace. Each engine runs a pod on every GPU node and
reserves its l1.sizeGB of memory there:
- the default
LMCacheEnginebelow, for vLLM (steps 4 and 5); - a
CacheBlendEngine, for RAG workloads (step 6); - an
LMCacheEnginein host-IPC mode, for SGLang (step 7).
spec.image on every resource as shown. If it is unset, the operator uses a latest
tag, which for engines is the public community image, not the certified build. The samples in
the console’s Create instance form carry the certified images but no serviceAccountName:
add serviceAccountName: tensormesh when you start from them.
coordinator.yaml
engine.yaml
l1, the engine pod requests 45 GiB of memory on every GPU node (see
Node resources); size l1 so that it fits next to your vLLM pods.
On NVIDIA GPUs the engine runs in isolated IPC mode by default (isolatedIPC unset): the
engine and the connected vLLM pods exchange KV cache over CUDA IPC, and each vLLM pod gets a
private in-memory /dev/shm. Isolated IPC needs no host IPC and no extra SCC.
The coordinator and engine images are built on the serving image, so the first start on a
node can take 15 to 20 minutes while it pulls. Wait for both resources to report Running:
READY count should equal your number of GPU nodes. If no node carries
nvidia.com/gpu.present=true, the engine stays Pending and the wait times out.
For storage tiers and sizing, see filesystem offloading,
KV cache encryption and
cache sizing.
5. Connect your vLLM deployment
Add one label and one annotation to the vLLM pod template; the labels call this injection. When the pod is created, the operator’s webhook adds the LMCache connection settings and the shared-memory access, so you don’t write any LMCache configuration yourself. Create the vLLM Deployment after the engine isRunning: vLLM connects to the engine when
it starts. If the webhook can’t connect a pod, it lets the pod start without LMCache rather
than block it, so check the result below.
vllm.yaml
command unset on the vLLM container: the webhook skips containers that override it.
The image’s entrypoint is vllm serve, so args starts with the model options.
engine-not-found because you created the Deployment before the engine,
run oc -n llm-serving rollout restart deployment/vllm once the engine is Running.
Then check that the cache works end to end. Send a long prompt, restart vLLM so that its GPU
memory is empty, and send the same prompt again: the engine stores the KV cache the first time
and serves it back to the new pod the second time. The new pod downloads the model again
unless model-cache is a PersistentVolumeClaim.
Stored
there. A shared filesystem cache
or P2P lets engines reuse each other’s cache.
The example uses the certified serving image, which already contains LMCache. To keep your
own vLLM image, add the LMCache payload image to engine.yaml; the webhook then adds the
matching LMCache client to your pods (see
payload injection
for how it works; the Helm and cert-manager steps there don’t apply to OLM):
6. CacheBlend (optional)
CacheBlend reuses KV cache for text that is not at the start of the prompt, such as retrieved documents in RAG.Allow host IPC
A CacheBlend engine always shares/dev/shm with its vLLM pods. On OpenShift it does that
through the host IPC namespace (hostIPC: true), and the webhook gives the connected vLLM
pods host IPC too. OpenShift’s default restricted-v2 SCC forbids host IPC, so apply the
least-privilege lmcache-engine SCC. It allows host IPC and nothing more: non-root, all
capabilities dropped, no privileged containers, no host network, PID or ports, no hostPath
volumes, seccomp RuntimeDefault. GPUs reach the pods through the NVIDIA RuntimeClass and
CDI, not host paths.
lmcache-engine-scc.yaml
tensormesh
ServiceAccount use it in each namespace that runs CacheBlend or SGLang. Only pods that run as
that ServiceAccount get host IPC, but anyone who can create pods in the namespace can choose
that ServiceAccount, so grant it only in namespaces you trust:
OpenShift admits pods through SCCs, and the namespace-level Pod Security enforce mode is
privileged by default, so no namespace label is needed. If your cluster policy sets a
stricter pod-security.kubernetes.io/enforce label on namespaces, set it to privileged on
this one; host IPC is outside the baseline and restricted profiles.Create the CacheBlend engine
If you followed steps 4 and 5 and are switching to CacheBlend, delete the step-5 vLLM Deployment and the step-4 engine first, to free the GPU and the engine’s memory:oc delete deployment vllm -n llm-serving and oc delete lmcacheengine engine -n llm-serving.
cacheblend.yaml
Connect vLLM to CacheBlend
Use the CacheBlend label and annotation instead of the step-5 ones. This is the step-5 Deployment with the opt-in swapped; the webhook adds the CacheBlend plugin and vLLM flags:vllm-cacheblend.yaml
oc -n llm-serving describe replicaset -l app=vllm-cacheblend. The
message unable to validate against any security context constraint means the SCC binding
above is missing.
Once your RAG traffic repeats documents at different positions in the prompt, the counters of
the engine on the vLLM pod’s node show how many prompt tokens CacheBlend reused at non-prefix
positions:
7. SGLang (optional)
The webhook also connects SGLang servers. SGLang’s LMCache connector supports only CUDA IPC over a shared/dev/shm, not isolated IPC, so on OpenShift it needs an engine with
isolatedIPC: false and hostIPC: true, and the host IPC grant from
step 6. The webhook skips SGLang pods whose engine runs isolated IPC. Like CacheBlend, this
engine is usually created instead of the step-4 one: if you are switching from step 5 or 6,
delete that vLLM Deployment and engine first.
sglang-engine.yaml
lmcache/sglang:v0.5.6. Opt
SGLang pods in with the lmcache.ai/sglang-inject label and the lmcache.ai/lmcache-engine
annotation; the webhook adds --enable-lmcache and the engine address. OpenShift runs the
pod as a non-root user, so point HOME at a writable directory:
sglang.yaml
sglang-engine pod on the SGLang pod’s node
shows Stored lines, as in step 5.
8. Restrict network access (recommended)
The cache server port accepts connections from any pod in the cluster unless you restrict it. Setspec.networkPolicy.enabled: true on each LMCacheEngine and CacheBlendEngine,
in the YAML or with a patch:
<engine>-ingress for the engine’s pods:
- The cache server port (5555 by default) accepts only pods that carry one of the webhook’s
opt-in labels set to
"true", from any namespace:lmcache.ai/lmcache-injectorlmcache.ai/sglang-injectfor anLMCacheEngine,lmcache.ai/cacheblend-injectfor aCacheBlendEngine. This limits who can reach the cache, but it is not tenant isolation: any pod with that label can connect. - The HTTP port (8080), which serves status, metrics and the cache operations the CLI uses, the metrics port (9090) and, when enabled, the P2P port stay open to all pods. Add your own NetworkPolicy to restrict them.
- All other incoming connections to the engine pods are blocked.
false deletes the policy.
Check that it took effect:
hostNetwork: true.
9. Observability (optional)
The OLM install does not create the OpenTelemetry Collector or the ServiceMonitors thathelm install --set observability.enabled=true does. Without a collector, each engine serves
Prometheus metrics at /metrics on its HTTP port (8080). To collect engine metrics and traces
centrally, install the Red Hat build of OpenTelemetry operator from the software catalog
and create a collector in the workload namespace:
collector.yaml
--otlp-endpoint sends the engine’s metrics and traces to the
collector, and --enable-tracing turns on tracing. Scrape the collector (port 8889) instead
of the engine:
debug exporter with that
backend’s OTLP exporter. To scrape the collector with the cluster’s monitoring stack,
enable monitoring for user-defined projects
and create a ServiceMonitor for the collector’s tensormesh-collector Service. The metrics
themselves are described in Observability.
Upgrade
The operator, its CRDs and its webhooks upgrade through OLM, according to the Update approval you chose in step 2: with Automatic, OLM upgrades the operator as soon as a new version reaches thestable channel; with Manual, you approve the install plan in
Ecosystem → Installed Operators → Tensormesh Platform.
The engine, coordinator and serving images don’t upgrade with the operator: they are the tags
set in your custom resources and Deployments. After each operator upgrade:
- Check the OpenShift certified bundle table for the image tags of the new version.
- Update
spec.image.tag, andspec.injection.payloadImage.tagwhere set, on everyLMCacheCoordinator,LMCacheEngineandCacheBlendEngine, the image of your vLLM Deployments, and your SGLang image (LMCache at the new engine version). Mixing versions across the operator and the engines is not supported.
Uninstall
First delete your vLLM and SGLang Deployments, then the custom resources in every namespace, and wait until they are gone:lmcache-engine SCC, the namespace grants and your registry access token stay
in place, so a reinstall picks up where you left off. Remove them only if you are done with
Tensormesh Platform:
artifacts.tensormesh.ai entry.
Troubleshooting
For more, see Troubleshooting; its Helm commands
don’t apply to an OLM install.
Next steps
CacheBlend
Model settings and how to check that blending is active.
CLI
tmo-cli checks engine status, clears the cache and runs diagnostics. It installs
separately, with the same registry access token.
