55
66set -e
77
8+
9+ # TODO: For now, default to DEV_INSTALL, because no suitable ODH version for MaaS has
10+ # TODO: been released yet. Switch to false once ODH releases.
11+ DEV_INSTALL=true
12+ if [[ $# -eq 1 ]] && [[ " $1 " == " --dev" ]]; then
13+ DEV_INSTALL=true
14+ elif [[ $# -ne 0 ]]; then
15+ echo " This script only supports a single argument: --dev"
16+ exit 1
17+ fi
18+
819echo " ========================================="
920echo " 🚀 OpenDataHub (ODH) Installation"
1021echo " ========================================="
1122echo " "
1223
1324# Step 1: Install ODH Operator
14- echo " 1️⃣ Installing ODH Operator..."
25+ if [[ " $DEV_INSTALL " == true ]]; then
26+ ODH_OPERATOR_NS=" opendatahub-operator-system"
27+ echo " 1️⃣ Installing ODH Operator from repository manifests..."
28+ cat << EOF | kubectl apply -f -
29+ apiVersion: v1
30+ kind: Namespace
31+ metadata:
32+ name: $ODH_OPERATOR_NS
33+ EOF
34+
35+ TMP_DIR=$( mktemp -d)
36+ trap ' rm -fr -- "$TMP_DIR"' EXIT
37+
38+ pushd $TMP_DIR
39+ git clone -q --depth 1 " https://github.com/opendatahub-io/opendatahub-operator.git"
40+ if [[ $? -ne 0 ]]; then
41+ echo " Failed cloning repository https://github.com/opendatahub-io/opendatahub-operator.git"
42+ popd
43+ exit 1
44+ fi
45+
46+ pushd ./opendatahub-operator
47+ cp config/manager/kustomization.yaml.in config/manager/kustomization.yaml
48+ sed -i ' s#REPLACE_IMAGE#quay.io/opendatahub/opendatahub-operator#' config/manager/kustomization.yaml
49+ kustomize build --load-restrictor LoadRestrictionsNone config/default | kubectl apply --namespace $ODH_OPERATOR_NS -f -
50+ popd
51+ popd
1552
16- # Check if operator is already installed
17- if kubectl get csv -n openshift-operators 2> /dev/null | grep -q opendatahub-operator; then
18- echo " ✅ ODH operator already installed"
53+ echo " Waiting for operator to be ready (this may take a few minutes)..."
54+ kubectl wait deployment/opendatahub-operator-controller-manager -n $ODH_OPERATOR_NS --for condition=Available=True --timeout=300s
1955else
20- echo " Creating OperatorGroup..."
21- cat << EOF | kubectl apply -f -
56+ echo " 1️⃣ Installing ODH Operator..."
57+
58+ # Check if operator is already installed
59+ if kubectl get csv -n openshift-operators 2> /dev/null | grep -q opendatahub-operator; then
60+ echo " ✅ ODH operator already installed"
61+ else
62+ echo " Creating OperatorGroup..."
63+ cat << EOF | kubectl apply -f -
2264apiVersion: operators.coreos.com/v1
2365kind: OperatorGroup
2466metadata:
2567 name: opendatahub
2668 namespace: openshift-operators
2769EOF
2870
29- echo " Creating Subscription..."
30- cat << EOF | kubectl apply -f -
71+ echo " Creating Subscription..."
72+ cat << EOF | kubectl apply -f -
3173apiVersion: operators.coreos.com/v1alpha1
3274kind: Subscription
3375metadata:
@@ -40,67 +82,36 @@ spec:
4082 sourceNamespace: openshift-marketplace
4183EOF
4284
43- echo " Waiting for operator to be ready (this may take a few minutes)..."
44- sleep 30
45-
46- # Wait for operator to be ready
47- for i in {1..30}; do
48- if kubectl get deployment -n openshift-operators | grep -q opendatahub-operator; then
49- echo " Operator deployment found, waiting for ready state..."
50- kubectl wait --for=condition=Available deployment -l app.kubernetes.io/name=opendatahub-operator -n openshift-operators --timeout=300s || true
51- break
52- fi
53- echo " Waiting for operator deployment to appear... ($i /30)"
54- sleep 10
55- done
56- fi
57-
58- # Step 2: Create ODH namespace if it doesn't exist
59- echo " "
60- echo " 2️⃣ Creating opendatahub namespace..."
61- kubectl create namespace opendatahub 2> /dev/null || echo " Namespace already exists"
62-
63- # Step 3: Wait for CRDs to be registered
64- echo " "
65- echo " 3️⃣ Waiting for ODH CRDs to be registered..."
66- for i in {1..30}; do
67- if kubectl get crd dscinitializations.dscinitialization.opendatahub.io & > /dev/null 2>&1 ; then
68- echo " ✅ DSCInitialization CRD found"
69- break
85+ echo " Waiting for operator to be ready (this may take a few minutes)..."
86+ sleep 30
87+
88+ # Wait for operator to be ready
89+ for i in {1..30}; do
90+ if kubectl get deployment -n openshift-operators | grep -q opendatahub-operator; then
91+ echo " Operator deployment found, waiting for ready state..."
92+ kubectl wait --for=condition=Available deployment -l app.kubernetes.io/name=opendatahub-operator -n openshift-operators --timeout=300s || true
93+ break
94+ fi
95+ echo " Waiting for operator deployment to appear... ($i /30)"
96+ sleep 10
97+ done
7098 fi
71- echo " Waiting for DSCInitialization CRD... ($i /30)"
72- sleep 10
73- done
74-
75- if ! kubectl get crd dscinitializations.dscinitialization.opendatahub.io & > /dev/null 2>&1 ; then
76- echo " ❌ DSCInitialization CRD not found after waiting"
77- echo " Please check the operator logs:"
78- echo " kubectl logs -n openshift-operators deployment/opendatahub-operator-controller-manager"
79- exit 1
8099fi
81100
82- # Step 4 : Create DSCInitialization (REQUIRED before DataScienceCluster)
101+ # Step 2 : Create DSCInitialization (REQUIRED before DataScienceCluster)
83102echo " "
84- echo " 4️⃣ Creating DSCInitialization resource..."
103+ echo " 2️⃣ Creating DSCInitialization resource..."
85104cat << EOF | kubectl apply -f -
86- apiVersion: dscinitialization.opendatahub.io/v1
105+ apiVersion: dscinitialization.opendatahub.io/v2
87106kind: DSCInitialization
88107metadata:
89108 name: default-dsci
90- namespace: opendatahub
91109spec:
92110 applicationsNamespace: opendatahub
93111 monitoring:
94112 managementState: Managed
95113 namespace: opendatahub
96- serviceMesh:
97- managementState: Managed
98- auth:
99- audiences:
100- - "https://kubernetes.default.svc"
101- controlPlane:
102- name: data-science-smcp
103- namespace: istio-system
114+ metrics: {}
104115 trustedCABundle:
105116 managementState: Managed
106117EOF
@@ -115,66 +126,43 @@ for i in {1..30}; do
115126 sleep 10
116127done
117128
118- # Step 5 : Create DataScienceCluster
129+ # Step 3 : Create DataScienceCluster
119130echo " "
120- echo " 5️⃣ Creating DataScienceCluster..."
131+ echo " 3️⃣ Creating DataScienceCluster..."
121132cat << EOF | kubectl apply -f -
122- apiVersion: datasciencecluster.opendatahub.io/v1
133+ apiVersion: datasciencecluster.opendatahub.io/v2
123134kind: DataScienceCluster
124135metadata:
125136 name: default-dsc
126- namespace: opendatahub
127137spec:
128138 components:
129- # Core component for notebooks
130- dashboard:
131- managementState: Managed
132-
133- # Notebook controller
134- workbenches:
135- managementState: Managed
136-
137- # Model serving with KServe in RawDeployment mode (no Knative)
138139 kserve:
139140 managementState: Managed
140- defaultDeploymentMode: RawDeployment
141141 nim:
142- managementState: Managed # Enable NVIDIA NIM support
143- rawDeploymentServiceConfig: Headless
144- serving:
145- ingressGateway:
146- certificate:
147- type: OpenshiftDefaultIngress
148- managementState: Removed # Disable Knative serving (using RawDeployment)
149- name: knative-serving
150-
151- # Model serving platform
152- modelmeshserving:
153- managementState: Removed # Use KServe instead
154-
155- # Data science pipelines
156- datasciencepipelines:
157- managementState: Removed # Not needed for MaaS
158-
159- # Ray for distributed computing
142+ managementState: Managed
143+ rawDeploymentServiceConfig: Headed
144+
145+ # Components not needed for MaaS:
146+ dashboard:
147+ managementState: Removed
148+ workbenches:
149+ managementState: Removed
150+ aipipelines:
151+ managementState: Removed
160152 ray:
161- managementState: Removed # Not needed for MaaS
162-
163- # Kueue for job queueing
153+ managementState: Removed
164154 kueue:
165- managementState: Removed # Not needed for MaaS
166-
167- # Model registry
155+ managementState: Removed
168156 modelregistry:
169- managementState: Removed # Not needed for MaaS
170-
171- # TrustyAI for model explainability
157+ managementState: Removed
172158 trustyai:
173- managementState: Removed # Not needed for MaaS
174-
175- # Training operator
159+ managementState: Removed
176160 trainingoperator:
177- managementState: Removed # Not needed for MaaS
161+ managementState: Removed
162+ feastoperator:
163+ managementState: Removed
164+ llamastackoperator:
165+ managementState: Removed
178166EOF
179167
180168echo " Waiting for DataScienceCluster to be ready..."
@@ -190,7 +178,7 @@ for i in {1..60}; do
190178 sleep 10
191179done
192180
193- # Step 6 : Verify installation
181+ # Step 4 : Verify installation
194182echo " "
195183echo " ========================================="
196184echo " 📊 Verification"
@@ -204,25 +192,15 @@ echo ""
204192echo " DataScienceCluster Status:"
205193kubectl get datasciencecluster -n opendatahub
206194
207- echo " "
208- echo " KServe Components:"
209- kubectl get pods -n kserve 2> /dev/null || echo " KServe namespace not yet created"
210-
211- echo " "
212- echo " Istio Components:"
213- kubectl get pods -n istio-system 2> /dev/null || echo " Istio namespace not yet created"
214-
215195echo " "
216196echo " ========================================="
217197echo " ✅ ODH Installation Complete!"
218198echo " ========================================="
219199echo " "
220200echo " Next steps:"
221- echo " 1. Verify KServe is running: kubectl get pods -n kserve"
222- echo " 2. Check Service Mesh: kubectl get smcp -n istio-system"
223- echo " 3. Deploy your models using KServe InferenceService"
201+ echo " 1. Deploy your models using KServe InferenceService"
224202echo " "
225203echo " If you encounter issues, check the logs:"
226204echo " - ODH Operator: kubectl logs -n openshift-operators deployment/opendatahub-operator-controller-manager"
227- echo " - DSCInitialization: kubectl describe dscinitializations -n opendatahub default-dsci"
228- echo " - DataScienceCluster: kubectl describe datasciencecluster -n opendatahub default-dsc"
205+ echo " - DSCInitialization: kubectl describe dscinitializations default-dsci"
206+ echo " - DataScienceCluster: kubectl describe datasciencecluster default-dsc"
0 commit comments