ocp-datalake

Databricks → OpenShift AI

Governance runs on the cluster: validate, register, serve. The Databricks registry is simulated (PVC + model.json, not an MLflow bundle). OpenShift AI Models-as-a-Service is the governed LLM gateway (CPU simulator; the L4 stays on Llama). Desired state is OpenShift GitOps (Argo CD). Captures from the OpenTLC sandbox, 19 Sep 2026.

← → to move · F for fullscreen · click a capture or diagram to enlarge

Models as a Service auth path

Red Hat Connectivity Link attaches one AuthPolicy to Gateway maas-default-gateway. Every child HTTPRoute (/maas-api and the simulator) is covered. The CRD API is still kuadrant.io/v1; the product name is Connectivity Link. Source: docs/_diagram-authpolicy.html.

AuthPolicy on Gateway maas-default-gateway covering HTTPRoutes, policy pipeline, and backends
AuthPolicy on the Gateway. Identity (sk-oai- or TokenReview), subscription metadata on maas-api, OPA authorize, then inject X-MaaS-* headers. Health checks skip auth.

Quick commands

Resolve the Route from the cluster you are logged into. OpenTLC FQDNs rotate.

ROUTE=https://$(oc get route inference -n ocp-datalake -o jsonpath='{.spec.host}')
curl -sk -H 'Content-Type: application/json' \
  -d '{"tenure":12,"charges":70,"support_tickets":3}' \
  "$ROUTE/predict"

