Skip to main content
Version: dev

Install on OpenShift

The recommended method is the OpenShift installation script. One command installs SPIRE, cert-manager, Keycloak, the operator, the MCP Gateway and the console.

Requirements

RequirementVersion
oc4.16.0 or later
An OpenShift clusterAdministrator access. The project tested version 4.19. The test pipeline uses version 4.20.
Helm3.18.0 or later, below 4
Remove an existing cert-manager first

Rossoctl installs its own cert-manager. If your cluster already has cert-manager, for example from the Red Hat OpenShift cert-manager Operator, remove it before you run the script.

Install the platform

git clone https://github.com/rossoctl/rossoctl.git
cd rossoctl

oc login https://api.your-cluster.example.com:6443 -u kubeadmin -p <password>

./scripts/ocp/setup-rossoctl.sh

Run the script from the root directory of the repository, and after you sign in.

The options

OptionFunction
--rossoctl-repo PATH|URLA local directory or a GitHub address. The default action is a clone of main into ~/.cache/rossoctl.
--realm REALMThe Keycloak realm. The default is rossoctl.
--skip-ovn-patchOmits the OVN routing change. The operator gives a warning at start-up if the change is absent.
--skip-mcp-gatewayOmits the MCP Gateway.
--skip-uiOmits the console and the backend.
--skip-mlflowOmits MLflow.
--operator-image IMG:TAGUses a different operator image.
--dry-runPrints each command. It makes no change.

Open the console

echo "https://$(kubectl get route rossoctl-ui -n rossoctl-system \
-o jsonpath='{.status.ingress[0].host}')"

If the cluster uses a self-signed certificate, accept the certificate in your browser. The MCP Inspector and its proxy use one host name, so one action covers both.

To get the Keycloak administrator credentials:

kubectl get secret keycloak-initial-admin -n keycloak \
-o go-template='Username: {{.data.username | base64decode}} Password: {{.data.password | base64decode}}{{"\n"}}'

Confirm the installation

kubectl get daemonsets -n zero-trust-workload-identity-manager
kubectl get deployments -n rossoctl-system

If SPIRE reports 0 in the Current column or the Ready column, see Troubleshooting.

Models

Ollama cannot run on your computer for an OpenShift cluster. The agent is in a remote cluster and cannot reach your computer. Select one of these three methods.

Method 1: run Ollama in the cluster

Create a Deployment and a Service in the rossoctl-system namespace:

apiVersion: apps/v1
kind: Deployment
metadata:
name: ollama
labels:
app: ollama
spec:
replicas: 1
selector:
matchLabels:
app: ollama
template:
metadata:
labels:
app: ollama
spec:
containers:
- name: ollama
image: ollama/ollama:latest
ports:
- containerPort: 11434
resources:
requests:
cpu: "2"
memory: "8Gi"
limits:
cpu: "4"
memory: "16Gi"
volumeMounts:
- name: ollama-data
mountPath: /root/.ollama
volumes:
- name: ollama-data
emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
name: ollama
spec:
selector:
app: ollama
ports:
- port: 11434
targetPort: 11434

Apply the file with kubectl apply -n rossoctl-system -f ollama.yaml. Then get a model:

kubectl exec -n rossoctl-system deploy/ollama -- ollama pull qwen2.5:3b

Set the LLM_API_BASE variable of each agent to this address:

http://ollama.rossoctl-system.svc.cluster.local:11434/v1

Use this table to select the resources:

ModelMemoryCPUs
3B, for example qwen2.5:3b8 Gi2
8B, for example granite3.3:8b16 Gi4
70B or larger64 Gi or more8 or more, and a GPU

For more than a test, do these three actions. Request nvidia.com/gpu on a node that has a GPU. Replace emptyDir with a PersistentVolumeClaim, so the model remains after a restart. Use node affinity to place the pod on a node that has sufficient memory.

Method 2: use an external Ollama server

Run OLLAMA_HOST=0.0.0.0 ollama serve on a computer that the cluster can reach. Then set LLM_API_BASE to http://<that-address>:11434/v1.

Method 3: use a cloud provider

This method is the simplest. See Configure a model.