- Inference Only Stack
The inference-only stack deploys KServe with distributed inference (llm-d) without the full RHOAI/ODH platform. This is useful when you only need model serving capabilities and want to avoid installing components like pipelines, workbenches, dashboards, training operators, and monitoring.
The stack installs a minimal set of dependency operators required by KServe:
| Operator | Purpose | Namespace |
|---|---|---|
| cert-manager | Certificate management and TLS provisioning | cert-manager-operator |
| Leader Worker Set | Distributed inference workflows | openshift-lws-operator |
| Red Hat Connectivity Link (RHCL) | API management (Kuadrant/Authorino) | kuadrant-system |
- OpenShift cluster (version 4.19.9 or later)
kubectlorocCLI installed- Cluster admin permissions
- Helm v4
Since all components and monitoring default to Removed, the values override only needs to enable KServe:
- ODH/RHOAI operator (via OLM)
- Dependency operators (via OLM): cert-manager, Leader Worker Set, RHCL (Kuadrant) are auto-enabled by KServe
- DSCInitialization (DSCI) with monitoring disabled (default)
- DataScienceCluster (DSC) with only KServe set to
Managed
The simplest way to deploy the inference-only stack is using the built-in rhaii profile:
helm upgrade --install rhaii ./charts/rhai-on-openshift-chart \
--set profile=rhaii \
--set operator.type=rhoai \
-n rhai-gitops --create-namespaceThe rhaii profile automatically enables KServe with its required dependencies and disables unnecessary ones
(like jobSet). See the Deploy Profiles section in the chart README for
more details.
Alternatively, you can use the values override file at
docs/examples/values-inference-only.yaml for full control over the
configuration.
Note
The chart's tri-state dependency resolution (auto/true/false) handles transitive dependencies automatically. For
example, RHCL auto-pulls cert-manager and Leader Worker Set as its own dependencies. Components set to Removed
(the default) do not trigger dependency installation.
git clone https://github.com/opendatahub-io/odh-gitops.git
cd odh-gitopsThe first run installs the OLM subscriptions (Namespace, OperatorGroup, Subscription). CRs are skipped because their CRDs do not exist yet.
# Using profile (recommended)
helm upgrade --install rhaii ./charts/rhai-on-openshift-chart \
--set profile=rhaii \
--set operator.type=rhoai \
-n rhai-gitops --create-namespace
# Or using values file for full control
helm upgrade --install rhaii ./charts/rhai-on-openshift-chart \
-f docs/examples/values-inference-only.yaml \
-n rhai-gitops --create-namespaceWait for the operators to install and register their CRDs before creating CRs:
kubectl wait --for=condition=Established \
crd/leaderworkersetoperators.operator.openshift.io --timeout=300s
kubectl wait --for=condition=Established \
crd/kuadrants.kuadrant.io --timeout=300s
kubectl wait --for=condition=Established \
crd/datascienceclusters.datasciencecluster.opendatahub.io --timeout=300s
kubectl wait --for=condition=Established \
crd/dscinitializations.dscinitialization.opendatahub.io --timeout=300sNote
You can also use the provided script ./scripts/wait-for-crds.sh which waits for all known CRDs.
Now that CRDs exist, the second run creates the CR resources (DSCInitialization, DataScienceCluster, Kuadrant, LeaderWorkerSetOperator, etc.):
# Using profile
helm upgrade --install rhaii ./charts/rhai-on-openshift-chart \
--set profile=rhaii \
--set operator.type=rhoai \
-n rhai-gitops
# Or using values file
helm upgrade --install rhaii ./charts/rhai-on-openshift-chart \
-f docs/examples/values-inference-only.yaml \
-n rhai-gitopsWarning
This step is required for KServe to function correctly. See Enabling Authorino TLS for why this is a post-install step.
KUSTOMIZE_MODE=false ./scripts/prepare-authorino-tls.shSee Verification for commands to confirm everything is running.
The Kuadrant operator automatically creates the Authorino resource when the Kuadrant CR is applied. Because Authorino is created by the operator (not by the Helm chart), TLS must be enabled as a post-install step after Authorino exists.
Use the provided script which handles waiting for resources, annotating the service, and patching the Authorino CR:
KUSTOMIZE_MODE=false ./scripts/prepare-authorino-tls.shThe script:
- Waits for the Authorino service to be created
- Annotates the service to trigger TLS certificate generation
- Waits for the TLS certificate secret
- Patches the Authorino CR to enable TLS
Verify that all operators are installed and in Succeeded phase:
kubectl get csv -A | grep -E "(cert-manager|leader-worker|rhcl|opendatahub|rhods)"Verify that Authorino has TLS enabled:
kubectl get authorino authorino -n kuadrant-system \
-o jsonpath='{.spec.listener.tls}'kubectl get datasciencecluster -o jsonpath='{.items[0].status.phase}'Use the provided verification script for a full check of all operator subscriptions and pod readiness:
./scripts/verify-dependencies.shIf CR resources (DataScienceCluster, Kuadrant, LeaderWorkerSetOperator, etc.) are not being created after the Helm install:
-
Verify the operator is installed and the CRD exists:
kubectl get crd datascienceclusters.datasciencecluster.opendatahub.io kubectl get crd kuadrants.kuadrant.io
-
Run
helm upgradeagain. CRs are skipped until their CRDs exist:helm upgrade --install rhaii ./charts/rhai-on-openshift-chart \ --set profile=rhaii --set operator.type=rhoai \ -n rhai-gitops
If Authorino TLS is not working:
-
Check that the service annotation exists:
kubectl get svc authorino-authorino-authorization -n kuadrant-system \ -o jsonpath='{.metadata.annotations}' -
Check that the TLS secret was created:
kubectl get secret authorino-server-cert -n kuadrant-system
-
Verify the Authorino CR has TLS enabled:
kubectl get authorino authorino -n kuadrant-system \ -o jsonpath='{.spec.listener.tls}' -
If the secret does not exist, re-run the TLS preparation script:
KUSTOMIZE_MODE=false ./scripts/prepare-authorino-tls.sh
If a dependency operator is not being installed:
- Verify the component requiring it has
managementState: Managed(notRemoved) - Check that the dependency is not explicitly set to
falsein the component'sdependencies - Verify the top-level
dependencies.<name>.enabledis not set tofalse