MAAS_URL=https://maas.$(oc get ingresses.config.openshift.io cluster -o jsonpath='{.spec.domain}')
TOKEN=$(oc whoami -t)
API_KEY=$(curl -sk -X POST "$MAAS_URL/maas-api/v1/api-keys" \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{"name":"poc","subscription":"simulator-free","expiresIn":"1h"}' \
  | python -c "import json,sys; print(json.load(sys.stdin).get('key',''))")
curl -sk "$MAAS_URL/v1/chat/completions" \
  -H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" \
  -d '{"model":"publishers/llm/models/facebook/opt-125m","messages":[{"role":"user","content":"Hello"}],"max_tokens":16}'

Databricks compatibility

Today: high conceptual fit, low technical fit. The flow (registry → promotion → serving under cluster policy) is modeled well. The artifact contract is not MLflow: it is a coefficients JSON, not an MLmodel + model.pkl directory. Do not point a production registry at this PoC.

FitWhat lands
HighLinear model exported by hand (coef_ / intercept_) into this JSON. That is churn-score v1, not “fetch the model from the registry”.
Mediumsklearn / XGBoost / LightGBM: change the ServingRuntime (MLServer + mlflow, or ONNX + OVMS/Triton). Do not patch server.py. Watch pickle vs UBI 3.12.
LowSpark ML, Feature Store / Unity Catalog at inference, DBFS paths or UC volumes.

Artifact contract and model-type fit only. For the real pull path and product mapping, see Databricks bridge below or the README.

Databricks bridge

OpenShift never enters the Databricks workspace. In a real integration the cluster pulls a versioned artifact, validates it, registers it, and serves it under the same policies as the rest of the workloads. Databricks stays the training and catalog plane; OpenShift is deployment, identity, and inference.

What would change in this repo

Additive only — keep the JSON seed path as an offline fallback.

Today (PoC)Real bridge
Task seed copies apps/model/model.json onto PVC databricks-ml-registryNew task databricks-pull: mlflow.artifacts.download_artifacts() against databricks-uc (models:/catalog.schema.churn_score/1). JSON seed remains fallback.
No Databricks SDK or credentialsDatabricks service principal OAuth M2M (not a PAT in git). Secret via External Secrets or cluster-local store. OpenShift side stays RHBK + service accounts.
NetworkPolicy with no egressAllow egress to the Databricks control plane and artifact bucket (S3).
PVC stand-in for registryPrefer ODF NooBaa ObjectBucketClaim; scripts/s3_model.py becomes the live helper. KServe storageUri from S3.
validate checks JSON keysValidate MLmodel signature vs HTTP contract (tenure, charges, support_tickets).
UBI Python server.py linear runtimeMLServer + mlserver-mlflow (native MLflow directory) or ONNX + OVMS/Triton. Do not unpickle into server.py. Watch sklearn/numpy versions: Databricks wheels vs UBI 3.12.
Model Registry URI pvc://…Register in ocp-datalake-registry with UC source URI; promotion still Tekton/KFP + GitOps.

Out of scope: Spark ML in the predictor, Feature Store lookups at inference time, DBFS or UC volume paths embedded in the artifact.

Flow: Databricks UC → OAuth M2M pull (Tekton/KFP) → ODF or PVC → RHOAI Model Registry → KServe (MLServer) → Route /predict.

Databricks capabilities vs Red Hat and community

No 1:1 parity. This table is honest about what this PoC already runs and what would replace each Databricks surface.

Databricks capabilityThis PoCRed HatCommunityGap note
Notebooks / workspaceOpenShift AI workbench ocp-datalake-demo (CPU default-profile)OpenShift AI workbenches, OpenShift Dev Spaces—No GPU on the workbench. The L4 stays on Llama. Example notebook calls /predict and MaaS chat.
Jobs / WorkflowsTekton + KFP promotion onlyOpenShift Pipelines, Data Science PipelinesArgo WorkflowsGitOps installs; it does not run training jobs.
Apache Spark batchOne-shot SparkApplication spark-to-churn-score (opt-in)—Stackable Spark (commons + secret + listener + spark)PySpark DataFrame map → churn-score /predict. productVersion 3.5.8.
Apache Spark JavaSparkApplication spark-pi (scripts/run-spark-pi.sh)—Same Stackable operator; org.apache.spark.examples.SparkPi from the image JARDemo only; no /predict. Driver log must show Pi is roughly.
Apache Spark Java customTekton spark-java-churn → spark-java-churn-score (scripts/run-spark-java-churn.sh)OpenShift Pipelines (Maven → Buildah → ImageStream)Stackable Spark + custom JAR in apps/spark-churn-javaParity with Python batch → /predict. SparkApplication applied by Tekton, not Argo.
Streams for Apache KafkaSingle-node KRaft churn + Console + topic churn-eventsStreams for Apache Kafka (amq-streams + amq-streams-console)—Plain listener 9092, no auth. Outside ocp-datalake quota (ns kafka).
Spark ← KafkaStreaming SparkApplication spark-from-kafka-churn (scripts/run-spark-kafka.sh)—Stackable Spark + spark-sql-kafkaStructured Streaming → /predict. Pods stay Running until the CR is deleted.
MLflow TrackingNot connectedKFP run metadata, DSPA history (dev MinIO here)Self-hosted MLflow Tracking serverNo Red Hat–branded MLflow Tracking product.
Model Registry (legacy + UC models)PVC + RHOAI ocp-datalake-registryOpenShift AI Model RegistryMLflow Registry (if self-hosted)UC grants and databricks-uc URI are on the Databricks side.
Unity CatalogSimulated naming onlyOpenShift RBAC, GitOps, Model RegistryOpenLineage/Marquez, OpenMetadataNo full UC equivalent. Lineage is separate tooling.
Feature StoreNot usedFeature Store (tech preview in some RHOAI releases — verify 3.5)FeastRemote Databricks Feature Store lookups at inference do not work off-platform.
Delta / lakehouse / DBFSPVC only (no ODF on sandbox)OpenShift Data Foundation (NooBaa/S3)Apache Iceberg, Delta connectors, Trinoscripts/s3_model.py is ready for OBC; not wired in Tekton yet.
Model ServingKServe churn-score + MaaS LLM pathKServe, Models-as-a-Service, Connectivity LinkvLLM, Triton (via RHOAI runtimes)Databricks Model Serving ≈ KServe/MaaS, not the registry.
SQL warehousesNot used—Trino, Spark SQLNo Red Hat SQL warehouse 1:1.
GenAI / MosaicMaaS CPU simulator; L4 on Llama KServeMaaS, OpenShift AI servingvLLM, Hugging Face stacksLlama Stack is Removed on this cluster by design.
Identity / SCIMRHBK + oauth-proxy on RouteRed Hat Build of Keycloak, OpenShift OAuthKeycloak upstream patternsDatabricks SP OAuth M2M is separate from cluster IdP.
Asset Bundles / IaCGitOps app-of-appsOpenShift GitOps (Argo CD)Helm, Kustomize (already in repo)Cluster desired state is git; Databricks bundles stay in Databricks.

Enterprise architecture views

Source HTML: docs/_diagram-bridge-enterprise.html, docs/_diagram-replace-enterprise.html (render with python scripts/render-diagrams.py).

Enterprise bridge: Databricks plane left, OpenShift pull store govern serve right
Combined (bridge). Databricks trains and catalogs; OpenShift pulls via OAuth M2M, stores on ODF, registers, and serves under cluster policy.
Full replacement stack on OpenShift: develop, train, lakehouse, and serve
Full replacement. No Databricks dependency — RHOAI, ODF, Pipelines, and GitOps plus Feast, Iceberg, Trino, and self-hosted MLflow. Unity Catalog and managed Spark are not replicated.

Bridge vs replace: Bridge — Databricks trains and registers; OpenShift pulls, governs, and serves (this document). Replace — RHOAI + ODF + Pipelines + Feast/Iceberg on OpenShift; you lose UC and the managed Spark runtime. This PoC demonstrates the bridge story.