Skip to content

Instantly share code, notes, and snippets.

@nerdalert
Created January 5, 2026 06:46
Show Gist options
  • Select an option

  • Save nerdalert/1b7c278fce8175f70d91a8fa869c9d5b to your computer and use it in GitHub Desktop.

Select an option

Save nerdalert/1b7c278fce8175f70d91a8fa869c9d5b to your computer and use it in GitHub Desktop.
$ ./deploy/openshift/deploy-to-openshift.sh
[SUCCESS] Logged in as kube:admin
[INFO] Creating namespace: vllm-semantic-router-system
namespace/vllm-semantic-router-system configured
[SUCCESS] Namespace ready
[INFO] Checking for llm-katan image...
[INFO] Building llm-katan image...
--> Found container image ce19342 (6 days old) from Docker Hub for "python:3.10-slim"

    * An image stream tag will be created as "python:3.10-slim" that will track the source image
    * A Docker build using a predefined Dockerfile will be created
      * The resulting image will be pushed to image stream tag "llm-katan:latest"
      * Every time "python:3.10-slim" changes a new build will be triggered

--> Creating resources with label build=llm-katan ...
    imagestream.image.openshift.io "python" created
    imagestream.image.openshift.io "llm-katan" created
    buildconfig.build.openshift.io "llm-katan" created
--> Success
[INFO] Waiting for build to start...
[INFO] Starting build...
build.build.openshift.io/llm-katan-2 started
inFailed to stream the build logs - to view the logs, run oc logs build/llm-katan-2
Error: unable to stream the build logs; caused by: unable to wait for build llm-katan-2 to run: timed out waiting for the condition
[INFO] Waiting for build to complete...

build.build.openshift.io/llm-katan-1 condition met
[SUCCESS] llm-katan image built
[INFO] Creating PersistentVolumeClaims...
persistentvolumeclaim/semantic-router-models created
persistentvolumeclaim/semantic-router-cache created
persistentvolumeclaim/vllm-model-a-cache created
persistentvolumeclaim/vllm-model-b-cache created
[SUCCESS] PVCs created
[INFO] Deploying vLLM model services and deployments...
deployment.apps/vllm-model-a created
deployment.apps/vllm-model-b created
deployment.apps/semantic-router created
service/vllm-model-a created
service/vllm-model-b created
service/semantic-router created
service/semantic-router-metrics created
[INFO] Waiting for vLLM services to get ClusterIPs...
[SUCCESS] Got ClusterIPs: vllm-model-a=172.30.198.51, vllm-model-b=172.30.174.118
[INFO] Generating dynamic configuration with ClusterIPs...
[SUCCESS] Dynamic config generated with IPs: Model-A=172.30.198.51, Model-B=172.30.174.118
[INFO] Creating ConfigMaps with dynamic IPs...
configmap/semantic-router-config created
configmap/envoy-config created
[SUCCESS] ConfigMaps created with dynamic IPs
[SUCCESS] Deployment manifests applied
[INFO] Deploying Dashboard...
configmap/dashboard-config created
deployment.apps/dashboard created
service/dashboard created
route.route.openshift.io/dashboard created
[SUCCESS] Dashboard deployment applied
[INFO] Creating OpenShift routes...
route.route.openshift.io/semantic-router-api created
route.route.openshift.io/semantic-router-grpc created
route.route.openshift.io/semantic-router-metrics created
route.route.openshift.io/envoy-http created
route.route.openshift.io/envoy-admin created
[SUCCESS] Routes created
[INFO] Deploying Jaeger for distributed tracing...
deployment.apps/jaeger created
service/jaeger created
route.route.openshift.io/jaeger created
[SUCCESS] Jaeger deployed
[INFO] Waiting for deployments to be ready...
[INFO] This may take several minutes as models are downloaded...
[INFO] Deploying observability components...
[INFO] Deploying Grafana...
persistentvolumeclaim/grafana-storage created
service/grafana created
route.route.openshift.io/grafana created
configmap/grafana-dashboards created
configmap/grafana-datasources created
configmap/grafana-dashboards-provisioning created
[INFO] Waiting for Grafana route to be created...
[SUCCESS] Grafana route URL: https://grafana-vllm-semantic-router-system.apps.ci-ln-r4xhntk-76ef8.aws-2.ci.openshift.org
[INFO] Generating Grafana deployment with dynamic route URL...
deployment.apps/grafana created
[SUCCESS] Grafana deployed with dynamic route URL: https://grafana-vllm-semantic-router-system.apps.ci-ln-r4xhntk-76ef8.aws-2.ci.openshift.org
[INFO] Deploying Prometheus...
configmap/prometheus-config created
deployment.apps/prometheus created
persistentvolumeclaim/prometheus-data created
serviceaccount/prometheus unchanged
clusterrole.rbac.authorization.k8s.io/prometheus-semantic-router unchanged
clusterrolebinding.rbac.authorization.k8s.io/prometheus-semantic-router unchanged
route.route.openshift.io/prometheus created
service/prometheus created
[SUCCESS] Prometheus deployed
[INFO] Building and deploying Dashboard...
[INFO] Creating dashboard imagestream...
imagestream.image.openshift.io/dashboard-custom created
[INFO] Creating dashboard build configuration...
    * A Docker build using binary input will be created
      * The resulting image will be pushed to image stream tag "dashboard-custom:latest"
      * A binary build was created, use 'oc start-build --from-dir' to trigger a new build

--> Creating resources with label build=dashboard-custom ...
    imagestreamtag.image.openshift.io "dashboard-custom:latest" created
    buildconfig.build.openshift.io "dashboard-custom" created
--> Success
buildconfig.build.openshift.io/dashboard-custom patched
[INFO] Building dashboard image from source...
Uploading directory "." as binary input for the build ...

Uploading finished
build.build.openshift.io/dashboard-custom-1 started
Receiving source from STDIN as archive ...
time="2026-01-05T06:23:09Z" level=info msg="Not using native diff for overlay, this may cause degraded performance for building images: kernel has CONFIG_OVERLAY_FS_REDIRECT_DIR enabled"
I0105 06:23:09.970965       1 defaults.go:112] Defaulting to storage driver "overlay" with options [mountopt=metacopy=on].
Caching blobs under "/var/cache/blobs".

Pulling image alpine:3.18 ...
Resolving "alpine" using unqualified-search registries (/etc/containers/registries.conf)
Trying to pull registry.redhat.io/alpine:3.18...
Trying to pull registry.access.redhat.com/alpine:3.18...
Trying to pull quay.io/alpine:3.18...
Trying to pull docker.io/library/alpine:3.18...
Getting image source signatures
Copying blob sha256:44cf07d57ee4424189f012074a59110ee2065adfdde9c7d9826bebdffce0a885
Copying config sha256:802c91d5298192c0f3a08101aeb5f9ade2992e22c9e27fa8b88eab82602550d0
Writing manifest to image destination

Pulling image golang:1.24.1-alpine ...
Resolving "golang" using unqualified-search registries (/etc/containers/registries.conf)
Trying to pull registry.redhat.io/golang:1.24.1-alpine...
Trying to pull registry.access.redhat.com/golang:1.24.1-alpine...
Trying to pull quay.io/golang:1.24.1-alpine...
Trying to pull docker.io/library/golang:1.24.1-alpine...
Getting image source signatures
Copying blob sha256:4f4fb700ef54461cfa02571ae0db9a0dc1e0cdb5577484a6d75e68dc38e8acc1
Copying blob sha256:6f2aba06f0e9c899ca99ff9bcf082c204a130062daba4944c586870b34ee31d9
Copying blob sha256:f18232174bc91741fdf3da96d85011092101a032a93a388b79e99e69c2d5c870
Copying blob sha256:178cc98ff0842a2601bbc4e7db3db70a323469849a03684d1b9b21e7f825b7e4
Copying blob sha256:547316ea10d43cbdb09444c3f4eec70dc0520c4cdb9e499ca146178bb100d2c6
Copying config sha256:7930df93513ac6dc625ca8b924edbbb3bda521271c9b053d09b4c37994831f09
Writing manifest to image destination

Pulling image node:18-alpine ...
Resolving "node" using unqualified-search registries (/etc/containers/registries.conf)
Trying to pull registry.redhat.io/node:18-alpine...
Trying to pull registry.access.redhat.com/node:18-alpine...
Trying to pull quay.io/node:18-alpine...
Trying to pull docker.io/library/node:18-alpine...
Getting image source signatures
Copying blob sha256:25ff2da83641908f65c3a74d80409d6b1b62ccfaab220b9ea70b80df5a2e0549
Copying blob sha256:f18232174bc91741fdf3da96d85011092101a032a93a388b79e99e69c2d5c870
Copying blob sha256:dd71dde834b5c203d162902e6b8994cb2309ae049a0eabc4efea161b2b5a3d0e
Copying blob sha256:1e5a4c89cee5c0826c540ab06d4b6b491c96eda01837f430bd47f0d26702d6e3
Copying config sha256:ee77c6cd7c1886ecc802ad6cedef3a8ec1ea27d1fb96162bf03dd3710839b8da
Writing manifest to image destination
Adding transient rw bind mount for /run/secrets/rhsm
[1/3] STEP 1/7: FROM node:18-alpine AS frontend-builder
[1/3] STEP 2/7: ARG BASE_DIR=dashboard
--> f07a9182333f
[1/3] STEP 3/7: WORKDIR /app/frontend
--> 5e762b6df6c7
[1/3] STEP 4/7: COPY ${BASE_DIR}/frontend/package*.json ./
--> 4f7a9b3ade50
[1/3] STEP 5/7: RUN npm ci --include=dev   # Ensure devDependencies are installed regardless of NODE_ENV

