Vai al contenuto principale

Come provisionare un GPU su Kubernetes

Hikube permette di aggiungere node group equipaggiati con GPU NVIDIA ai vostri cluster Kubernetes. Questa guida spiega come configurare un cluster con worker GPU, distribuire pod che sfruttano l'accelerazione GPU e mettere in opera node group specializzati.

Prerequisiti

  • kubectl configurato con il vostro kubeconfig Hikube
  • Un cluster Kubernetes esistente su Hikube (o un manifest pronto per il deployment)
  • Familiarità con i concetti di Kubernetes su Hikube

Passi

1. Aggiungere un node group GPU al cluster

Modificate il manifest del vostro cluster per aggiungere un node group con GPU. La configurazione GPU si fa a livello del node group tramite 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:
# Richiesto: installa i driver NVIDIA e il device plugin
gpuOperator:
enabled: true
Addon gpuOperator richiesto

Il collegamento delle GPU ai node group non è sufficiente: senza addons.gpuOperator.enabled: true, i driver NVIDIA e il device plugin non sono installati nel cluster tenant, e nvidia.com/gpu resta a 0 sui nodi.

suggerimento

Separate i vostri workload CPU e GPU in node group distinti. Questo permette uno scaling indipendente e un migliore controllo dei costi.

2. Applicare la configurazione del cluster

kubectl apply -f cluster-gpu.yaml

Attendete che i nodi GPU siano pronti:

kubectl get nodes -w

Risultato atteso:

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. Verificare la disponibilità GPU sui nodi

Confermate che le GPU siano ben esposte come risorse Kubernetes:

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

Risultato atteso:

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

4. Distribuire un pod con GPU

Create un pod di test che utilizza una GPU tramite i resources.limits:

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

Applicate e verificate:

kubectl apply -f gpu-pod.yaml

Attendete che il pod termini la sua esecuzione:

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

Consultate i log per confermare che la GPU è visibile:

kubectl logs gpu-test

Risultato atteso:

+-----------------------------------------------------------------------------+
| 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. Configurare node group specializzati

Per gli ambienti di produzione, create node group dedicati all'inferenza e all'addestramento con GPU differenti:

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

Per indirizzare un node group specifico nei vostri deployment, utilizzate 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
nota

Le GPU disponibili per Kubernetes sono le stesse delle VM: L40S (inferenza/dev), A100 PCIe/SXM4 (addestramento ML) e RTX PRO 6000 Blackwell (LLM/calcolo intensivo). Consultate il riferimento API GPU per i nomi di risorsa esatti e le specifiche.

Verifica

Dopo il deployment, confermate che la vostra configurazione GPU funzioni:

  1. Verificate i nodi GPU:
kubectl get nodes -o custom-columns=NAME:.metadata.name,GPU:.status.allocatable.'nvidia\.com/gpu'
  1. Verificate l'allocazione GPU su un nodo:
kubectl describe node cluster-gpu-gpu-workers-0 | grep -A 5 "Allocated resources"
  1. Testate con un pod interattivo:
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

Per approfondire