Impostazione dell'autoscaling orizzontale dei pod sui nodi worker GPU

Esaminare i seguenti passaggi per abilitare l'autoscaling orizzontale dei pod sui nodi worker GPU.

Perché l'autoscaling orizzontale dei pod?
È possibile configurare l'autoscaling orizzontale dei pod per scalare il numero di pod quando il carico di lavoro consuma più o meno di una certa quantità di GPU. Poiché le GPU sono una risorsa costosa, non si vuole che i carichi di lavoro vengano eseguiti alla massima capacità per lunghi periodi di tempo. Invece, è possibile scalare i pod o aumentare o diminuire in base al carico di lavoro in corso nel cluster.

Prerequisiti

Per configurare HPA, nel cluster devono essere installati i seguenti componenti.

  • NVIDIA Esportatore di Data Center GPU Manager (DCGM) per raccogliere le metriche delle GPU in Kubernetes. L'esportatore DCGM espone metriche GPU per Prometheus che possono essere visualizzate con Grafana.
  • Prometheus e l'adattatore Prometheus per generare metriche personalizzate.
  1. Installare l'Operatore GPU NVIDIA

  2. Installare Prometheus.

    helm install prom-stack prometheus-community/kube-prometheus-stack -f ~/ca-prom-val.yaml
    
    cat ~/ca-prom-val.yaml
    
    prometheus:
        prometheusSpec:
            additionalScrapeConfigs:
            - job_name: gpu-metrics
                scrape_interval: 1s
                metrics_path: /metrics
                scheme: http
                kubernetes_sd_configs:
                - role: endpoints
                    namespaces:
                        names:
                        - nvidia-gpu-operator
                relabel_configs:
                - source_labels: [__meta_kubernetes_endpoints_name]
                    action: drop
                    regex: .*-node-feature-discovery-master
                - source_labels: [__meta_kubernetes_pod_node_name]
                    action: replace
                    target_label: kubernetes_node
    
  3. Ottenere i dettagli del servizio Prometheus.

    oc get svc
    
  4. Installare l'adattatore Prometheus.

    helm upgrade --install prometheus-adapter prometheus-community/prometheus-adapter --set prometheus.url="http://prom-stack-kube-prometheus-prometheus.default.svc.cluster.local"
    

Impostazione di HPA

Completare i seguenti passaggi per creare un'installazione client che utilizza HPA.

  1. Crea una distribuzione.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
        name: cuda-test
        labels:
            app: cuda-test
    spec:
        selector:
            matchLabels:
                app: cuda-test
        template:
            metadata:
                labels:
                    app: cuda-test
            spec:
                containers:
                - name: cuda-test-main
                    image: "registry.k8s.io/cuda-vector-add:v0.1"
                    command: ["bash", "-c", "for (( c=1; c<=5000; c++ )); do ./vectorAdd; done"]
                    resources:
                        limits:
                            nvidia.com/gpu: 1
    
  2. Crea una risorsa " HorizontalPodAutoscaler ".

    kind: HorizontalPodAutoscaler
    apiVersion: autoscaling/v2
    metadata:
        name: cuda-hpa
        namespace: default
    spec:
        scaleTargetRef:
            apiVersion: apps/v1
            kind: Deployment
            name: cuda-test
        minReplicas: 1
        maxReplicas: 3
        metrics:
            - type: Pods
                pods:
                    metric:
                        name: DCGM_FI_DEV_GPU_UTIL     #the metric you want to use for autoscaling
                    target:
                        type: AverageValue
                        averageValue: '5'
    
  3. Eseguire i seguenti comandi per esaminare i risultati.

    oc get pods | grep cuda
    
    cuda-test-d987464bf-brd48                                1/1     Running   0          4m19s
    cuda-test-d987464bf-gsx82                                0/1     Pending   0          4m19s
    cuda-test-d987464bf-zstzs                                1/1     Running   0          7m35s
    

    C'era 1 replica che è stata scalata a 3 con l'aumento delle risorse del carico di lavoro.

    Min replicas:       1
    Max replicas:       3
    Deployment pods:    3 current / 3 desired
    Events:
    Type    Reason             Age   From                       Message
    ----    ------             ----  ----                       -------
    Normal  SuccessfulRescale  50s   horizontal-pod-autoscaler  New size: 3; reason: pods metric DCGM_FI_DEV_GPU_UTIL above target