A complete self-hosted AI platform deployed on AWS EC2 using MicroK8s, NVIDIA GPU Operator, vLLM, Open WebUI, Qdrant, FastAPI-based RAG, and a full LGTM observability stack (Grafana, Prometheus, Loki, Tempo, OpenTelemetry).
This project demonstrates how to build a production-style AI platform on Kubernetes using a single GPU-enabled EC2 instance.
The platform includes:
- GPU-enabled Kubernetes cluster using MicroK8s
- NVIDIA GPU Operator integration
- vLLM model serving
- Qwen2.5-1.5B-Instruct model
- Open WebUI chat interface
- Qdrant vector database
- Custom Retrieval-Augmented Generation (RAG) application
- Prometheus metrics
- Grafana dashboards
- Loki log aggregation
- Tempo distributed tracing
- OpenTelemetry Collector
The deployment was executed on:
AWS EC2 g5.xlarge
Ubuntu 24.04 LTS
NVIDIA A10G GPU (24 GB VRAM)
MicroK8s Kubernetes
┌─────────────────┐
│ Open WebUI │
└────────┬────────┘
│
▼
┌─────────────────┐
│ vLLM │
│ Qwen2.5-1.5B │
└────────┬────────┘
│
▼
┌─────────────────┐
│ RAG API │
│ FastAPI │
└────────┬────────┘
│
┌─────────────────┴─────────────────┐
│ │
▼ ▼
┌────────────────────┐ ┌────────────────────┐
│ Qdrant │ │ SentenceTransformer│
│ Vector Store │ │ Embeddings │
└────────────────────┘ └────────────────────┘
Observability Stack
┌───────────────────────────────────────────────┐
│ Grafana │
└───────────────┬─────────────┬─────────────────┘
│ │
▼ ▼
Prometheus Loki
Metrics Logs
│ │
└──────┬──────┘
▼
Tempo
Traces
│
▼
OpenTelemetry Collector
- AWS EC2 g5.xlarge
- Ubuntu 24.04 LTS
- NVIDIA A10G GPU
- Kubernetes
- MicroK8s
- Containerd
- Helm
- vLLM
- Qwen2.5-1.5B-Instruct
- Open WebUI
- FastAPI
- Qdrant
- Sentence Transformers
- Grafana
- Prometheus
- Loki
- Promtail
- Tempo
- OpenTelemetry Collector
.
├── README.md
├── docs/
├── manifests/
│ ├── vllm/
│ ├── qdrant/
│ ├── openwebui/
│ ├── rag-app/
│ └── observability/
│
├── applications/
│ └── rag-app/
│ ├── Dockerfile
│ ├── main.py
│ └── requirements.txt
│
├── runbooks/
├── scripts/
├── screenshots/
└── architecture/
- GPU-enabled Kubernetes scheduling
- NVIDIA GPU Operator
- CUDA validation
- vLLM GPU inference
- OpenAI-compatible API
- vLLM deployment
- Qwen2.5 model serving
- Open WebUI integration
POST /ingestPOST /queryGET /health- Qdrant
- Dense embeddings
- Similarity search
- Node Metrics
- Kubernetes Metrics
- AI Service Metrics
- Loki
- Promtail
- Grafana Explore
- Tempo
- OpenTelemetry Collector
- Distributed Tracing
Successfully validated:
- NVIDIA Driver Installation
- GPU Scheduling
- CUDA Test Pod
- vLLM Startup
- OpenAI Compatible Endpoint
- Open WebUI Integration
- Qdrant Deployment
- RAG Ingestion
- RAG Querying
- Prometheus Metrics
- Loki Logs
- Tempo Traces
- OpenTelemetry Collector
Request:
{
"question": "What is Qdrant used for?"
}Response:
{
"answer": "...",
"sources": [
{
"text": "Qdrant is a vector database used for retrieval augmented generation."
}
]
}Final deployment resource usage:
CPU Usage ~7%
Memory Usage ~49%
Running successfully on:
4 vCPU
16 GB RAM
1 x NVIDIA A10G GPU
Issue:
VLLM_PORT appears to be a URI
Solution:
enableServiceLinks: falseIssue:
Maximum context length exceeded
Solution:
--max-model-len 8192Issue:
AttributeError:
QdrantClient has no attribute searchSolution:
query_points()Issue:
Insufficient CPU
Solution:
Optimized CPU requests across:
- vLLM
- Open WebUI
- Qdrant
- Prometheus
Add screenshots here:
screenshots/
├── open-webui.png
├── grafana-dashboard.png
├── loki-logs.png
├── tempo-traces.png
├── qdrant-health.png
└── vllm-api-test.png
- Multi-node Kubernetes deployment
- Larger LLM models
- K6 load testing
- GitOps deployment using ArgoCD
- CI/CD integration
- GPU autoscaling
- Multi-tenant model serving
- Kubernetes
- MicroK8s
- NVIDIA GPU Operator
- AWS EC2
- vLLM
- Open WebUI
- Qdrant
- RAG
- FastAPI
- Docker
- Helm
- Prometheus
- Grafana
- Loki
- Tempo
- OpenTelemetry
- Observability
- Platform Engineering
- Site Reliability Engineering
Deepak Deorari
DevOps-III (Site Reliability Engineer III)
Built as a hands-on AI Platform Engineering, Kubernetes, GPU Infrastructure and Observability project.