Licensed to be used in conjunction with basebox, only.
// installation
Kubernetes
Gilt für
Produkt: Server · Zielgruppe: Platform Operator
Cluster-Anforderungen für basebox, Ingress-Controller, CloudNativePG und die Unterschiede zwischen Einzelknoten und CPU-/GPU-Knoten-Layout. Am Ende dieses Schritts bietet Ihr Cluster alles, was das basebox-Umbrella-Chart voraussetzt.
Offizielle Dokumentation: Kubernetes mit kubeadm · Calico · CloudNativePG · ingress-nginx
Was das Chart verlangt
| Anforderung | Wert |
|---|---|
| Kubernetes | 1.23+ (geprüft: 1.33.7; 1.33+ empfohlen) |
| Helm | 3.x (geprüft: 3.20.0) |
| Ingress-Controller | Beliebig; das Chart bringt nginx-Annotationen mit |
| Speicher | Dynamische Volume-Bereitstellung mit einer Standard-Storage-Class |
| Datenbanken | CloudNativePG-Operator im Cluster |
| GPU | NVIDIA GPU Operator (oder Vergleichbares) auf GPU-Knoten – siehe NVIDIA / GPU |
| Registry | Pull-Zugang zu gitea.basebox.health aus der Runtime der Knoten |
1. Kubernetes installieren (kubeadm)
Der geprüfte Weg mit kubeadm, containerd und Calico steht mit allen Befehlen unter Server Preparation Guide → Schritt 7. Die Reihenfolge:
- Kubernetes-Repository (1.33) einbinden,
kubelet kubeadm kubectlinstallieren und perapt-mark holdfixieren. - Swap deaktivieren; Kernel-Module
overlay,br_netfilterund die sysctl-Parameter für Bridge-Netfilter und IP-Forwarding setzen. - containerd konfigurieren, bevor Sie
kubeadm initausführen – die Standardkonfiguration hat das CRI-Plugin deaktiviert: sudo kubeadm init --pod-network-cidr=10.244.0.0/16, dann kubeconfig für Ihren Benutzer einrichten.- Netzwerk-Plugin:
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.31.3/manifests/calico.yaml - Prüfen:
kubectl get nodeszeigt den KnotenReady.
Alternative Distributionen wie k3s funktionieren; beachten Sie dort das DNS-Problem mit systemd-resolved – Lösung in der FAQ.
2. Einzelknoten oder mehrere Knoten
Einzelknoten (die Referenzkonfigurationen): Control Plane und Workloads auf derselben Maschine. Der Control-Plane-Taint verhindert standardmäßig, dass Pods geplant werden. Zwei Wege:
- Tolerations in den Values der Komponenten, die sie brauchen (GPU Operator; siehe dessen Values-Datei im Server Preparation Guide) – der saubere Weg für Produktion.
- Taint entfernen – nur für Entwicklung/Test:
CPU- und GPU-Knoten: Die basebox-Plattform läuft auf CPU-Knoten, Service-Modelle und Inferenz auf GPU-Knoten. Labeln Sie Knoten (nvidia.com/gpu: "true", ggf. gpu-type) und nutzen Sie nodeSelector/tolerations in den Values der GPU-Dienste – Beispiele auf den Seiten Inference Server und Ragsrv. Der GPU Operator muss nur auf den GPU-Knoten arbeiten.
Getrennte Cluster für Plattform und Inferenz: Deployment-Topologien.
3. Ingress-Controller
Das Chart konfiguriert Ingress-Ressourcen mit nginx-Annotationen: 20 MB Body für Uploads, große Puffer für JWT-Header, 24-Stunden-Timeouts für WebSocket und Streaming, Pufferung aus, CORS, Cache-Control. Installieren Sie ingress-nginx (oder einen Controller, der diese Annotationen versteht) und merken Sie sich die Ingress-Klasse (nginx) und die externe IP:
Die Annotationen im Detail: Helm-Chart-Übersicht → Ingress-Konfiguration.
4. Storage Class
basebox braucht dynamische Volume-Bereitstellung für die PostgreSQL-Cluster, Medien und Modell-Caches. Für die Evaluierung genügt eine lokale Storage Class (local-path, Standard im Schnellstart); für Produktion eine Storage Class auf SSD/NVMe mit Snapshots oder Replikation. Setzen Sie sie als Standard oder benennen Sie sie in den Values (storageClass). Kapazitätsplanung: Speicher.
5. CloudNativePG-Operator
Jeder basebox-Dienst mit Datenbank (AISRV, storesrv, ragsrv, Keycloak) erhält einen eigenen PostgreSQL-Cluster, verwaltet von CloudNativePG:
helm repo add cnpg https://cloudnative-pg.github.io/charts
helm upgrade --install cnpg \
--namespace cnpg-system \
--create-namespace \
cnpg/cloudnative-pg
kubectl get pods -n cnpg-system
Das Umbrella-Chart enthält den Operator ebenfalls als Abhängigkeit (cnpg-operator.fullnameOverride: cnpg); installieren Sie ihn nur einmal – entweder vorab wie hier oder über das Chart.
6. cert-manager (optional)
Für öffentliche Domains mit automatischen Zertifikaten: cert-manager installieren und einen ClusterIssuer (z. B. letsencrypt-prod) anlegen. Bei interner CA oder Evaluierung nicht nötig – siehe Netzwerk.
7. Prüfen
kubectl get nodes -o wide
kubectl get pods -A
kubectl get storageclass
kubectl get svc -A | grep -i ingress
kubectl get pods -n cnpg-system
kubectl get pods -n gpu-operator # auf GPU-Knoten
kubectl describe nodes | grep -A5 "Allocated resources"
Alles Ready/Running, eine Standard-Storage-Class, eine Ingress-IP, GPU-Ressourcen auf den GPU-Knoten – dann ist der Cluster bereit.
Häufige Fehlerbilder
| Symptom | Ursache | Lösung |
|---|---|---|
kubeadm init: „unknown service runtime.v1.RuntimeService" |
containerd-CRI deaktiviert | Schritt 1.3, dann kubeadm reset und erneut init |
Pods Pending |
Control-Plane-Taint, keine Storage Class, keine GPU | Tolerations; kubectl get pvc; GPU Operator prüfen |
inference/ragsrv-support: „Temporary error in name resolution" |
k3s mit systemd-resolved | coredns auf externen DNS zeigen lassen (FAQ) |
| Image-Pull scheitert auf Knoten | Registry-Zugang der Runtime | Pull aus der Runtime testen, nicht nur von der Workstation |
Nächster Schritt: Speicher