Kubernetes Setup: Ollama + OpenWebUI + DeepSeek-R1

Opis projektu

Ten projekt przedstawia wdrożenie Ollamy, OpenWebUI i modelu DeepSeek-R1 na klastrze Kubernetes. Jest to kompletne rozwiązanie umożliwiające uruchomienie własnego środowiska AI z interfejsem webowym.

Wykorzystane narzędzia

  • Kubernetes
  • Devbox
  • Taskfile
  • Docker

Architektura rozwiązania

Projekt składa się z trzech głównych komponentów:

  • Ollama – backend AI obsługujący modele językowe
  • OpenWebUI – przyjazny interfejs użytkownika do interakcji z modelami
  • DeepSeek-R1 – model językowy zoptymalizowany pod kątem wydajności

Struktura projektu

.
├── manifests/
│   ├── Ingress.yaml
│   ├── Namespace.yaml
│   ├── Ollama.yaml
│   ├── OllamaService.yaml
│   ├── OpenWebUI.yaml
│   ├── Service.yaml
│   └── Volume.yaml
├── scripts/
├── devbox.json
├── devbox.lock
├── README.md
└── Taskfile.yaml

Instrukcja instalacji

Wymagania wstępne

Przed rozpoczęciem instalacji upewnij się, że masz zainstalowane niezbędne komponenty:

System operacyjny

  • Windows:
    • WSL2 (Windows Subsystem for Linux)
    • Docker Desktop
  • macOS:
    • Docker Desktop
  • Linux:
    • Docker

Instalacja Devbox

  1. Zainstaluj Devbox za pomocą skryptu instalacyjnego:
    curl -fsSL https://get.jetify.com/devbox | bash
    

Pozostałe wymagania

  • Klaster Kubernetes (np. Kind)
  • Minimum 8GB RAM
  • 4 rdzenie CPU
  • 20GB przestrzeni dyskowej

Krok po kroku

  1. Inicjalizacja i konfiguracja Devbox:

    devbox init
    devbox add kubectl
    devbox add k9s
    devbox add helm
    devbox add task
    devbox add jq
    devbox add yq
    
  2. Uruchom środowisko Devbox:

    devbox shell
    
  3. Utwórz dedykowaną przestrzeń nazw:

    task create-namespace
    
  4. Wdróż wszystkie komponenty:

    task deploy-all
    
  5. Poczekaj na pobranie modelu DeepSeek-R1:

    task fetch-model
    
  6. Skonfiguruj przekierowanie portów:

    task port-forward
    
  7. Otwórz aplikację w przeglądarce:

    http://localhost:3000
    

Przykłady działania

Przykład odpowiedzi modelu na pytanie historyczne:

DeepSeek - Odpowiedź na pytanie

Generowanie kodu przez model:

DeepSeek - Kod Pythona

Konfiguracja zadań (Taskfile)

Poniżej znajduje się kompletna konfiguracja zadań w pliku Taskfile.yaml:

version: "3"

tasks:
  create-namespace:
    desc: "Create namespace"
    cmds:
      - kubectl create namespace ai-stack || true

  deploy-volume:
    desc: "Deploy volume"
    cmds:
      - kubectl apply -f manifests/Volume.yaml -n ai-stack

  deploy-ollama:
    desc: "Deploy Ollama"
    cmds:
      - kubectl apply -f manifests/Ollama.yaml -n ai-stack

  deploy-openwebui:
    desc: "Deploy OpenWebUI"
    cmds:
      - kubectl apply -f manifests/OpenWebUI.yaml -n ai-stack

  deploy-service:
    desc: "Deploy Service"
    cmds:
      - kubectl apply -f manifests/Service.yaml -n ai-stack
  
  deploy-service-ollama:
    desc: "Deploy Service-ollama"
    cmds:
      - kubectl apply -f manifests/OllamaService.yaml -n ai-stack
  
  deploy-ingress:
    desc: "Deploy Ingress"
    cmds:
      - kubectl apply -f manifests/Ingress.yaml -n ai-stack

  fetch-model:
    desc: "Pobranie modelu DeepSeek dla Ollamy"
    cmds:
      - |
        echo "Czekam na start kontenera Ollama..."
        until kubectl get pod -n ai-stack -l app=ollama -o jsonpath="{.items[0].status.phase}" | grep -q "Running"; do
          sleep 5
          echo "Czekam dalej..."
        done
        echo "Kontener uruchomiony, pobieram model..."
        kubectl exec -n ai-stack $(kubectl get pod -n ai-stack -l app=ollama -o jsonpath="{.items[0].metadata.name}") -- bash -c "
          ollama run deepseek-r1:1.5b"
    silent: false

  port-forward:
    desc: "Port forwarding for OpenWebUI and Ollama"
    cmds:
      - kubectl port-forward -n ai-stack svc/openwebui 3000:80 &
      - kubectl port-forward -n ai-stack svc/ollama 11434:11434 &
    silent: false

  deploy-all:
    desc: "Deploy all components"
    cmds:
      - task: create-namespace
      - task: deploy-volume
      - task: deploy-ollama
      - task: deploy-openwebui
      - task: deploy-service
      - task: deploy-service-ollama
      - task: deploy-ingress
      - task: fetch-model

  clean:
    desc: "Clean up the environment"
    cmds:
      - kubectl delete namespace ai-stack

Rozwiązywanie problemów

  1. Sprawdzanie statusu wdrożenia:

    kubectl get pods -n ai-stack
    
  2. Sprawdzanie logów:

    kubectl logs -n ai-stack -l app=openwebui
    kubectl logs -n ai-stack -l app=ollama
    
  3. Wymagania sprzętowe:

    • Minimum 8GB RAM
    • 4 rdzenie CPU
    • 20GB przestrzeni dyskowej

Uwagi końcowe

  • Model DeepSeek-R1 jest zoptymalizowany pod kątem wydajności, ale może działać wolniej na słabszych maszynach
  • W przypadku problemów z dostępem do interfejsu, sprawdź status przekierowania portów
  • Regularnie monitoruj zużycie zasobów klastra

🚀 Powodzenia w implementacji!