Zum Hauptinhalt springen

GPU auf Kubernetes bereitstellen

Hikube ermöglicht es, Node Groups mit NVIDIA-GPUs zu Ihren Kubernetes-Clustern hinzuzufügen. Diese Anleitung erklärt, wie Sie einen Cluster mit GPU-Workern konfigurieren, Pods bereitstellen, die GPU-Beschleunigung nutzen, und spezialisierte Node Groups einrichten.

Voraussetzungen

  • kubectl konfiguriert mit Ihrem Hikube-Kubeconfig
  • Ein bestehender Kubernetes-Cluster auf Hikube (oder ein bereitstellungsbereites Manifest)
  • Vertrautheit mit den Konzepten von Kubernetes auf Hikube

Schritte

1. GPU Node Group zum Cluster hinzufügen

Ändern Sie das Manifest Ihres Clusters, um eine Node Group mit GPU hinzuzufügen. Die GPU-Konfiguration erfolgt auf Node Group-Ebene über gpus[].name:

cluster-gpu.yaml
apiVersion: apps.cozystack.io/v1alpha1
kind: Kubernetes
metadata:
name: cluster-gpu
spec:
controlPlane:
replicas: 1

nodeGroups:
default-workers:
minReplicas: 1
maxReplicas: 3
instanceType: "u1.large"
ephemeralStorage: 50Gi

gpu-workers:
minReplicas: 1
maxReplicas: 5
instanceType: "u1.xlarge"
ephemeralStorage: 100Gi
gpus:
- name: "nvidia.com/AD102GL_L40S"

addons:
# Erforderlich: installiert die NVIDIA-Treiber und das Device Plugin
gpuOperator:
enabled: true
Addon gpuOperator erforderlich

Das Anhängen der GPUs an die Node Groups reicht nicht aus: ohne addons.gpuOperator.enabled: true werden die NVIDIA-Treiber und das Device Plugin nicht im Tenant-Cluster installiert, und nvidia.com/gpu bleibt bei 0 auf den Nodes.

Tipp

Trennen Sie Ihre CPU- und GPU-Workloads in separate Node Groups. Dies ermöglicht eine unabhängige Skalierung und eine bessere Kostenkontrolle.

2. Cluster-Konfiguration anwenden

kubectl apply -f cluster-gpu.yaml

Warten Sie, bis die GPU-Nodes bereit sind:

kubectl get nodes -w

Erwartetes Ergebnis:

NAME                        STATUS   ROLES    AGE   VERSION
cluster-gpu-cp-0 Ready master 5m v1.29.x
cluster-gpu-gpu-workers-0 Ready <none> 3m v1.29.x

3. GPU-Verfügbarkeit auf den Nodes überprüfen

Bestätigen Sie, dass die GPUs als Kubernetes-Ressourcen exponiert sind:

kubectl get nodes -o custom-columns=NAME:.metadata.name,GPU:.status.allocatable.'nvidia\.com/gpu'

Erwartetes Ergebnis:

NAME                        GPU
cluster-gpu-cp-0 <none>
cluster-gpu-gpu-workers-0 1

4. Pod mit GPU bereitstellen

Erstellen Sie einen Test-Pod, der einen GPU über resources.limits nutzt:

gpu-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: gpu-test
spec:
containers:
- name: cuda-test
image: nvidia/cuda:12.0-runtime-ubuntu22.04
command: ["nvidia-smi"]
resources:
limits:
nvidia.com/gpu: 1
requests:
nvidia.com/gpu: 1

Anwenden und überprüfen:

kubectl apply -f gpu-pod.yaml

Warten Sie, bis der Pod seine Ausführung beendet:

kubectl wait --for=condition=Ready pod/gpu-test --timeout=120s

Konsultieren Sie die Logs, um zu bestätigen, dass der GPU sichtbar ist:

kubectl logs gpu-test

Erwartetes Ergebnis:

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 535.xx.xx Driver Version: 535.xx.xx CUDA Version: 12.x |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
|===============================+======================+======================|
| 0 NVIDIA L40S Off | 00000000:00:06.0 Off | 0 |
+-------------------------------+----------------------+----------------------+

5. Spezialisierte Node Groups konfigurieren

Für Produktionsumgebungen erstellen Sie dedizierte Node Groups für Inferenz und Training mit verschiedenen GPUs:

cluster-multi-gpu.yaml
apiVersion: apps.cozystack.io/v1alpha1
kind: Kubernetes
metadata:
name: cluster-ml
spec:
controlPlane:
replicas: 3

nodeGroups:
default-workers:
minReplicas: 2
maxReplicas: 5
instanceType: "u1.large"
ephemeralStorage: 50Gi

gpu-inference:
minReplicas: 2
maxReplicas: 10
instanceType: "u1.large"
ephemeralStorage: 100Gi
gpus:
- name: "nvidia.com/AD102GL_L40S"

gpu-training:
minReplicas: 1
maxReplicas: 3
instanceType: "u1.4xlarge"
ephemeralStorage: 200Gi
gpus:
- name: "nvidia.com/GA100_A100_PCIE_80GB"
- name: "nvidia.com/GA100_A100_PCIE_80GB"

addons:
gpuOperator:
enabled: true

Um eine spezifische Node Group in Ihren Deployments anzuvisieren, verwenden Sie nodeSelector:

inference-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: model-serving
spec:
replicas: 3
selector:
matchLabels:
app: model-serving
template:
metadata:
labels:
app: model-serving
spec:
nodeSelector:
gpu-type: "L40S"
containers:
- name: inference
image: my-model:latest
resources:
limits:
nvidia.com/gpu: 1
requests:
nvidia.com/gpu: 1
Hinweis

Die für Kubernetes verfügbaren GPUs sind dieselben wie für VMs: L40S (Inferenz/Entwicklung), A100 PCIe/SXM4 (ML-Training) und RTX PRO 6000 Blackwell (LLM/intensives Rechnen). Konsultieren Sie die GPU API-Referenz für die genauen Ressourcennamen und die Spezifikationen.

Überprüfung

Bestätigen Sie nach der Bereitstellung, dass Ihre GPU-Konfiguration funktioniert:

  1. GPU-Nodes überprüfen:
kubectl get nodes -o custom-columns=NAME:.metadata.name,GPU:.status.allocatable.'nvidia\.com/gpu'
  1. GPU-Zuweisung auf einem Node überprüfen:
kubectl describe node cluster-gpu-gpu-workers-0 | grep -A 5 "Allocated resources"
  1. Mit einem interaktiven Pod testen:
kubectl run gpu-debug --rm -it --image=nvidia/cuda:12.0-runtime-ubuntu22.04 \
--overrides='{"spec":{"containers":[{"name":"gpu-debug","image":"nvidia/cuda:12.0-runtime-ubuntu22.04","command":["nvidia-smi"],"resources":{"limits":{"nvidia.com/gpu":"1"},"requests":{"nvidia.com/gpu":"1"}}}]}}' \
--restart=Never

Weiterführende Informationen