Configuración del autoescalado horizontal de pods en nodos trabajadores GPU

Revise los siguientes pasos para habilitar el autoescalado horizontal de pods en sus nodos trabajadores GPU.

¿Por qué autoescalado horizontal?
Es posible que desee configurar el autoescalado horizontal de pods para escalar el número de pods cuando la carga de trabajo consuma más o menos de una determinada cantidad de GPU. Dado que las GPU son un recurso caro, es posible que no quieras que las cargas de trabajo se ejecuten al máximo de su capacidad durante largos periodos de tiempo. En su lugar, puede escalar los pods hacia arriba o hacia abajo en función de la carga de trabajo que se esté ejecutando en el clúster.

Requisitos previos

Para configurar HPA, los siguientes componentes deben estar instalados en su cluster.

  • NVIDIA Exportador de Data Center GPU Manager (DCGM) para recopilar métricas de GPU en Kubernetes. El exportador DCGM expone métricas de GPU para Prometheus que pueden visualizarse utilizando Grafana.
  • Prometheus y el adaptador Prometheus para generar métricas personalizadas.
  1. Instale el operador de GPU NVIDIA

  2. Instalar 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. Obtenga los detalles del servicio Prometheus.

    oc get svc
    
  4. Instala el adaptador « Prometheus ».

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

Configuración de la HPA

Complete los siguientes pasos para crear una implantación que utilice HPA.

  1. Cree un despliegue.

    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 un recurso « 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. Ejecuta los siguientes comandos para revisar los resultados.

    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
    

    Había 1 réplica que se amplió a 3 a medida que aumentaban los recursos de carga de trabajo.

    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