Nodos Bin Pack con perfiles de planificador en Azure Kubernetes Service (AKS) (versión preliminar)

En este artículo, aprenderá a empaquetar los nodos en contenedores para mejorar el uso de nodos para los clústeres de Azure Kubernetes Service (AKS) mediante el complemento de programación en árbol, NodeResourcesFit. El programador predeterminado de AKS opera en un NodeResourcesFit:LeastAllocated modo, que da prioridad a los nodos con menor utilización al programar pods. Los perfiles de programador configurables en AKS permiten cambiar este comportamiento predeterminado y ajustar la configuración para priorizar los nodos con un mayor uso. En esta documentación se abordan tres perfiles de planificador personalizados diferentes, destacando la mejor práctica recomendada para mejorar la utilización mientras se reducen los puntos activos del nodo.

El empaquetado de nodos es una estrategia de programación que maximiza la utilización de recursos al aumentar la densidad de pods en los nodos, en lugar de distribuir los pods entre un conjunto de nodos o escalar automáticamente los nodos de forma prematura. El empaquetado de contenedores ayuda a minimizar los recursos desperdiciados y puede reducir el costo operativo de mantener los nodos inactivos o infrautilizados. Mejorar el uso de nodos es fundamental, ya que los datos muestran que la CPU y la memoria suelen ser recursos por encima de los solicitados. Además, a medida que crece la adopción de GPU, el uso eficaz de los aceleradores se vuelve igualmente crítico debido a su escasez y costo relativos.

Limitaciones

  • AKS actualmente no administra la implementación de programadores de terceros ni de complementos de programación externos.
  • AKS no admite complementos de programación integrados destinados al aks-system planificador. Esta restricción se aplica para ayudar a evitar cambios inesperados en los complementos de AKS habilitados en el clúster. Además, no se puede definir un profile elemento denominado aks-system.

Prerrequisitos

Habilitación de la configuración del perfil del programador en un clúster de AKS

Puede habilitar la configuración del perfil de programación en un clúster de AKS nuevo o existente.

  1. Cree un clúster AKS con la configuración del perfil del programador habilitada utilizando el az aks createcomando con el --enable-upstream-kubescheduler-user-configurationindicador .

    # Set environment variables
    export RESOURCE_GROUP=<resource-group-name>
    export CLUSTER_NAME=<aks-cluster-name>
    
    # Create an AKS cluster with schedule profile configuration enabled
    az aks create \
    --resource-group $RESOURCE_GROUP \ 
    --name $CLUSTER_NAME \
    --enable-upstream-kubescheduler-user-configuration \
    --generate-ssh-keys
    
  2. Una vez completado el proceso de creación, conéctese al clúster mediante el az aks get-credentials comando .

    az aks get-credentials --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME
    

Comprobación de la instalación del controlador del programador

  • Después de que haya habilitado la característica en el clúster de AKS, verifique que la definición de recurso personalizada (CRD) del controlador del programador se haya instalado correctamente mediante el comando kubectl get.

    kubectl get crd schedulerconfigurations.aks.azure.com
    

    Nota:

    Este comando no se realizará correctamente si la característica no se ha habilitado correctamente en la sección anterior.

Configuración del empaquetamiento de nodos con el plugin RequestedtoCapacity

De los tres perfiles, RequestedToCapacityRatio proporciona el control de usuario más granular para asignar nodos a un uso explícito. Por ejemplo, este perfil de programación se ha configurado para favorecer los nodos dentro de un rango de utilización del 50-85 %, evitar nodos vacíos y priorizar en último lugar los nodos casi completos al 90 % de uso o más, dejando un margen de maniobra. Dado este nivel de detalle, RequestedtoCapacity es la estrategia de puntuación recomendada para el empaquetado de nodos en contenedores en AKS para los clústeres de producción.

Esta configuración hace que el uso de la CPU sea el factor dominante en la selección de nodos, agrupando nodos, a la vez que evita la sobresaturación de las aplicaciones intensivas en CPU. Por último, debe deshabilitar el PodTopologySpread complemento, ya que puede invalidar la puntuación ponderada de NodeResourcesFit si se deja habilitada de forma predeterminada.

  • NodeResourcesFit controla cómo el programador evalúa si un nodo tiene suficientes recursos para ejecutar un pod.
  • scoringStrategy: RequestedToCapacityRatio puntúa los nodos en función de la relación de los recursos solicitados con respecto a la capacidad total del nodo después de colocar hipotéticamente el pod.
  • Resources, especifica que CPU y Memory son los recursos principales que se están considerando para la puntuación. Con un peso de 8, los nodos con uso de CPU tienen una puntuación 8 veces superior a la memoria durante el ciclo de planificación del pod. Esto aumenta la probabilidad de que se seleccionen nodos con un uso elevado.
  • shape: asigna el uso del nodo a la puntuación del programador. Cada punto representa un porcentaje de uso y su puntuación correspondiente, con una puntuación lineal entre puntos.
apiVersion: aks.azure.com/v1alpha1
kind: SchedulerConfiguration
metadata:
  name: upstream
spec:
  rawConfig: |
    apiVersion: kubescheduler.config.k8s.io/v1
    kind: KubeSchedulerConfiguration
    profiles:
      - schedulerName: cpu-binpack-scheduler-RtC
        plugins:
          multiPoint:
            enabled:
              - name: NodeResourcesFit
            disabled:
              - name: PodTopologySpread
        pluginConfig:
          - name: NodeResourcesFit
            args:
              apiVersion: kubescheduler.config.k8s.io/v1
              kind: NodeResourcesFitArgs
              scoringStrategy:
                type: RequestedToCapacityRatio
                resources:
                  - name: cpu
                    weight: 8
                  - name: memory
                    weight: 1
                requestedToCapacityRatio:
                  shape:
                    - utilization: 0
                      score: 0
                    - utilization: 30
                      score: 9
                    - utilization: 50
                      score: 10
                    - utilization: 85
                      score: 10
                    - utilization: 90
                      score: 5
                    - utilization: 100
                      score: 0

Configuración del empaquetado de nodos en contenedores con el complemento MostAllocated

La configuración del programador con MostAllocated prioriza exclusivamente los nodos en función del uso de recursos. Cuanto mayor sea el uso de los recursos, más alto se puntúa un nodo, evitando los nodos no usados o el escalado hasta que sea necesario. De forma aislada, esta configuración corre el riesgo de saturar los nodos más allá de los límites deseables, lo que provoca limitaciones o cuellos de botella adicionales.

Esta configuración hace que el uso de la CPU sea el factor dominante en la selección del nodo. Para garantizar un comportamiento coherente, debe deshabilitar el PodTopologySpread complemento, ya que puede invalidar la puntuación ponderada de NodeResourcesFit si se deja habilitada de forma predeterminada.

  • NodeResourcesFit controla cómo el programador evalúa si un nodo tiene suficientes recursos para ejecutar un pod.
  • scoringStrategy: MostAllocated puntuaciones basadas en las solicitudes de pod. MostAllocated indica al programador que prefiera nodos con un uso elevado de recursos. Esta estrategia promueve la colocación densa de pods y ayuda a lograr un mejor uso de nodos.
  • Resources, especifica que CPU y Memory son los recursos principales que se están considerando para la puntuación. Con un peso de 8, los nodos con uso de CPU tienen una puntuación 8 veces superior a la memoria durante el ciclo de planificación del pod. Esto aumenta la probabilidad de que se seleccionen nodos con un uso elevado.
apiVersion: aks.azure.com/v1alpha1
kind: SchedulerConfiguration
metadata:
  name: upstream
spec:
  rawConfig: |
    apiVersion: kubescheduler.config.k8s.io/v1
    kind: KubeSchedulerConfiguration
    profiles:
      - schedulerName: cpu-binpack-scheduler-mA
        plugins:
          multiPoint:
            enabled:
              - name: NodeResourcesFit
            disabled:
              - name: PodTopologySpread
        pluginConfig:
          # NodeResourcesFit configuration
          - name: NodeResourcesFit
            args:
              apiVersion: kubescheduler.config.k8s.io/v1
              kind: NodeResourcesFitArgs
              scoringStrategy:
                type: MostAllocated
                resources:
                  - name: cpu
                    weight: 8
                  - name: memory
                    weight: 1

Configuración del empaquetado de contenedores de nodos con MostAllocated y NodeResourcesBalancedAllocation Plugins

Esta configuración busca agregar algunos límites de protección a la estrategia MostAllocated sencilla y eficaz mediante la puntuación de nodos en función del uso equilibrado de los recursos de destino. NodeResourcesBalancedAllocation fomenta la colocación de pods en los nodos con un uso proporcional definido por el usuario, incrementando la eficiencia general, a la vez que evita cuellos de botella causados por la presión asimétrica de recursos. Por ejemplo, los nodos enlazados a la CPU con mucha memoria no utilizada se puntuarían más abajo en favor de los nodos con un mejor equilibrio de uso de CPU y memoria.

  • NodeResourcesBalancedAllocation puntúa los nodos en función de cómo se equilibra el uso de recursos entre varios recursos. En lugar de maximizar el uso de un único recurso, este complemento prefiere nodos en los que el consumo de recursos es proporcional.
  • Resources especifica qué recursos se consideran durante la evaluación del equilibrio. Con la CPU y la memoria ponderadas igualmente, los nodos se puntúan más alto cuando ambos recursos se consumen en niveles similares.
apiVersion: aks.azure.com/v1alpha1
kind: SchedulerConfiguration
metadata:
  name: upstream
spec:
  rawConfig: |
    apiVersion: kubescheduler.config.k8s.io/v1
    kind: KubeSchedulerConfiguration
    profiles:
      - schedulerName: cpu-binpack-scheduler-mA-BalancedAllocation
        plugins:
          multiPoint:
            enabled:
              - name: NodeResourcesFit
              - name: NodeResourcesBalancedAllocation
            disabled:
              - name: PodTopologySpread
        pluginConfig:
          # NodeResourcesFit configuration
          - name: NodeResourcesFit
            args:
              apiVersion: kubescheduler.config.k8s.io/v1
              kind: NodeResourcesFitArgs
              scoringStrategy:
                type: MostAllocated
                resources:
                  - name: cpu
                    weight: 8
                  - name: memory
                    weight: 1
          - name: NodeResourcesBalancedAllocation
            args:
              apiVersion: kubescheduler.config.k8s.io/v1
              kind: NodeResourcesBalancedAllocationArgs
              resources:
                - name: cpu
                  weight: 1
                - name: memory
                  weight: 1

Asignación de un perfil de programador a un clúster de AKS completo

  1. Cree un archivo denominado cpu-bin-packing-scheduler.yaml, con el CRD denominado upstream

  2. Aplique el manifiesto de configuración de programación mediante el comando kubectl apply.

    kubectl apply -f cpu-bin-packing-scheduler.yaml
    
  3. Para aplicar este mecanismo de programación a cargas de trabajo específicas, actualice las implementaciones de pod con lo siguiente schedulerName.

    ...
    ...
        spec:
          schedulerName: binpacking-scheduler
    ...
    ...
    

Pasos siguientes

Para más información sobre el programador de AKS, otras configuraciones y procedimientos recomendados, consulte los siguientes recursos: