Condividi tramite


Configurare le risorse AKSNodeClass per il provisioning automatico dei nodi (NAP) nel servizio Azure Kubernetes

Questo articolo illustra come configurare AKSNodeClass le risorse per definire impostazioni specifiche di Azure per il provisioning automatico dei nodi (NAP) nel servizio Azure Kubernetes usando Karpenter. AKSNodeClass consente di personalizzare vari aspetti dei nodi di cui Karpenter esegue il provisioning, ad esempio l'immagine della macchina virtuale ( VM), le dimensioni del disco del sistema operativo , il numero massimo di pod per nodo e le configurazioni kubelet.

Importante

A partire dal 30 novembre 2025, il servizio Azure Kubernetes non supporta più o fornisce aggiornamenti della sicurezza per Azure Linux 2.0. L'immagine del nodo Linux 2.0 di Azure è bloccata alla versione 202512.06.0. A partire dal 31 marzo 2026, le immagini dei nodi verranno rimosse e non sarà possibile ridimensionare i pool di nodi. Eseguire la migrazione a una versione di Linux di Azure supportata aggiornando i pool di nodi a una versione di Kubernetes supportata o eseguendo la migrazione ad osSku AzureLinux3. Per altre informazioni, vedere il problema di ritiro di GitHub e l'annuncio di ritiro degli aggiornamenti di Azure. Per rimanere informati sugli annunci e sugli aggiornamenti, seguire le note di rilascio di AKS.

Panoramica delle risorse AKSNodeClass

Le risorse AKSNodeClass consentono di configurare impostazioni specifiche di Azure per la Protezione accesso alla rete. Ogni NodePool risorsa deve fare riferimento a un AKSNodeClass usando spec.template.spec.nodeClassRef. È possibile avere più NodePools che puntano allo stesso AKSNodeClass, consentendo di condividere configurazioni comuni di Azure tra pool di nodi diversi.

Configurazione della famiglia di immagini

Il imageFamily campo determina l'immagine della macchina virtuale predefinita e la logica di bootstrap per i nodi di cui è stato effettuato il provisioning tramite .AKSNodeClass Se non si specifica una famiglia di immagini, il valore predefinito è Ubuntu2204. Le GPU sono supportate con entrambe le famiglie di immagini in macchine virtuali compatibili.

Famiglie di immagini supportate

  • Ubuntu: Ubuntu 22.04 Long Term Support (LTS) è la distribuzione Linux predefinita per i nodi del servizio Azure Kubernetes.
  • AzureLinux: Azure Linux è la distribuzione linux alternativa di Microsoft per i carichi di lavoro del servizio Azure Kubernetes. Per altre informazioni, vedere la documentazione di Azure Linux

Configurazione della famiglia di immagini di esempio

L'esempio seguente configura il AKSNodeClass per utilizzare la famiglia di immagini AzureLinux.

spec:
  imageFamily: AzureLinux

Configurazione dell'immagine del nodo conforme a FIPS

È anche possibile abilitare immagini dei nodi conformi a FIPS (Federal Information Process Standard). Per maggiori informazioni su FIPS in AKS, consulta la documentazione di FIPS

Il fipsMode campo è impostato per impostazione predefinita su Disabilitato e può essere impostato sulle opzioni seguenti:

  • FIPS: selezionare immagini dei nodi conformi a FIPS
  • Disabilitato: non usare immagini dei nodi conformi a FIPS

L'esempio seguente configura "AKSNodeClass" per selezionare immagini di nodi conformi a FIPS impostando fipsMode su FIPS:

spec:
  fipsMode: FIPS

Configurazione della subnet della rete virtuale

Il vnetSubnetID campo specifica la subnet della rete virtuale di Azure da usare per il provisioning delle interfacce di rete del nodo. Questo campo è facoltativo. Se non si specifica una subnet, NAP usa la subnet predefinita configurata durante l'installazione di Karpenter. Per ulteriori informazioni, vedere Configurazioni della subnet per NAP.

Configurazione di subnet di esempio

L'ID subnet deve essere nel formato di Azure Resource Manager completo, come illustrato nell'esempio seguente:

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

Configurazione delle dimensioni del disco del sistema operativo

Il campo osDiskSizeGB specifica le dimensioni del disco del sistema operativo in gigabyte. Il valore predefinito è 128 GB e il valore minimo è 30 GB.

Prendere in considerazione dimensioni del disco del sistema operativo maggiori per i carichi di lavoro che:

  • Archiviare dati significativi in locale.
  • Richiedi spazio aggiuntivo per le immagini del contenitore.
  • Requisiti elevati di I/O del disco.

Configurazione delle dimensioni del disco del sistema operativo di esempio

spec:
  osDiskSizeGB: 256  # 256 GB OS disk

Configurazione temporanea del disco del sistema operativo

NAP usa automaticamente dischi del sistema operativo temporanei se disponibili e se adatti alle dimensioni del disco richieste. I dischi temporanei del sistema operativo offrono prestazioni migliori e costi inferiori rispetto ai dischi gestiti.

Criteri di selezione dei dischi temporanei

Il sistema sceglie automaticamente i dischi temporanei negli scenari seguenti:

  • Il tipo di istanza di macchina virtuale supporta i dischi temporanei del sistema operativo.
  • La capacità del disco effimero è maggiore o uguale alla richiesta osDiskSizeGB.
  • La macchina virtuale ha una capacità di archiviazione temporanea sufficiente.

Se queste condizioni non vengono soddisfatte, il sistema esegue il fallback per l'uso di dischi gestiti.

Tipi di disco temporanei e definizione delle priorità

Le VM di Azure possono avere tipi diversi di archiviazione temporanea. Il sistema usa l'ordine di priorità seguente:

  • Dischi NVMe (prestazioni più elevate)
  • Dischi della cache (prestazioni bilanciate)
  • Dischi delle risorse (prestazioni di base)

Esempio di configurazione temporanea del disco

È possibile usare i requisiti del pool di nodi per garantire che i nodi dispongano di capacità temporanea del disco sufficiente, come illustrato nell'esempio seguente:

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

Questa configurazione garantisce che vengano selezionati solo i tipi di istanza di VM con dischi temporanei di dimensioni superiori a 128 GB, garantendo l'utilizzo temporaneo del disco per le dimensioni del disco del sistema operativo specificate.

Configurazione massima dei pod

Il campo maxPods specifica il numero massimo di pod che possono essere pianificati in un nodo. Questa impostazione influisce sia sulla densità del cluster che sulla configurazione di rete.

Il valore minimo per maxPods è 10 e il valore massimo è 250.

Comportamento predefinito per maxPods

Il comportamento predefinito per maxPods dipende dalla configurazione del plug-in di rete. La tabella seguente riepiloga le impostazioni predefinite:

Configurazione del plug-in di rete Impostazione predefinita maxPods per nodo
Azure CNI con rete standard (v1 o NodeSubnet) 30
Azure CNI con rete di sovrapposizione 250
Nessuno (nessun plug-in di rete) 250
Altre configurazioni 110 (impostazione predefinita di Kubernetes standard)

Configurazione di esempio per il numero massimo di pod

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

Configurazione localDNS

LocalDNS distribuisce un proxy DNS a livello di nodo che risolve le query DNS più vicine ai carichi di lavoro, riducendo la latenza delle query e migliorando la resilienza durante le interruzioni DNS temporanee. Per altre informazioni, vedere la documentazione di LocalDNS. Per impostazione predefinita, LocalDNS è impostato su Disabilitato e può essere configurato per le opzioni seguenti:

  • Disabled (impostazione predefinita): disabilita la funzionalità LocalDNS. Le query DNS non vengono risolte localmente nel nodo.
  • Preferred, AKS gestisce l'abilitazione di LocalDNS in base alla versione Kubernetes del pool di nodi. La configurazione viene sempre convalidata e inclusa, ma LocalDNS non è abilitata a meno che non venga usata la versione corretta di Kubernetes.
  • Required - LocalDNS viene applicato al pool di nodi se tutti i prerequisiti sono soddisfatti. Se i requisiti non sono soddisfatti, la distribuzione ha esito negativo.

Esempio di configurazione LocalDNS

È possibile personalizzare le configurazioni LocalDNS, vnetDNSOverrides ad esempio e kubeDNSOverrides. Per altri dettagli sui plug-in supportati, vedere Personalizzare LocalDNS.

spec:
  LocalDNS:
    mode: Required
    vnetDNSOverrides:
      - zone: "."
        cacheDuration: "30s"
        forwardDestination: VnetDNS
        forwardPolicy: Random
        maxConcurrent: 80
        protocol: ForceTCP
        queryLogging: Log
        serveStale: Immediate
        serveStaleDuration: "100s"
      - zone: "cluster.local"
        cacheDuration: "40s"
        forwardDestination: VnetDNS
        forwardPolicy: Sequential
        maxConcurrent: 70
        protocol: PreferUDP
        queryLogging: Error
        serveStale: Disable
        serveStaleDuration: "30s"
    kubeDNSOverrides:
      - zone: "."
        cacheDuration: "30s"
        forwardDestination: ClusterCoreDNS
        forwardPolicy: RoundRobin
        maxConcurrent: 100
        protocol: PreferUDP
        queryLogging: Log
        serveStale: Immediate
        serveStaleDuration: "60s"
      - zone: "cluster.local"
        cacheDuration: "10s"
        forwardDestination: ClusterCoreDNS
        forwardPolicy: Sequential
        maxConcurrent: 50
        protocol: PreferUDP
        queryLogging: Error
        serveStale: Disable
        serveStaleDuration: "30s"