added 340 packages, and audited 341 packages in 15s

133 packages are looking for funding
  run `npm fund` for details
npm notice
npm notice New major version of npm available! 10.8.2 -> 11.7.0
npm notice Changelog: https://github.com/npm/cli/releases/tag/v11.7.0
npm notice To update run: npm install -g npm@11.7.0
npm notice

2 moderate severity vulnerabilities

To address all issues (including breaking changes), run:
  npm audit fix --force

Run `npm audit` for details.
--> 950d487fbf0d
[1/3] STEP 6/7: COPY ${BASE_DIR}/frontend/ ./
--> 6b611ffc8cd6
[1/3] STEP 7/7: RUN npm run build

> semantic-router-dashboard@1.0.0 build
> tsc && vite build

vite v5.4.21 building for production...
transforming...
✓ 692 modules transformed.
rendering chunks...
computing gzip size...
dist/index.html                         0.67 kB │ gzip:   0.38 kB
dist/assets/index-DqoAZDGg.css         86.66 kB │ gzip:  14.94 kB
dist/assets/react-vendor-aiMnyO-O.js  163.64 kB │ gzip:  53.44 kB
dist/assets/index-5dV_d1La.js         609.25 kB │ gzip: 181.14 kB

(!) Some chunks are larger than 500 kB after minification. Consider:
- Using dynamic import() to code-split the application
- Use build.rollupOptions.output.manualChunks to improve chunking: https://rollupjs.org/configuration-options/#output-manualchunks
- Adjust chunk size limit for this warning via build.chunkSizeWarningLimit.
✓ built in 10.31s
--> 11b8313b8baa
[2/3] STEP 1/10: FROM golang:1.24.1-alpine AS backend-builder
[2/3] STEP 2/10: ARG BASE_DIR=dashboard
--> 4e420596df7f
[2/3] STEP 3/10: ARG ROUTER_DIR=src/semantic-router
--> 88505b1a8d8f
[2/3] STEP 4/10: WORKDIR /app
--> 41b552225a4d
[2/3] STEP 5/10: COPY ${ROUTER_DIR} /src/semantic-router
--> 38accece4edd
[2/3] STEP 6/10: WORKDIR /app/backend
--> b16122c4ad08
[2/3] STEP 7/10: COPY ${BASE_DIR}/backend/go.* ./
--> 0d21aada5eb2
[2/3] STEP 8/10: RUN go mod download
--> 32b9f41e9d8a
[2/3] STEP 9/10: COPY ${BASE_DIR}/backend/ ./
--> 6d043bfe8259
[2/3] STEP 10/10: RUN CGO_ENABLED=0 GOOS=linux go build -o dashboard-server .
--> 6ad85a2a2416
[3/3] STEP 1/10: FROM alpine:3.18
[3/3] STEP 2/10: RUN apk add --no-cache ca-certificates
fetch https://dl-cdn.alpinelinux.org/alpine/v3.18/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.18/community/x86_64/APKINDEX.tar.gz
(1/1) Installing ca-certificates (20241121-r1)
Executing busybox-1.36.1-r7.trigger
Executing ca-certificates-20241121-r1.trigger
OK: 8 MiB in 16 packages
--> 6f781960de8f
[3/3] STEP 3/10: WORKDIR /app
--> d92578d0d28e
[3/3] STEP 4/10: COPY --from=backend-builder /app/backend/dashboard-server .
--> 2e0344677a0d
[3/3] STEP 5/10: COPY --from=frontend-builder /app/frontend/dist ./frontend
--> 64a8509538b0
[3/3] STEP 6/10: ENV DASHBOARD_STATIC_DIR=./frontend
--> fdd43abf1bf5
[3/3] STEP 7/10: EXPOSE 8700
--> 0320691abe29
[3/3] STEP 8/10: CMD ["./dashboard-server"]
--> ccd82812674a
[3/3] STEP 9/10: ENV "OPENSHIFT_BUILD_NAME"="dashboard-custom-1" "OPENSHIFT_BUILD_NAMESPACE"="vllm-semantic-router-system"
--> 9f41693588cd
[3/3] STEP 10/10: LABEL "io.openshift.build.name"="dashboard-custom-1" "io.openshift.build.namespace"="vllm-semantic-router-system"
[3/3] COMMIT temp.builder.openshift.io/vllm-semantic-router-system/dashboard-custom-1:b889c1b9
--> 60ae08ff6b3b
Successfully tagged temp.builder.openshift.io/vllm-semantic-router-system/dashboard-custom-1:b889c1b9
60ae08ff6b3b309ffb812960d02f8a5467a0e06248e94b7f72f371262f087881

Pushing image image-registry.openshift-image-registry.svc:5000/vllm-semantic-router-system/dashboard-custom:latest ...
Getting image source signatures
Copying blob sha256:5f5e4aa0750379872c99d973f025ee83b403ba62048653c9c3ce21007a4a2071
Copying blob sha256:44cf07d57ee4424189f012074a59110ee2065adfdde9c7d9826bebdffce0a885
Copying blob sha256:13e1c16618c965ee731ad0a3d1ef41c28115d1b50ce173bd41d7fc3c68ceb986
Copying blob sha256:15d2209f4a40e83b5b39463275f5befe3c8fc62fd01a2ec22332d7f59126c549
Copying config sha256:60ae08ff6b3b309ffb812960d02f8a5467a0e06248e94b7f72f371262f087881
Writing manifest to image destination
Successfully pushed image-registry.openshift-image-registry.svc:5000/vllm-semantic-router-system/dashboard-custom@sha256:554e46892341ae0546c985925a996a473d4a3278c25c24d4d0000e8a72b92330
Push successful
[INFO] Deploying dashboard...
configmap/dashboard-config unchanged
deployment.apps/dashboard unchanged
service/dashboard unchanged
route.route.openshift.io/dashboard unchanged
[SUCCESS] Dashboard deployed
[INFO] Waiting for observability components to be ready...
Waiting for deployment "dashboard" rollout to finish: 0 of 1 updated replicas are available...
deployment "dashboard" successfully rolled out
[SUCCESS] Observability components deployed!

  Dashboard: https://dashboard-vllm-semantic-router-system.apps.ci-ln-r4xhntk-76ef8.aws-2.ci.openshift.org
  Grafana:   https://grafana-vllm-semantic-router-system.apps.ci-ln-r4xhntk-76ef8.aws-2.ci.openshift.org
  Prometheus: https://prometheus-vllm-semantic-router-system.apps.ci-ln-r4xhntk-76ef8.aws-2.ci.openshift.org

[SUCCESS] Deployment initiated! Check status with the following commands:

  # View all pods
  oc get pods -n vllm-semantic-router-system

  # View deployment status
  oc get deployments -n vllm-semantic-router-system

  # View services
  oc get services -n vllm-semantic-router-system

  # View routes
  oc get routes -n vllm-semantic-router-system

  # Check logs for vLLM Model-A
  oc logs -f deployment/vllm-model-a -n vllm-semantic-router-system

  # Check logs for vLLM Model-B
  oc logs -f deployment/vllm-model-b -n vllm-semantic-router-system

  # Check logs for Semantic Router
  oc logs -f deployment/semantic-router -c semantic-router -n vllm-semantic-router-system

  # Check logs for Envoy
  oc logs -f deployment/semantic-router -c envoy-proxy -n vllm-semantic-router-system

  # Check logs for Dashboard
  oc logs -f deployment/dashboard -n vllm-semantic-router-system

oc get pods -n vllm-semantic-router-system
NAME                               READY   STATUS                       RESTARTS   AGE
dashboard-5c8d689d95-hspls         1/1     Running                      0          6m11s
dashboard-custom-1-build           0/1     Completed                    0          6m7s
grafana-849f56f5bb-z2tk2           0/1     CreateContainerConfigError   0          6m9s
jaeger-6654695d69-4g82l            1/1     Running                      0          6m11s
llm-katan-1-build                  0/1     Completed                    0          13m
llm-katan-2-build                  1/1     Running                      0          6m12s
prometheus-77f57cb596-tfm9h        1/1     Running                      0          6m9s
semantic-router-7dff5467df-vgb6v   2/2     Running                      0          6m12s
vllm-model-a-5df98b7564-gkq6b      0/1     Pending                      0          6m12s
vllm-model-b-58b4f9b588-4gv9s      0/1     Pending                      0          6m12s
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment