Compartir a través de


Configuración de recursos de AKSNodeClass para el aprovisionamiento automático de nodos (NAP) en Azure Kubernetes Service (AKS)

En este artículo se explica cómo configurar AKSNodeClass recursos para definir opciones específicas de Azure para el aprovisionamiento automático de nodos (NAP) en Azure Kubernetes Service (AKS) mediante Karpenter. AKSNodeClass permite personalizar varios aspectos de los nodos que Karpenter aprovisiona, como la imagen de la máquina virtual( VM), el tamaño del disco del sistema operativo (SO), el número máximo de pods por nodo y las configuraciones de kubelet.

Importante

A partir del 30 de noviembre de 2025, Azure Kubernetes Service (AKS) ya no admite ni proporciona actualizaciones de seguridad para Azure Linux 2.0. La imagen de nodo de Linux 2.0 de Azure está congelada en la versión 202512.06.0. A partir del 31 de marzo de 2026, se quitarán las imágenes de nodo y no podrá escalar los grupos de nodos. Migre a una versión compatible de Azure Linux mediante la actualización de los grupos de nodos a una versión de Kubernetes compatible o la migración a osSku AzureLinux3. Para más información, consulte [Retirada] Grupos de nodos de Azure Linux 2.0 en AKS.

Información general sobre los recursos de AKSNodeClass

AKSNodeClass los recursos permiten configurar opciones específicas de Azure para NAP. Cada NodePool recurso debe hacer referencia a un AKSNodeClass usando spec.template.spec.nodeClassRef. Puede tener varios NodePools que apunten al mismo AKSNodeClass, lo que le permite compartir configuraciones comunes de Azure entre distintos grupos de nodos.

Configuración de la familia de imágenes

El imageFamily campo dicta la imagen de máquina virtual predeterminada y la lógica de arranque para los nodos aprovisionados a través de AKSNodeClass. Si no especifica una familia de imágenes, el valor predeterminado es Ubuntu2204. Las GPU se admiten con ambas familias de imágenes en tamaños de máquina virtual compatibles.

Familias de imágenes admitidas

  • Ubuntu: Ubuntu 22.04 Soporte a Largo Plazo (LTS) es la distribución predeterminada de Linux para los nodos de AKS.
  • AzureLinux: Azure Linux es la distribución alternativa de Linux de Microsoft para cargas de trabajo de AKS. Para más información, consulte la documentación de Azure Linux.

Configuración de familia de imágenes de ejemplo

En el ejemplo siguiente se configura el AKSNodeClass para usar la familia de imágenes AzureLinux.

spec:
  imageFamily: AzureLinux

Configuración de subred de red virtual (VNet)

El vnetSubnetID campo especifica qué subred de red virtual de Azure se debe usar para aprovisionar interfaces de red de nodo. Este campo es opcional. Si no especifica una subred, NAP usa la subred predeterminada configurada durante la instalación de Karpenter. Para obtener más información, consulte Configuraciones de subred para NAP.

Configuración de subred de ejemplo

El identificador de subred debe tener el formato completo de Azure Resource Manager (ARM), como se muestra en el ejemplo siguiente:

spec:
  vnetSubnetID: "/subscriptions/{subscription-id}/resourceGroups/{resource-group}/providers/Microsoft.Network/virtualNetworks/{vnet-name}/subnets/{subnet-name}"

Configuración del tamaño del disco del sistema operativo

El osDiskSizeGB campo especifica el tamaño del disco del sistema operativo en gigabytes. El valor predeterminado es 128 GB y el valor mínimo es 30 GB.

Considere los tamaños de disco del sistema operativo más grandes para las cargas de trabajo que:

  • Almacene datos significativos localmente.
  • Requerir espacio adicional para las imágenes de contenedor.
  • Tiene requisitos elevados de E/S de disco.

Configuración de tamaño de disco del sistema operativo de ejemplo

spec:
  osDiskSizeGB: 256  # 256 GB OS disk

Configuración del disco del sistema operativo efímero

NAP usa automáticamente discos del sistema operativo efímeros cuando están disponibles y adecuados para el tamaño de disco solicitado. Los discos del sistema operativo efímeros proporcionan un mejor rendimiento y un menor costo en comparación con los discos administrados.

Criterios de selección de disco efímero

El sistema elige automáticamente discos efímeros en los escenarios siguientes:

  • El tipo de instancia de máquina virtual admite discos de sistema operativo efímeros.
  • La capacidad del disco efímero es mayor o igual que la solicitada osDiskSizeGB.
  • La máquina virtual tiene suficiente capacidad de almacenamiento efímero.

