{"slug": "kubeflow-without-kubernetes-deploy-a-complete-mlops-suite-in-60-seconds-with", "title": "Kubeflow Without Kubernetes? Deploy a Complete MLOps Suite in 60 Seconds with Gubernator", "summary": "A developer has introduced Gubernator, a single-binary container orchestrator written in Go, which can deploy a complete MLOps suite including JupyterLab, MLflow, MinIO, and Ollama in under 60 seconds using standard Docker Compose syntax, without the overhead of Kubernetes. The tool aims to simplify MLOps deployment by replacing Kubernetes components with a lightweight Go binary and built-in Caddy ingress, reducing control plane memory usage from 16-32 GB to under 200 MB.", "body_md": "If you’ve ever tried setting up **Kubeflow** on Kubernetes, you know the drill:\n\n`docker-compose.yml`\n\n`gbnt`\n\n)[Gubernator](https://github.com/mario-ezquerro/gubernator) is a single-binary container orchestrator written in Go that combines:\n\n`/var/contenedores`\n\n) across cluster nodes.\n┌─────────────────────────────────────────────────────────────┐ │ Data Scientist / AI Engineer │ └──────────────────────────────┬──────────────────────────────┘ │ (https://*.kubeflow.gbnt.local) ▼ ┌─────────────────────────────────────────────────────────────┐ │ Built-in Caddy Ingress & CoreDNS Gateway │ └──────┬──────────────┬──────────────┬──────────────┬─────────┘ │ │ │ │ ▼ ▼ ▼ ▼ ┌──────────────┐┌──────────────┐┌──────────────┐┌──────────────┐ │ JupyterLab ││ MLflow ││ MinIO S3 ││ Ollama / vLLM│ │ Workspace ││ Tracking ││ Artifacts & ││ Inference │ │ (PyTorch) ││ & Registry ││ Datasets ││ Serving │ │ (:8888) ││ (:5000) ││ (:9001) ││ (:11434) │ └──────────────┘└──────────────┘└──────────────┘└──────────────┘\n\n| Capability | Kubernetes Kubeflow | Gubernator MLOps (`kubeflow-stack` ) |\n|---|---|---|\nControl Plane Overhead |\n16 GB – 32 GB RAM (etcd, Istio, K8s) |\n< 200 MB RAM (Go binary) |\nConfiguration Format |\nHelm / Kustomize / CRD manifests | Standard `docker-compose.yml` |\nDeployment Time |\n30–45 minutes | < 60 seconds |\nExperiment Tracking |\nKatib + Kubeflow Metadata | MLflow Tracking + Model Registry |\nArtifact Store |\nMinIO on PVCs | MinIO S3 with Granaries Storage |\nInference Serving |\nKServe + Knative + Istio | Ollama / vLLM (OpenAI API compatible) |\nDomain Routing & TLS |\nVirtualServices + IngressGateway | Automatic Caddy Ingress (`*.local` ) |\n\nHere is the entire stack defined in standard Docker Compose syntax:\n\n```\nversion: \"3.8\"\nservices:\n  # 1. MinIO S3 Object Storage (Datasets & Model Checkpoints)\n  minio:\n    image: minio/minio:latest\n    restart: unless-stopped\n    command: server /data --console-address \":9001\"\n    environment:\n      - MINIO_ROOT_USER=kubeflow\n      - MINIO_ROOT_PASSWORD=gubernator123\n    ports:\n      - \"9000:9000\"\n      - \"9001:9001\"\n    volumes:\n      - /var/contenedores/kubeflow/minio_data:/data\n    labels:\n      - \"ingress.host=minio.kubeflow.gbnt.local\"\n      - \"gbnt.caddy.port=9001\"\n      - \"gbnt.service.name=minio-s3\"\n  # 2. MLflow Tracking Server & Model Registry\n  mlflow:\n    image: ghcr.io/mlflow/mlflow:latest\n    restart: unless-stopped\n    command: >\n      mlflow server\n      --host 0.0.0.0\n      --port 5000\n      --workers 1\n      --allowed-hosts \"*\"\n      --backend-store-uri sqlite:////data/mlflow.db\n      --default-artifact-root s3://mlflow-artifacts/\n    environment:\n      - AWS_ACCESS_KEY_ID=kubeflow\n      - AWS_SECRET_ACCESS_KEY=gubernator123\n      - MLFLOW_S3_ENDPOINT_URL=http://minio.kubeflow.gbnt.local\n      - MLFLOW_S3_IGNORE_TLS=true\n      - MLFLOW_ALLOWED_HOSTS=*\n    ports:\n      - \"5000:5000\"\n    volumes:\n      - /var/contenedores/kubeflow/mlflow_data:/data\n    labels:\n      - \"ingress.host=mlflow.kubeflow.gbnt.local\"\n      - \"gbnt.caddy.port=5000\"\n      - \"gbnt.service.name=mlflow-tracking\"\n  # 3. Interactive JupyterLab & PyTorch Workspaces\n  jupyter-workspace:\n    image: quay.io/jupyter/pytorch-notebook:latest\n    restart: unless-stopped\n    environment:\n      - JUPYTER_TOKEN=gubernator-secret\n      - JUPYTER_ENABLE_LAB=yes\n      - AWS_ACCESS_KEY_ID=kubeflow\n      - AWS_SECRET_ACCESS_KEY=gubernator123\n      - MLFLOW_TRACKING_URI=http://mlflow.kubeflow.gbnt.local\n      - MLFLOW_S3_ENDPOINT_URL=http://minio.kubeflow.gbnt.local\n    ports:\n      - \"8888:8888\"\n    volumes:\n      - /var/contenedores/kubeflow/workspaces:/home/jovyan/work\n      - /var/contenedores/kubeflow/cache:/home/jovyan/.cache\n    labels:\n      - \"ingress.host=notebooks.kubeflow.gbnt.local\"\n      - \"gbnt.caddy.port=8888\"\n      - \"gbnt.service.name=jupyterlab\"\n  # 4. Model Serving & LLM Inference Gateway\n  inference-engine:\n    image: ollama/ollama:latest\n    restart: unless-stopped\n    ports:\n      - \"11434:11434\"\n    volumes:\n      - /var/contenedores/kubeflow/models:/root/.ollama\n    labels:\n      - \"ingress.host=inference.kubeflow.gbnt.local\"\n      - \"gbnt.caddy.port=11434\"\n      - \"gbnt.service.name=model-serving\"\n```\n\n🛠️ Deploying in 1 Command\n\nOn your Gubernator cluster, run:\n\n```\ngbnt stack deploy kubeflow-stack -c docker-compose.yml\nOr open the Gubernator Web Dashboard (http://localhost:4001), head over to Compose Studio, select the Kubeflow MLOps Blueprint, and click Deploy Stack.\n```\n\nGubernator's scheduler automatically:\n\nPrioritizes Centurion Worker nodes over the Manager.\n\nSpreads the workloads evenly across available workers.\n\nAutomatically sets up internal DNS (CoreDNS) and reverse proxy routes (Caddy Ingress).\n\nGenerates instant TLS certificates for all services.\n\nInstant Endpoints & Access\n\nImmediately after deployment, your MLOps platform is ready:\n\nJupyterLab Workspace: [https://notebooks.kubeflow.gbnt.local](https://notebooks.kubeflow.gbnt.local) (Token: gubernator-secret)\n\nMLflow Experiment Tracking: [https://mlflow.kubeflow.gbnt.local](https://mlflow.kubeflow.gbnt.local)\n\nMinIO S3 Console: [https://minio.kubeflow.gbnt.local](https://minio.kubeflow.gbnt.local) (User: kubeflow / Pass: gubernator123)\n\n⚡ Ollama Inference Engine: [https://inference.kubeflow.gbnt.local](https://inference.kubeflow.gbnt.local) (OpenAI-compatible /v1/chat/completions)\n\n🧪 Testing the End-to-End Pipeline in Python\n\nData scientists can write normal Python code to log experiments, save models to MinIO S3, and serve predictions:\n\n``` python\nimport mlflow\nimport mlflow.sklearn\nfrom sklearn.ensemble import RandomForestClassifier\nfrom sklearn.datasets import load_iris\nimport os\n# Connect to the cluster's MLflow server\nos.environ[\"MLFLOW_S3_ENDPOINT_URL\"] = \"http://minio.kubeflow.gbnt.local\"\nos.environ[\"AWS_ACCESS_KEY_ID\"] = \"kubeflow\"\nos.environ[\"AWS_SECRET_ACCESS_KEY\"] = \"gubernator123\"\nmlflow.set_tracking_uri(\"http://mlflow.kubeflow.gbnt.local\")\nmlflow.set_experiment(\"iris-classification-demo\")\nwith mlflow.start_run():\n    X, y = load_iris(return_X_y=True)\n    clf = RandomForestClassifier(n_estimators=100, max_depth=4)\n    clf.fit(X, y)\n    # Log metrics\n    accuracy = clf.score(X, y)\n    mlflow.log_param(\"n_estimators\", 100)\n    mlflow.log_metric(\"accuracy\", accuracy)\n    # Persist model to MinIO S3 and register\n    mlflow.sklearn.log_model(clf, \"model\", registered_model_name=\"IrisProductionModel\")\n    print(f\"✅ Training completed! Accuracy: {accuracy * 100:.2f}%\")\n```\n\n`\n\nKey Takeaways\n\nYou don't always need Kubernetes: If you are not running hundreds of parallel multi-step distributed DAG pipelines with Argo, Kubernetes adds unnecessary friction and cost.\n\nStandard Compose is enough: With an orchestrator like Gubernator, you get clustering, load balancing, health checks, automated Ingress, and persistent storage using simple, familiar Docker Compose files.\n\nResource Efficiency: You save 10x-20x the RAM, allowing you to invest your hardware budget where it actually matters: GPUs and model training.\n\n🔗 Project Links\n\n🐙 GitHub Repository: mario-ezquerro/gubernator\n\n📖 Documentation: Gubernator Docs\n\n⭐ Give it a star on GitHub if you found this useful!", "url": "https://wpnews.pro/news/kubeflow-without-kubernetes-deploy-a-complete-mlops-suite-in-60-seconds-with", "canonical_source": "https://dev.to/gde/kubeflow-without-kubernetes-deploy-a-complete-mlops-suite-in-60-seconds-with-gubernator-3moo", "published_at": "2026-08-28 11:28:35+00:00", "updated_at": "2026-08-28 11:50:35.713886+00:00", "lang": "en", "topics": ["mlops", "developer-tools", "ai-infrastructure"], "entities": ["Gubernator", "Kubeflow", "MLflow", "MinIO", "Ollama", "JupyterLab", "Caddy", "vLLM"], "alternates": {"html": "https://wpnews.pro/news/kubeflow-without-kubernetes-deploy-a-complete-mlops-suite-in-60-seconds-with", "markdown": "https://wpnews.pro/news/kubeflow-without-kubernetes-deploy-a-complete-mlops-suite-in-60-seconds-with.md", "text": "https://wpnews.pro/news/kubeflow-without-kubernetes-deploy-a-complete-mlops-suite-in-60-seconds-with.txt", "jsonld": "https://wpnews.pro/news/kubeflow-without-kubernetes-deploy-a-complete-mlops-suite-in-60-seconds-with.jsonld"}}