Einrichten von horizontaler Pod-Autoskalierung auf GPU-Worker-Nodes

Gehen Sie die folgenden Schritte durch, um horizontale Pod-Autoskalierung auf Ihren GPU-Worker-Nodes zu aktivieren.

Warum horizontale Pod-Autoskalierung?
Sie können horizontale Pod-Autoskalierung konfigurieren, um die Anzahl der Pods zu skalieren, wenn die Arbeitslast mehr oder weniger als eine bestimmte Menge an GPU verbraucht. Da Grafikprozessoren eine teure Ressource sind, sollten Sie nicht wollen, dass Arbeitslasten über längere Zeiträume mit voller Kapazität ausgeführt werden. Stattdessen können Sie Pods auf der Grundlage der laufenden Arbeitslast im Cluster nach oben oder unten skalieren.

Voraussetzungen

Um HPA zu konfigurieren, müssen die folgenden Komponenten auf Ihrem Cluster installiert sein.

  • NVIDIA Data Center GPU Manager (DCGM) Exporter zur Erfassung von GPU-Metriken in Kubernetes. Der DCGM-Exporter stellt GPU-Metriken für Prometheus bereit, die mit Grafana visualisiert werden können.
  • Prometheus und den Prometheus Adapter, um benutzerdefinierte Metriken zu erstellen.
  1. Installieren Sie den NVIDIA GPU Operator

  2. Installieren Sie 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. Einzelheiten zum Dienst Prometheus.

    oc get svc
    
  4. Installieren Sie den „ Prometheus “-Adapter.

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

HPA einrichten

Führen Sie die folgenden Schritte aus, um eine Bereitstellung zu erstellen, die HPA verwendet.

  1. Erstellen Sie eine Bereitstellung.

    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. Erstellen Sie eine „ HorizontalPodAutoscaler “-Ressource.

    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. Führen Sie die folgenden Befehle aus, um die Ergebnisse zu überprüfen.

    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
    

    Es gab 1 Replikat, das auf 3 skaliert wurde, als die Arbeitslastressourcen zunahmen.

    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