Si no se cumplen estas condiciones, el sistema vuelve al uso de discos administrados.

Tipos de disco efímeros y priorización

Las máquinas virtuales de Azure pueden tener diferentes tipos de almacenamiento efímero. El sistema usa el siguiente orden de prioridad:

  • Discos NVMe (rendimiento más alto)
  • Discos de caché (rendimiento equilibrado)
  • Discos de recursos (rendimiento básico)

Ejemplo de configuración de disco efímero

Puede usar los requisitos del grupo de nodos para asegurarse de que los nodos tienen suficiente capacidad de disco efímero, como se muestra en el ejemplo siguiente:

apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  name: ephemeral-disk-pool
spec:
  template:
    spec:
      requirements:
        - key: karpenter.azure.com/sku-storage-ephemeralos-maxsize
          operator: Gt
          values: ["128"]  # Require ephemeral disk larger than 128 GB
      nodeClassRef:
        apiVersion: karpenter.azure.com/v1beta1
        kind: AKSNodeClass
        name: my-node-class
---
apiVersion: karpenter.azure.com/v1beta1
kind: AKSNodeClass
metadata:
  name: my-node-class
spec:
  osDiskSizeGB: 128  # This will use ephemeral disk if available and large enough

Esta configuración garantiza que solo se seleccionan los tipos de instancia de máquina virtual con discos efímeros de más de 128 GB, lo que garantiza el uso de disco efímero para el tamaño de disco del sistema operativo especificado.

Configuración máxima de pods

El campo maxPods especifica el número máximo de pods que se pueden programar en un nodo. Esta configuración afecta tanto a la densidad del clúster como a la configuración de red.

El valor mínimo de maxPods es 10 y el valor máximo es 250.

Comportamiento predeterminado para maxPods

El comportamiento predeterminado de maxPods depende de la configuración del complemento de red. En la tabla siguiente se resumen los valores predeterminados:

Configuración del complemento de red Valor predeterminado maxPods por nodo
Azure CNI con redes estándar (v1 o NodeSubnet) 30
Azure CNI con redes superpuestas 250
Ninguno (sin complemento de red) 250
Otras configuraciones 110 (valor predeterminado estándar de Kubernetes)

Ejemplo de configuración máxima de pods

spec:
  maxPods: 50  # Allow up to 50 pods per node

Configuración de kubelet

La sección kubelet permite configurar varios parámetros de kubelet que afectan al comportamiento del nodo. Estos parámetros son argumentos de kubelet típicos, por lo que el proveedor de Azure simplemente los pasa al kubelet en el nodo.

Importante

Configure los valores de kubelet cuidadosamente y pruebe primero los cambios en entornos que no son de producción.

Administración de CPU

La siguiente configuración controla el comportamiento de administración de CPU para kubelet:

spec:
  kubelet:
    cpuManagerPolicy: "static"  # or "none"
    cpuCFSQuota: true
    cpuCFSQuotaPeriod: "100ms"
  • cpuManagerPolicy: controla cómo el kubelet asigna recursos de CPU. Establézcalo en "static" para la asignación de CPU en cargas de trabajo sensibles a la latencia.
  • cpuCFSQuota: habilita la aplicación de cuotas del programador completamente justo (CFS) de CPU para contenedores que especifican límites de CPU.
  • cpuCFSQuotaPeriod: establece el período de cuota CFS de CPU.

Recolección de elementos no utilizados de imagen

Los valores siguientes controlan el comportamiento de la recolección de elementos no utilizados de la imagen para kubelet:

spec:
  kubelet:
    imageGCHighThresholdPercent: 85
    imageGCLowThresholdPercent: 80

Estos controles de configuración controlan cuando kubelet realiza la recolección de elementos no utilizados de imágenes de contenedor:

  • imageGCHighThresholdPercent: Porcentaje de uso de disco que desencadena la recolección de basura de imágenes.
  • imageGCLowThresholdPercent: porcentaje de uso del disco objetivo después de la recolección de basura.

Administración de topologías

La siguiente configuración controla la directiva del administrador de topologías para kubelet:

spec:
  kubelet:
    topologyManagerPolicy: "best-effort"  # none, restricted, best-effort, single-numa-node

El administrador de topologías ayuda a coordinar la asignación de recursos para cargas de trabajo sensibles a la latencia entre recursos de CPU y dispositivo (como GPU).

Configuración del sistema

Las siguientes opciones permiten configurar parámetros de sistema adicionales para kubelet:

spec:
  kubelet:
    allowedUnsafeSysctls:
      - "kernel.msg*"
      - "net.ipv4.route.min_pmtu"
    containerLogMaxSize: "50Mi"
    containerLogMaxFiles: 5
    podPidsLimit: 4096
  • allowedUnsafeSysctls: lista de sysctls no seguros permitidos que los pods pueden usar.
  • containerLogMaxSize: tamaño máximo de los archivos de registro de contenedor antes de la rotación.
  • containerLogMaxFiles: número máximo de archivos de registro de contenedor que se van a conservar.
  • podPidsLimit: número máximo de procesos permitidos en cualquier pod.

Configuración de etiquetas de recursos de Azure

Puede especificar etiquetas de recursos de Azure que se aplican a todas las instancias de máquina virtual creadas mediante un recurso determinado AKSNodeClass . Las etiquetas son útiles para el seguimiento de costos, la organización de recursos y los requisitos de cumplimiento.

Limitaciones de etiquetas

  • Las etiquetas de recursos de Azure tienen un límite de 50 etiquetas por recurso.
  • Los nombres de las etiquetas no distinguen mayúsculas ye minúsculas, pero sus valores sí.
  • Azure reserva algunos nombres de etiqueta que no se pueden usar. Para obtener más información, consulte Guía y límites de etiquetas.

Configuración de etiquetas de ejemplo

spec:
  tags:
    Environment: "production"
    Team: "platform"
    Application: "web-service"
    CostCenter: "engineering"

Ejemplo de configuración completo AKSNodeClass

En el ejemplo siguiente se muestra una configuración completa AKSNodeClass que incluye todas las opciones descritas en este artículo:

apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  name: default
spec:
  template:
    spec:
      nodeClassRef:
        apiVersion: karpenter.azure.com/v1beta1
        kind: AKSNodeClass
        name: comprehensive-example
---
apiVersion: karpenter.azure.com/v1beta1
kind: AKSNodeClass
metadata:
  name: comprehensive-example
spec:
  # Image family configuration
  # Default: Ubuntu
  # Valid values: Ubuntu, AzureLinux
  imageFamily: Ubuntu

  # FIPS compliant mode - allows support for FIPS-compliant node images
  # Default: Disabled
  # Valid values: FIPS, Disabled
  fipsMode: Disabled

  # Virtual network subnet configuration (optional)
  # If not specified, uses the default --vnet-subnet-id from Karpenter installation
  vnetSubnetID: "/subscriptions/12345678-1234-1234-1234-123456789012/resourceGroups/my-rg/providers/Microsoft.Network/virtualNetworks/my-vnet/subnets/my-subnet"

  # OS disk size configuration
  # Default: 128 GB
  # Minimum: 30 GB
  osDiskSizeGB: 128

  # Maximum pods per node configuration
  # Default behavior depends on network plugin:
  # - Azure CNI with standard networking: 30 pods
  # - Azure CNI with overlay networking: 250 pods
  # - Other configurations: 110 pods
  # Range: 10-250
  maxPods: 30

  # Azure resource tags (optional)
  # Applied to all VM instances created with this AKSNodeClass
  tags:
    Environment: "production"
    Team: "platform-team"
    Application: "web-service"
    CostCenter: "engineering"

  # Kubelet configuration (optional)
  # All fields are optional with sensible defaults
  kubelet:
    # CPU management policy
    # Default: "none"
    # Valid values: none, static
    cpuManagerPolicy: "static"

    # CPU CFS quota enforcement
    # Default: true
    cpuCFSQuota: true

    # CPU CFS quota period
    # Default: "100ms"
    cpuCFSQuotaPeriod: "100ms"

    # Image garbage collection thresholds
    # imageGCHighThresholdPercent must be greater than imageGCLowThresholdPercent
    # Range: 0-100
    imageGCHighThresholdPercent: 85
    imageGCLowThresholdPercent: 80

    # Topology manager policy
    # Default: "none"
    # Valid values: none, restricted, best-effort, single-numa-node
    topologyManagerPolicy: "best-effort"

    # Allowed unsafe sysctls (optional)
    # Comma-separated list of unsafe sysctls or patterns
    allowedUnsafeSysctls:
      - "kernel.msg*"
      - "net.ipv4.route.min_pmtu"

    # Container log configuration
    # containerLogMaxSize default: "50Mi"
    containerLogMaxSize: "50Mi"
    
    # containerLogMaxFiles default: 5, minimum: 2
    containerLogMaxFiles: 5

    # Pod process limits
    # Default: -1 (unlimited)
    podPidsLimit: 4096

Pasos siguientes

Para obtener más información sobre el aprovisionamiento automático de nodos en AKS, consulte los siguientes artículos: