English | 中文 | 🌐 Project Site
🏆 The most comprehensive Kubernetes-native LLMOps Platform — One command to deploy, manage, monitor, and optimize your entire LLM infrastructure.
[!NOTE] v1.0.0 released -- the v1.0 trio is complete: Operator (LLMPlatform / ModelDeployment / FineTuneRun CRDs) + kubectl-llmops CLI (15+ commands,
kubectl llmops <cmd>) + Headlamp Dashboard (Kubernetes UI +kube-llmops-portalplugin). See CHANGELOG for details.
kube-llmops is an opinionated, batteries-included Helm chart that deploys a complete LLM operations stack on Kubernetes:
kubectl-llmops) -- kubectl plugin with 15+ imperative commands: deploy, list, status, scale, canary, logs, test, port-forward, finetune, rag, platform, migrate, ...# Install from local source (recommended)
helm install kube-llmops charts/kube-llmops-stack -f values-minimal.yaml
See ARCHITECTURE.md for the full technical design.
API Demo![]() | Grafana Dashboards![]() |
GPU Monitoring (DCGM)![]() | vLLM Model Serving![]() |
Langfuse LLM Tracing![]() | MinIO Model Storage![]() |
Keycloak SSO![]() | LiteLLM Gateway![]() |
kind for CPU-only demo# Install from local source
helm install kube-llmops charts/kube-llmops-stack \
-f charts/kube-llmops-stack/values-single-node.yaml \
--set global.nodePort.enabled=true \
--set global.nodePort.host=$NODE_IP
# Or install with ingress
helm install kube-llmops charts/kube-llmops-stack \
-f values-minimal.yaml \
--set ingress.enabled=true \
--set ingress.host=llmops.local
# Or: CPU-only demo (no GPU required)
helm install kube-llmops charts/kube-llmops-stack -f values-ci.yaml
curl http://litellm.llmops.local/v1/chat/completions \
-H "Authorization: Bearer sk-kube-llmops-dev" \
-H "Content-Type: application/json" \
-d '{"model":"qwen2-5-0-5b","messages":[{"role":"user","content":"Hello!"}]}'
Option A: Ingress (recommended — no port-forward needed)
# Enable ingress during install
helm install kube-llmops charts/kube-llmops-stack \
-f values-minimal.yaml \
--set ingress.enabled=true \
--set ingress.host=llmops.local # or your real domain
# If no real domain, add to /etc/hosts:
NODE_IP=$(kubectl get node -o jsonpath='{.items[0].status.addresses[0].address}')
echo "$NODE_IP litellm.llmops.local grafana.llmops.local langfuse.llmops.local keycloak.llmops.local minio.llmops.local prometheus.llmops.local" | sudo tee -a /etc/hosts
| Service | Ingress URL | Default Credentials |
|---|---|---|
| LiteLLM (AI Gateway) | http://litellm.llmops.local | any username / sk-kube-llmops-dev |
| Grafana (Dashboards) | http://grafana.llmops.local | admin / admin123! |
| Langfuse (LLM Tracing) | http://langfuse.llmops.local | admin@kube-llmops.local / admin123! |
| Keycloak (SSO) | http://keycloak.llmops.local | admin / admin123! |
| MinIO (Object Storage) | http://minio.llmops.local | minioadmin / minioadmin |
| Prometheus (Metrics) | http://prometheus.llmops.local | No auth |
Option B: Port-forward (fallback)
kubectl port-forward svc/kube-llmops-litellm 4000:4000 &
kubectl port-forward svc/kube-llmops-grafana 3000:3000 &
kubectl port-forward svc/kube-llmops-langfuse 3001:3000 &
[!TIP] When SSO is enabled, use Keycloak credentials (
admin/admin123!) to log in to Grafana, Langfuse, and MinIO. The Keycloak user email (admin@kube-llmops.local) matches the Langfuse init user, so SSO login automatically sees existing projects and traces.
[!WARNING] These are development defaults. For production, override via
--set:helm install kube-llmops charts/kube-llmops-stack \ --set litellm.masterKey=sk-your-secret-key \ --set observability.grafana.adminPassword=your-grafana-pw \ --set langfuse.init.userPassword=your-langfuse-pw \ --set langfuse.externalUrl=https://langfuse.your-domain.com
| Feature | kube-llmops | Raw vLLM | KAITO | KServe |
|---|---|---|---|---|
| Engine auto-selection (GPTQ->vLLM, GGUF->llama.cpp) | Yes | N/A | No | No |
| AI Gateway (key mgmt, cost tracking, rate limit) | Yes | No | No | No |
| LLM tracing (prompt, tokens, cost per request) | Yes | No | No | No |
| Pre-built Grafana dashboards (11) + alert rules (8) | Yes | No | No | No |
| GPU monitoring (DCGM) | Yes | DIY | No | No |
| KEDA autoscaling (queue + TTFT + TPOT, scale-to-zero) | Yes | No | No | Partial |
| SSO integration (Keycloak OIDC) | Yes | No | No | No |
| S3 model storage (MinIO) | Yes | No | No | No |
| Container log aggregation (Fluent Bit + Loki) | Yes | No | No | No |
| RAG infrastructure (Dify + eval + guardrails) | Yes | No | No | No |
| One-click full stack | Yes | N/A | No | No |
| Cloud-agnostic | Yes | Yes | Azure only | Yes |
| Profile | GPU | Models | Monitoring | Tracing | Logging | Use Case |
|---|---|---|---|---|---|---|
values-ci.yaml | None | None (CPU) | Basic | Off | Off | CI / Demo |
values-minimal.yaml | 1x | 1 small | Prometheus + Grafana | Langfuse | Fluent Bit + Loki | Development |
values-standard.yaml | 4-8x | 2-3 | Full OTel stack | Langfuse | Fluent Bit + Loki | Team |
values-production.yaml | 16+x | N | Full + HA | Full | Full | Enterprise |
This project is Apache 2.0 licensed. However, some optional dependencies have different licenses:
| Component | License | Required? |
|---|---|---|
| Grafana | AGPL-3.0 | Optional (can bring your own) |
| Loki | AGPL-3.0 | Optional (can use OpenSearch) |
| All other components | Apache 2.0 / MIT / BSD | Yes |
If AGPL is a concern for your organization, Grafana and Loki can be disabled and replaced with your own visualization and log storage solutions.
Contributions welcome! See CONTRIBUTING.md for guidelines.
If you find this project useful, please give it a star! ⭐
good first issue and help wanted labels to get started contributingWe need your help to reach 1,000 stars! Every star, issue, PR, and discussion helps the project grow. Share kube-llmops with your team, write a blog post, or contribute a feature — all contributions are welcome ❤️
269 commits
1 commits
Go
46.8%
Python
35.0%
HCL
6.5%
Go Template
4.0%
Shell
4.0%
Makefile
2.1%
TypeScript
1.1%
English | 中文 | 🌐 Project Site
🏆 The most comprehensive Kubernetes-native LLMOps Platform — One command to deploy, manage, monitor, and optimize your entire LLM infrastructure.
[!NOTE] v1.0.0 released -- the v1.0 trio is complete: Operator (LLMPlatform / ModelDeployment / FineTuneRun CRDs) + kubectl-llmops CLI (15+ commands,
kubectl llmops <cmd>) + Headlamp Dashboard (Kubernetes UI +kube-llmops-portalplugin). See CHANGELOG for details.
kube-llmops is an opinionated, batteries-included Helm chart that deploys a complete LLM operations stack on Kubernetes:
kubectl-llmops) -- kubectl plugin with 15+ imperative commands: deploy, list, status, scale, canary, logs, test, port-forward, finetune, rag, platform, migrate, ...# Install from local source (recommended)
helm install kube-llmops charts/kube-llmops-stack -f values-minimal.yaml
See ARCHITECTURE.md for the full technical design.
API Demo![]() | Grafana Dashboards![]() |
GPU Monitoring (DCGM)![]() | vLLM Model Serving![]() |
Langfuse LLM Tracing![]() | MinIO Model Storage![]() |
Keycloak SSO![]() | LiteLLM Gateway![]() |
kind for CPU-only demo# Install from local source
helm install kube-llmops charts/kube-llmops-stack \
-f charts/kube-llmops-stack/values-single-node.yaml \
--set global.nodePort.enabled=true \
--set global.nodePort.host=$NODE_IP
# Or install with ingress
helm install kube-llmops charts/kube-llmops-stack \
-f values-minimal.yaml \
--set ingress.enabled=true \
--set ingress.host=llmops.local
# Or: CPU-only demo (no GPU required)
helm install kube-llmops charts/kube-llmops-stack -f values-ci.yaml
curl http://litellm.llmops.local/v1/chat/completions \
-H "Authorization: Bearer sk-kube-llmops-dev" \
-H "Content-Type: application/json" \
-d '{"model":"qwen2-5-0-5b","messages":[{"role":"user","content":"Hello!"}]}'
Option A: Ingress (recommended — no port-forward needed)
# Enable ingress during install
helm install kube-llmops charts/kube-llmops-stack \
-f values-minimal.yaml \
--set ingress.enabled=true \
--set ingress.host=llmops.local # or your real domain
# If no real domain, add to /etc/hosts:
NODE_IP=$(kubectl get node -o jsonpath='{.items[0].status.addresses[0].address}')
echo "$NODE_IP litellm.llmops.local grafana.llmops.local langfuse.llmops.local keycloak.llmops.local minio.llmops.local prometheus.llmops.local" | sudo tee -a /etc/hosts
| Service | Ingress URL | Default Credentials |
|---|---|---|
| LiteLLM (AI Gateway) | http://litellm.llmops.local | any username / sk-kube-llmops-dev |
| Grafana (Dashboards) | http://grafana.llmops.local | admin / admin123! |
| Langfuse (LLM Tracing) | http://langfuse.llmops.local | admin@kube-llmops.local / admin123! |
| Keycloak (SSO) | http://keycloak.llmops.local | admin / admin123! |
| MinIO (Object Storage) | http://minio.llmops.local | minioadmin / minioadmin |
| Prometheus (Metrics) | http://prometheus.llmops.local | No auth |
Option B: Port-forward (fallback)
kubectl port-forward svc/kube-llmops-litellm 4000:4000 &
kubectl port-forward svc/kube-llmops-grafana 3000:3000 &
kubectl port-forward svc/kube-llmops-langfuse 3001:3000 &
[!TIP] When SSO is enabled, use Keycloak credentials (
admin/admin123!) to log in to Grafana, Langfuse, and MinIO. The Keycloak user email (admin@kube-llmops.local) matches the Langfuse init user, so SSO login automatically sees existing projects and traces.
[!WARNING] These are development defaults. For production, override via
--set:helm install kube-llmops charts/kube-llmops-stack \ --set litellm.masterKey=sk-your-secret-key \ --set observability.grafana.adminPassword=your-grafana-pw \ --set langfuse.init.userPassword=your-langfuse-pw \ --set langfuse.externalUrl=https://langfuse.your-domain.com
| Feature | kube-llmops | Raw vLLM | KAITO | KServe |
|---|---|---|---|---|
| Engine auto-selection (GPTQ->vLLM, GGUF->llama.cpp) | Yes | N/A | No | No |
| AI Gateway (key mgmt, cost tracking, rate limit) | Yes | No | No | No |
| LLM tracing (prompt, tokens, cost per request) | Yes | No | No | No |
| Pre-built Grafana dashboards (11) + alert rules (8) | Yes | No | No | No |
| GPU monitoring (DCGM) | Yes | DIY | No | No |
| KEDA autoscaling (queue + TTFT + TPOT, scale-to-zero) | Yes | No | No | Partial |
| SSO integration (Keycloak OIDC) | Yes | No | No | No |
| S3 model storage (MinIO) | Yes | No | No | No |
| Container log aggregation (Fluent Bit + Loki) | Yes | No | No | No |
| RAG infrastructure (Dify + eval + guardrails) | Yes | No | No | No |
| One-click full stack | Yes | N/A | No | No |
| Cloud-agnostic | Yes | Yes | Azure only | Yes |
| Profile | GPU | Models | Monitoring | Tracing | Logging | Use Case |
|---|---|---|---|---|---|---|
values-ci.yaml | None | None (CPU) | Basic | Off | Off | CI / Demo |
values-minimal.yaml | 1x | 1 small | Prometheus + Grafana | Langfuse | Fluent Bit + Loki | Development |
values-standard.yaml | 4-8x | 2-3 | Full OTel stack | Langfuse | Fluent Bit + Loki | Team |
values-production.yaml | 16+x | N | Full + HA | Full | Full | Enterprise |
This project is Apache 2.0 licensed. However, some optional dependencies have different licenses:
| Component | License | Required? |
|---|---|---|
| Grafana | AGPL-3.0 | Optional (can bring your own) |
| Loki | AGPL-3.0 | Optional (can use OpenSearch) |
| All other components | Apache 2.0 / MIT / BSD | Yes |
If AGPL is a concern for your organization, Grafana and Loki can be disabled and replaced with your own visualization and log storage solutions.
Contributions welcome! See CONTRIBUTING.md for guidelines.
If you find this project useful, please give it a star! ⭐
good first issue and help wanted labels to get started contributingWe need your help to reach 1,000 stars! Every star, issue, PR, and discussion helps the project grow. Share kube-llmops with your team, write a blog post, or contribute a feature — all contributions are welcome ❤️
269 commits
1 commits
Go
46.8%
Python
35.0%
HCL
6.5%
Go Template
4.0%
Shell
4.0%
Makefile
2.1%
TypeScript
1.1%