Commit 86bc5442 authored by julienmancuso's avatar julienmancuso Committed by GitHub
Browse files

feat: add script to deploy a Dynemo pipeline in k8s using helm (#42)

parent 3f84cdad
# deploy Dynamo pipeline on Kubernetes
This is a proof of concept for a Helm chart to deploy services defined in a bento.yaml configuration.
## Usage
### Prerequisites
- make sure dynamo cli is installed
### Install the Helm chart
```bash
./deploy.sh <docker_registry> <k8s_namespace> <bento_name> <path_to_bento_directory>
# example./deploy.sh nvcr.io/nvidian/nim-llm-dev my-namespace my-helm-poc ../deploy/compoundai/sdk/examples/basic_service
```
\ No newline at end of file
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
apiVersion: v2
name: dynamo-pipeline
description: A Helm chart to deploy a Dynamo pipeline on Kubernetes
type: application
version: 0.1.0
appVersion: 1.0.0
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
{{- range .Values.services }}
apiVersion: apps/v1
kind: Deployment
metadata:
name: poc-{{ .name | lower }}
labels:
app: {{ .name | lower }}
spec:
replicas: 1
selector:
matchLabels:
app: poc-{{ .name | lower }}
template:
metadata:
labels:
app: poc-{{ .name | lower }}
spec:
# pull secrets
imagePullSecrets:
- name: yatai-regcred
securityContext:
runAsUser: 0
containers:
- name: poc-{{ .name | lower }}
image: {{ $.Values.image }}
args:
- uv run compoundai start --service-name {{ .name }}
command:
- sh
- -c
resources:
requests:
cpu: "{{ .config.resources.cpu }}"
limits:
cpu: "{{ .config.resources.cpu }}"
env:
- name: TRAFFIC_TIMEOUT
value: "{{ .config.traffic.timeout }}"
{{- if and .config.nova .config.nova.enabled }}
- name: NOVA_NAMESPACE
value: "{{ .config.nova.namespace }}"
- name: NOVA_NAME
value: "{{ .config.nova.name }}"
{{- end }}
{{- if .config.workers }}
- name: WORKERS
value: "{{ .config.workers }}"
{{- end }}
- name: PORT
value: "3000"
- name: NATS_SERVER
value: nats://my-nats:4222
- name: ETCD_ENDPOINTS
value: etcd:2379
---
{{- end }}
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
{{- range .Values.services }}
apiVersion: v1
kind: Service
metadata:
name: {{ .name | lower }}
spec:
selector:
app: {{ .name | lower }}
ports:
- protocol: TCP
port: 80
targetPort: 3000
---
{{- end }}
#!/bin/bash
# SPDX-FileCopyrightText: Copyright (c) 2024-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
set -euo pipefail
# Validate input parameters
if [ "$#" -ne 4 ]; then
echo "Usage: $0 <DOCKER_REGISTRY> <NAMESPACE> <BENTO_NAME> <BENTO_DIRECTORY>"
exit 1
fi
DOCKER_REGISTRY=$1
NAMESPACE=$2
BENTO_NAME=$3
BENTO_DIRECTORY=$4
# Check if any of the inputs are empty
if [[ -z "$DOCKER_REGISTRY" || -z "$NAMESPACE" || -z "$BENTO_NAME" || -z "$BENTO_DIRECTORY" ]]; then
echo "Error: All input parameters (DOCKER_REGISTRY, NAMESPACE, BENTO_NAME, BENTO_DIRECTORY) must be non-empty."
exit 1
fi
# Check if the specified directory exists
if [ ! -d "$BENTO_DIRECTORY" ]; then
echo "Error: Directory $BENTO_DIRECTORY does not exist."
exit 1
fi
echo "Logging into Docker registry: $DOCKER_REGISTRY"
docker login "$DOCKER_REGISTRY"
# Change to the specified directory
cd "$BENTO_DIRECTORY"
# Update the bentofile.yaml with the new BENTO_NAME
echo "Updating bentofile.yaml with name: $BENTO_NAME"
yq eval ".name = \"$BENTO_NAME\"" -i bentofile.yaml
# Build the Bento container
echo "Building Bento image for $BENTO_NAME..."
DOCKER_DEFAULT_PLATFORM=linux/amd64 uv run dynamo build --containerize
# Find the built image
docker_image=$(docker images --format "{{.Repository}}:{{.Tag}} {{.CreatedAt}}" | grep "^$BENTO_NAME:" | sort -r | head -n 1 | awk '{print $1}')
if [[ -z "$docker_image" ]]; then
echo "Failed to find the built image for $BENTO_NAME"
exit 1
fi
# Extract the image tag (SHA) from the docker image info
docker_sha=$(echo "$docker_image" | awk -F':' '{print $2}')
echo "Found Docker image: $docker_image"
echo "Docker SHA (bento-version): $docker_sha"
# Tag the image for the registry
docker_tag_for_registry="$DOCKER_REGISTRY/$docker_image"
echo "Tagging image: $docker_tag_for_registry"
docker tag "$docker_image" "$docker_tag_for_registry"
# Push the image
echo "Pushing image: $docker_tag_for_registry"
docker push "$docker_tag_for_registry"
cd -
# Install the Helm chart with the correct bento-version (SHA)
echo "Installing Helm chart with image: $docker_tag_for_registry and bento-version: $docker_sha"
helm install "$BENTO_NAME" ./poc -f ~/bentoml/bentos/"$BENTO_NAME"/"$docker_sha"/bento.yaml --set image="$docker_tag_for_registry" -n "$NAMESPACE"
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment