Compartir vía


Aprovisionamiento automático de nodos (versión preliminar)

Al implementar cargas de trabajo en AKS, debe tomar una decisión sobre la configuración del grupo de nodos con respecto al tamaño de máquina virtual necesario. A medida que sus cargas de trabajo se vuelven más complejas y requieren diferentes CPU, memoria y capacidades para ejecutarse, la sobrecarga de tener que diseñar la configuración de su VM para numerosas solicitudes de recursos se vuelve difícil.

El aprovisionamiento automático de nodos (NAP) (versión preliminar) decide, en función de las necesidades de recursos de los pods pendientes, la configuración óptima de las máquinas virtuales para ejecutar esas cargas de trabajo de la forma más eficiente y rentable.

NAP se basa en el proyecto Karpenter de código abierto, y el proveedor AKS también es de código abierto. NAP implementa, configura y administra automáticamente Karpenter en sus clústeres AKS.

Importante

El aprovisionamiento automático de nodos (NAP) para AKS está actualmente en versión preliminar. Consulte Términos de uso complementarios para las versiones preliminares de Microsoft Azure para conocer los términos legales que se aplican a las características de Azure que se encuentran en la versión beta, en versión preliminar o que todavía no se han publicado para que estén disponibles con carácter general.

Antes de empezar

Instalación de la extensión aks-preview de la CLI

  1. Instale la extensión aks-preview de la CLI mediante el comando az extension add.

    az extension add --name aks-preview
    
  2. Actualice la extensión para asegurarse de que tiene instalada la última versión mediante el comando az extension update.

    az extension update --name aks-preview
    

Registro de la marca de característica NodeAutoProvisioningPreview

  1. Registre la marca de características de NodeAutoProvisioningPreview mediante el comando az feature register.

    az feature register --namespace "Microsoft.ContainerService" --name "NodeAutoProvisioningPreview"
    

    Tarda unos minutos en que el estado muestre Registrado.

  2. Comprobar el estado del registro mediante el comando az feature show.

    az feature show --namespace "Microsoft.ContainerService" --name "NodeAutoProvisioningPreview"
    
  3. Cuando aparezca el estado Registrado, actualice el registro del proveedor de recursos Microsoft.ContainerService mediante el comando az provider register.

    az provider register --namespace Microsoft.ContainerService
    

Limitaciones

Características no admitidas

  • Grupos de nodos de Windows
  • Aplicación de la configuración personalizada al nodo kubelet
  • Clústeres IPv6
  • Entidad de servicio

    Nota:

    Puede usar una identidad administrada asignada por el sistema o por el usuario.

  • Conjuntos de cifrado de disco
  • CustomCATrustCertificates
  • Modo de arranque o parada
  • Proxy HTTP
  • Mutación OutboundType. Se admiten todos los OutboundTypes, pero no se pueden cambiar después de la creación.

Habilitar el aprovisionamiento automático de nodos

Habilitación del aprovisionamiento automático de nodos en un nuevo clúster

  • Habilite el aprovisionamiento automático de nodos en un nuevo clúster mediante el az aks create comando y establezca --node-provisioning-mode en Auto. También debe establecer --network-plugin en azure, --network-plugin-mode en overlay y --network-dataplane en cilium.

    az aks create \
        --name $CLUSTER_NAME \
        --resource-group $RESOURCE_GROUP_NAME \
        --node-provisioning-mode Auto \
        --network-plugin azure \
        --network-plugin-mode overlay \
        --network-dataplane cilium \
        --generate-ssh-keys
    

Habilitación del aprovisionamiento automático de nodos en un clúster existente

  • Habilitación del aprovisionamiento automático de nodos en un clúster existente mediante el az aks update comando y establezca --node-provisioning-mode en Auto. También debe establecer --network-plugin en azure, --network-plugin-mode en overlay y --network-dataplane en cilium.

    az aks update --name $CLUSTER_NAME --resource-group $RESOURCE_GROUP_NAME --node-provisioning-mode Auto --network-plugin azure --network-plugin-mode overlay --network-dataplane cilium
    

Grupos de nodos

El aprovisionamiento automático de nodos utiliza una lista de SKU de máquinas virtuales como punto de partida para decidir cuál es la más adecuada para las cargas de trabajo que se encuentran en estado pendiente. Tener control sobre qué SKU desea en el grupo inicial le permite especificar familias de SKU específicas, o tipos de máquina virtual y la cantidad máxima de recursos que usa un aprovisionamiento.

Si tiene SKU de máquina virtual específicas que son instancias reservadas, por ejemplo, puede que solo desee usar esas máquinas virtuales como grupo de inicio.

Puede tener varias definiciones de grupo de nodos en un clúster, pero AKS implementa una definición de grupo de nodos predeterminada que puede modificar:

apiVersion: karpenter.sh/v1beta1
kind: NodePool
metadata:
  name: default
spec:
  disruption:
    consolidationPolicy: WhenUnderutilized
    expireAfter: Never
  template:
    spec:
      nodeClassRef:
        name: default

      # Requirements that constrain the parameters of provisioned nodes.
      # These requirements are combined with pod.spec.affinity.nodeAffinity rules.
      # Operators { In, NotIn, Exists, DoesNotExist, Gt, and Lt } are supported.
      # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#operators
      requirements:
      - key: kubernetes.io/arch
        operator: In
        values:
        - amd64
      - key: kubernetes.io/os
        operator: In
        values:
        - linux
      - key: karpenter.sh/capacity-type
        operator: In
        values:
        - on-demand
      - key: karpenter.azure.com/sku-family
        operator: In
        values:
        - D

Requisitos de los proveedores de nodos compatibles

Selectores de SKU con etiquetas conocidas

Selector Descripción Ejemplo
karpenter.azure.com/sku-family Familia de SKU de máquina virtual D, F, L etc.
karpenter.azure.com/sku-name Nombre de SKU explícito Standard_A1_v2
karpenter.azure.com/sku-version Versión SKU (sin "v", puede utilizar 1) 1 , 2
karpenter.sh/capacity-type Tipo de asignación de máquina virtual (de acceso puntual o a petición) de acceso puntual o a petición
karpenter.azure.com/sku-cpu Número de CPU en la máquina virtual 16
karpenter.azure.com/sku-memory Memoria en la máquina virtual en MiB 131072
karpenter.azure.com/sku-gpu-name Nombre de la GPU A100
karpenter.azure.com/sku-gpu-manufacturer Fabricante de la GPU nvidia
karpenter.azure.com/sku-gpu-count Recuento de GPU por máquina virtual 2
karpenter.azure.com/sku-networking-accelerated Si la máquina virtual ha acelerado las redes [true, false]
karpenter.azure.com/sku-storage-premium-capable Si la máquina virtual admite almacenamiento de E/S Premium [true, false]
karpenter.azure.com/sku-storage-ephemeralos-maxsize Límite de tamaño para el disco efímero del SO en Gb 92
topology.kubernetes.io/zone Las zonas de disponibilidad [uksouth-1,uksouth-2,uksouth-3]
kubernetes.io/os Sistema operativo (solo Linux durante la versión preliminar) Linux
kubernetes.io/arch Arquitectura de CPU (AMD64 o ARM64) [amd64, arm64]

Para enumerar las capacidades y los valores permitidos de VM SKU, utilice el comando vm list-skus de la CLI de Azure.

az vm list-skus --resource-type virtualMachines --location <location> --query '[].name' --output table

Límites del grupo de nodos

De forma predeterminada, NAP intenta programar las cargas de trabajo dentro de la cuota de Azure que tiene disponible. También puede especificar el límite superior de recursos que usa un grupo de nodos, especificando límites dentro de la especificación del grupo de nodos.

  # Resource limits constrain the total size of the cluster.
  # Limits prevent Karpenter from creating new instances once the limit is exceeded.
  limits:
    cpu: "1000"
    memory: 1000Gi

Pesos del grupo de nodos

Cuando haya definido varios grupos de nodos, es posible establecer una preferencia de dónde se debe programar una carga de trabajo. Defina el peso relativo en las definiciones del grupo de nodos.

  # Priority given to the node pool when the scheduler considers which to select. Higher weights indicate higher priority when comparing node pools.
  # Specifying no weight is equivalent to specifying a weight of 0.
  weight: 10

Kubernetes y actualizaciones de imágenes de nodos

AKS con NAP administra las actualizaciones de la versión de Kubernetes y las actualizaciones del disco del SO de la máquina virtual por usted de forma predeterminada.

Actualizaciones de Kubernetes

Las actualizaciones de Kubernetes para los grupos de nodos del NAP siguen la versión de Kubernetes del plano de control. Si realiza una actualización del clúster, sus nodos NAP se actualizan automáticamente para seguir el mismo versionado.

Actualizaciones de imágenes de nodo

De forma predeterminada, las máquinas virtuales del grupo de nodos NAP se actualizan automáticamente cuando hay una nueva imagen disponible. Si desea fijar un grupo de nodos a una determinada versión de imagen de nodo, puede establecer la imageVersion en la clase de nodo:

kubectl edit aksnodeclass default

En la definición de la clase de nodo, establezca imageVersion en una de las versiones publicadas que figuran en las notas de la versión de AKS. También puede ver la disponibilidad de las imágenes en las regiones consultando el rastreador de versiones de AKS

El imageVersion es la parte de la fecha en la imagen del nodo como sólo Ubuntu 22.04 es compatible, por ejemplo, "AKSUbuntu-2204-202311.07.0" sería "202311.07.0"

apiVersion: karpenter.azure.com/v1alpha2
kind: AKSNodeClass
metadata:
  annotations:
    kubernetes.io/description: General purpose AKSNodeClass for running Ubuntu2204
      nodes
    meta.helm.sh/release-name: aks-managed-karpenter-overlay
    meta.helm.sh/release-namespace: kube-system
  creationTimestamp: "2023-11-16T23:59:06Z"
  generation: 1
  labels:
    app.kubernetes.io/managed-by: Helm
    helm.toolkit.fluxcd.io/name: karpenter-overlay-main-adapter-helmrelease
    helm.toolkit.fluxcd.io/namespace: 6556abcb92c4ce0001202e78
  name: default
  resourceVersion: "1792"
  uid: 929a5b07-558f-4649-b78b-eb25e9b97076
spec:
  imageFamily: Ubuntu2204
  imageVersion: 202311.07.0
  osDiskSizeGB: 128

Si se elimina la especificación imageVersion, el conjunto de nodos se actualizará con la última versión de imagen de nodo.

Interrupción del nodo

Cuando las cargas de trabajo de los nodos se reducen verticalmente, NAP usa reglas de interrupción en la especificación del grupo de nodos para decidir cuándo y cómo quitar esos nodos y volver a programar las cargas de trabajo para que sean más eficaces.

Puede quitar un nodo manualmente mediante kubectl delete node, pero NAP también puede controlar cuándo debe optimizar los nodos.

  disruption:
    # Describes which types of Nodes NAP should consider for consolidation
    consolidationPolicy: WhenUnderutilized | WhenEmpty
    # 'WhenUnderutilized', NAP will consider all nodes for consolidation and attempt to remove or replace Nodes when it discovers that the Node is underutilized and could be changed to reduce cost

    #  `WhenEmpty`, NAP will only consider nodes for consolidation that contain no workload pods
    
    # The amount of time NAP should wait after discovering a consolidation decision
    # This value can currently only be set when the consolidationPolicy is 'WhenEmpty'
    # You can choose to disable consolidation entirely by setting the string value 'Never'
    consolidateAfter: 30s

Supervisión de eventos de selección

El aprovisionamiento automático de nodos produce eventos de clúster que pueden utilizarse para supervisar las decisiones de implementación y programación que se están tomando. Puede ver los eventos a través del flujo de eventos de Kubernetes.

kubectl get events -A --field-selector source=karpenter -w