Provisionnement automatique du nœud (préversion)

Lorsque vous déployez des charges de travail sur AKS, vous devez prendre une décision concernant la taille de machine virtuelle nécessaire à la configuration du pool de nœuds. À mesure que vos charges de travail se complexifient davantage et nécessitent différents processeurs, mémoire et fonctionnalités à exécuter, la surcharge liée à la conception de la configuration de votre machine virtuelle pour de nombreuses demandes de ressources devient difficile.

Le provisionnement automatique du nœud (NAP) (préversion) décide en fonction des besoins en ressources du pod en attente, de la configuration optimale de la machine virtuelle pour exécuter ces charges de travail de la manière la plus efficace et la plus économique.

NAP est basé sur le projet Open Source Karpenter et lefournisseur AKS est également Open Source. NAP déploie, configure et gère automatiquement Karpenter sur vos clusters AKS.

Important

Le provisionnement automatique du nœud (NAP) pour AKS est actuellement en PRÉVERSION. Pour connaître les conditions juridiques qui s’appliquent aux fonctionnalités Azure en version bêta, en préversion ou plus généralement non encore en disponibilité générale, consultez l’Avenant aux conditions d’utilisation des préversions de Microsoft Azure.

Avant de commencer

Installez l’extension CLI aks-preview

  1. Installez l’extension CLI aks-preview à l’aide de la commande az extension add.

    az extension add --name aks-preview
    
  2. Mettez à jour l’extension pour vous assurer que la dernière version est installée à l’aide de la commande az extension update.

    az extension update --name aks-preview
    

Inscrire l’indicateur de fonctionnalité NodeAutoProvisioningPreview

  1. Inscrivez l’indicateur de fonctionnalité NodeAutoProvisioningPreview à l’aide de la commande az feature register.

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

    Quelques minutes sont nécessaires pour que l’état s’affiche Registered (Inscrit).

  2. Vérifiez l’état de l’inscription en utilisant la commande az feature show.

    az feature show --namespace "Microsoft.ContainerService" --name "NodeAutoProvisioningPreview"
    
  3. Quand l’état reflète Inscrit, actualisez l’inscription du fournisseur de ressources Microsoft.ContainerService à l’aide de la commande az provider register.

    az provider register --namespace Microsoft.ContainerService
    

Limites

  • La seule configuration réseau autorisée est Cilium + Overlay + Azure
  • Vous ne pouvez pas l’activer dans un cluster où les pools de nœuds ont activé l’autoscaler de cluster

Fonctionnalités non prises en charge :

  • les pools de nœuds Windows ;
  • Application d’une configuration personnalisée au kubelet du nœud
  • Clusters IPv6
  • Principaux de service

    Remarque

    Vous pouvez utiliser une identité managée affectée par le système ou affectée par l’utilisateur.

  • Jeux de chiffrement Azure Data Box Disk
  • CustomCATrustCertificates
  • Démarrer/arrêter le mode
  • Proxy HTTP
  • Mutation OutboundType. Tous les OutboundTypes sont pris en charge, mais il n’est pas possible de les modifier après la création.

Activer le provisionnement automatique des nœuds

Pour activer le provisionnement automatique des nœuds, créez un cluster à l’aide de la commande « az aks create » et définissez --node-provisioning-mode sur « Auto ». Vous devez également utiliser une mise en réseau de la superposition et la stratégie de réseau cilium.

az aks create --name karpuktest --resource-group karpuk --node-provisioning-mode Auto --network-plugin azure --network-plugin-mode overlay --network-dataplane cilium

Pools des nœuds

Le provisionnement automatique du nœud utilise une liste de références SKU de la machine virtuelle comme point de départ pour décider de celle qui convient le mieux aux charges de travail en état en attente. Avoir du contrôle sur la référence SKU souhaitée dans le pool initial vous permet de spécifier des familles de références SKU spécifiques, ou des types de machines virtuelles et la quantité maximale de ressources utilisées par un provisionneur.

Si vous avez des références SKU spécifiques de machine virtuelle qui sont des instances réservées, par exemple, vous pouvez souhaiter seulement utiliser ces machines virtuelles comme pool de démarrage.

Vous pouvez disposer de plusieurs définitions de pool de nœuds dans un cluster, mais AKS déploie une définition de pool de nœuds par défaut que vous pouvez modifier :

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

Spécifications du provisionneur de nœuds prises en charge

Sélecteurs de référence SKU avec des étiquettes connues

Sélecteur Description Exemple
karpenter.azure.com/sku-family Famille de références de la machine virtuelle D, F, L, etc.
karpenter.azure.com/sku-name Nom explicite de la référence SKU Standard_A1_v2
karpenter.azure.com/sku-version Version de la référence SKU (sans « v », peut utiliser 1) 1, 2
karpenter.sh/capacity-type Type d’allocation de machine virtuelle (spot / à la demande) spot ou à la demande
karpenter.azure.com/sku-cpu Nombre de processeurs dans une machine virtuelle 16
karpenter.azure.com/sku-memory Mémoire dans la machine virtuelle en Mio 131072
karpenter.azure.com/sku-gpu-name Nom du GPU A100
karpenter.azure.com/sku-gpu-manufacturer Fabricant du GPU nvidia
karpenter.azure.com/sku-gpu-count Nombre de GPU par machine virtuelle 2
karpenter.azure.com/sku-networking-accelerated Si la machine virtuelle a des performances réseau accélérées [vrai, faux]
karpenter.azure.com/sku-storage-premium-capable Si la machine virtuelle prend en charge le stockage d’E/S Premium [vrai, faux]
karpenter.azure.com/sku-storage-ephemeralos-maxsize Limite de la taille du disque de système d’exploitation éphémère en Go 92
topology.kubernetes.io/zone La ou les zones de disponibilité [RoyaumeUniSud-1, RoyaumeUniSud-2, RoyaumeUniSud-3]
kubernetes.io/os Système d’exploitation (Linux uniquement pendant la préversion) linux
kubernetes.io/arch Architecture du processeur (AMD64 ou ARM64) [amd64, arm64]

Pour répertorier les fonctionnalités de la référence SKU de la machine virtuelle et les valeurs autorisées, utilisez la commande vm list-skus à partir d’Azure CLI.

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

Limites d’un pool de nœuds

Par défaut, NAP tente de planifier vos charges de travail dans le quota Azure disponible. Vous pouvez également spécifier la limite supérieure des ressources utilisées par un pool de nœuds, en indiquant des limites dans les spécifications du pool de nœuds.

  # 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

Poids du pool de nœuds

Lorsque vous avez défini plusieurs pools de nœuds, vous pouvez définir une préférence concernant l’emplacement dans lequel une charge de travail doit être planifiée. Définissez le poids relatif dans les définitions de votre pool de nœuds.

  # 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

Mises à jour des images de Kubernetes et des nœuds

AKS avec NAP gère les mises à niveau des versions de Kubernetes, ainsi que les mises à jour des disques du système d’exploitation de la machine virtuelle par défaut.

Mises à niveau de Kubernetes

Les mises à niveau Kubernetes pour les pools de nœuds NAP suivent la version de Kubernetes du plan de contrôle. Si vous effectuez une mise à niveau du cluster, vos nœuds NAP sont mis à jour automatiquement pour suivre le même contrôle de version.

Mises à jour de l’image du nœud

Par défaut, les machines virtuelles du pool de nœuds NAP sont automatiquement mises à jour lorsqu’une nouvelle image est disponible. Si vous souhaitez épingler un pool de nœuds à une certaine version de l’image du nœud, vous pouvez définir l’imageVersion sur la classe du nœud :

kubectl edit aksnodeclass default

Dans la définition de la classe de nœud, définissez l’imageVersion sur l’une des versions publiées répertoriées dans les notes de publication AKS. Vous pouvez également voir la disponibilité des images dans les régions en faisant référence au suivi des versions AKS

ImageVersion est la partie date de l’image du nœud, car seul Ubuntu 22.04 est pris en charge, par exemple « AKSUbuntu-2204-202311.07.0 » est « 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

La suppression de la spécification imageVersion rétablit la mise à jour du pool de nœuds vers la dernière version de l’image du nœud.

Interruption du nœud

Lorsque les charges de travail sur vos nœuds effectuent un scale-down, NAP utilise des règles d’interruption sur la spécification du pool de nœuds afin de décider du moment et de la méthode de suppression de ces nœuds, mais également de replanifier éventuellement vos charges de travail pour être plus efficaces.

Vous pouvez manuellement supprimer un nœud à l’aide de kubectl delete node, mais NAP peut également contrôler quand il doit optimiser vos nœuds.

  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

Supervision des événements de sélection

Le provisionnement automatique de nœuds produit des événements de cluster pouvant être utilisés pour superviser les décisions de déploiement et de planification prises. Vous pouvez afficher des événements au moyen du flux d’événements Kubernetes.

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