Configurazione del kubelet

La sezione kubelet consente di configurare vari parametri kubelet che influiscono sul comportamento del nodo. Questi parametri sono argomenti kubelet tipici, quindi il provider di Azure li passa semplicemente al kubelet nel nodo.

Importante

Configurare attentamente le impostazioni kubelet e testare prima le modifiche apportate agli ambienti non di produzione.

Gestione della CPU

Le impostazioni seguenti controllano il comportamento di gestione della CPU per kubelet:

spec:
  kubelet:
    cpuManagerPolicy: "static"  # or "none"
    cpuCFSQuota: true
    cpuCFSQuotaPeriod: "100ms"
  • cpuManagerPolicy: controlla il modo in cui kubelet alloca le risorse della CPU. Impostare su "static" per l'associazione della CPU nei carichi di lavoro sensibili alla latenza.
  • cpuCFSQuota: abilita la tutela della quota di Utilità di pianificazione completamente equa (CFS) della CPU per i contenitori che specificano i limiti della CPU.
  • cpuCFSQuotaPeriod: imposta il periodo di quota di CPU CFS.

GC delle immagini

Le impostazioni seguenti controllano il comportamento della raccolta dei rifiuti delle immagini per il kubelet:

spec:
  kubelet:
    imageGCHighThresholdPercent: 85
    imageGCLowThresholdPercent: 80

Queste impostazioni controllano quando kubelet esegue la GC delle immagini del contenitore:

  • imageGCHighThresholdPercent: percentuale di utilizzo del disco che attiva l'operazione di GC delle immagini.
  • imageGCLowThresholdPercent: Percentuale di utilizzo del disco di destinazione dopo la raccolta dei rifiuti.

Gestione della topologia

L'impostazione seguente controlla i criteri di gestione della topologia per kubelet:

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

Il gestore della topologia consente di coordinare l'allocazione delle risorse per i carichi di lavoro sensibili alla latenza tra le risorse della CPU e del dispositivo (ad esempio GPU).

Configurazione del sistema

Le impostazioni seguenti consentono di configurare parametri di sistema aggiuntivi per kubelet:

spec:
  kubelet:
    allowedUnsafeSysctls:
      - "kernel.msg*"
      - "net.ipv4.route.min_pmtu"
    containerLogMaxSize: "50Mi"
    containerLogMaxFiles: 5
    podPidsLimit: 4096
  • allowedUnsafeSysctls: elenco di sysctls non sicuri consentiti che i pod possono usare.
  • containerLogMaxSize: dimensione massima dei file di log del contenitore prima della rotazione.
  • containerLogMaxFiles: numero massimo di file di log del contenitore da conservare.
  • podPidsLimit: numero massimo di processi consentiti in qualsiasi pod.

Configurazione dei tag delle risorse di Azure

È possibile specificare i tag delle risorse di Azure che si applicano a tutte le istanze di macchina virtuale create usando una determinata AKSNodeClass risorsa. I tag sono utili per tenere traccia di costi, organizzazione delle risorse e requisiti di conformità.

Limitazioni dei tag

  • I tag delle risorse di Azure hanno un limite di 50 tag per risorsa.
  • I nomi dei tag non fanno distinzione tra maiuscole e minuscole, mentre i valori dei tag distinguono maiuscole e minuscole.
  • Azure riserva alcuni nomi di tag che non possono essere usati. Per altre informazioni, vedere Linee guida e limiti per i tag.

Configurazione dei tag di esempio

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

Esempio di configurazione completo AKSNodeClass

L'esempio seguente illustra una configurazione completa AKSNodeClass che include tutte le impostazioni descritte in questo articolo:

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

  # LocalDNS mode - allows use of LocalDNS feature
  # Default: Disabled
  # Valid values: Preferred, Required, Disabled
  LocalDNS:
    mode: Disabled
    # additional details on vnetDNSOverrides and kubeDNSOverrides can be added here

  # 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

Passaggi successivi

Per altre informazioni sul provisioning automatico dei nodi in AKS (Azure Kubernetes Service), vedere gli articoli seguenti: