Delen via


Automatische inrichting van nodes (voorbeeldversie)

Wanneer u workloads implementeert in AKS, moet u een beslissing nemen over de configuratie van de knooppuntgroep met betrekking tot de benodigde VM-grootte. Naarmate uw workloads complexer worden en verschillende CPU-, geheugen- en mogelijkheden nodig hebben om uit te voeren, wordt de overhead van het ontwerpen van uw VM-configuratie voor talloze resourceaanvragen moeilijk.

Automatisch inrichten van knooppunten (NAP) (preview-versie) maakt gebruik van lopende vereisten voor podresources om de optimale configuratie van virtuele machines te bepalen en deze workloads op de meest efficiënte en rendabele manier uit te voeren.

NAP is gebaseerd op het opensource Karpenter-project en de AKS-provider is ook open source. NAP implementeert, configureert en beheert automatisch Karpenter op uw AKS-clusters.

Belangrijk

Automatische inrichting van knooppunten (NAP) voor AKS is momenteel in PREVIEW. Raadpleeg de Aanvullende voorwaarden voor Microsoft Azure-previews voor juridische voorwaarden die van toepassing zijn op Azure-functies die in bèta of preview zijn of die anders nog niet algemeen beschikbaar zijn.

Voordat u begint

aks-preview De CLI-extensie installeren

  1. Installeer de aks-preview CLI-extensie met behulp van de az extension add opdracht.

    az extension add --name aks-preview
    
  2. Werk de extensie bij om ervoor te zorgen dat u de nieuwste versie hebt geïnstalleerd met behulp van de az extension update opdracht.

    az extension update --name aks-preview
    

NodeAutoProvisioningPreview De functievlag registreren

  1. Registreer de NodeAutoProvisioningPreview functievlag met behulp van de az feature register opdracht.

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

    Het duurt enkele minuten voordat de status Geregistreerd wordt weergegeven.

  2. Controleer de registratiestatus met behulp van de az feature show opdracht.

    az feature show --namespace "Microsoft.ContainerService" --name "NodeAutoProvisioningPreview"
    
  3. Wanneer de status Geregistreerd weergeeft, vernieuwt u de registratie van de Microsoft.ContainerService-resourceprovider met behulp van het az provider register commando.

    az provider register --namespace Microsoft.ContainerService
    

Beperkingen

  • U kunt geen functies inschakelen in een cluster waar automatische schaalaanpassing voor knooppuntgroepen is ingeschakeld.

Niet-ondersteunde functies

  • Windows-knooppuntgroepen
  • Aangepaste configuratie toepassen op de node kubelet
  • IPv6-clusters
  • Serviceprincipals

    Notitie

    U kunt een door het systeem toegewezen of door de gebruiker toegewezen beheerde identiteit gebruiken.

  • Schijfversleutelingssets
  • CustomCA Vertrouwenscertificaten
  • Modus Stoppen starten
  • HTTP-proxy
  • OutboundType mutatie. Alle uitgaandetypes worden ondersteund, maar u kunt deze niet wijzigen nadat u deze hebt gemaakt.
  • Privécluster (en neem je eigen private DNS mee)

Netwerkconfiguratie

De aanbevolen netwerkconfiguraties voor clusters met ingeschakelde knooppunt-autoprovisioning zijn als volgt:

Onze aanbevolen engine voor netwerkbeleid is Cilium.

De volgende netwerkconfiguraties worden momenteel niet ondersteund:

  • Calico-netwerkbeleid
  • Dynamische IP-toewijzing
  • Statische toewijzing van CIDR-blokken

Automatische inrichting van knooppunten inschakelen

Automatische toewijzing van knooppunten inschakelen op een nieuw cluster

  • Schakel automatische inrichting van knooppunten in op een nieuw cluster met behulp van het az aks create commando en stel --node-provisioning-mode in op Auto. U moet ook het --network-plugin instellen op azure, --network-plugin-mode op overlayen --network-dataplane op 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
    

Automatische inrichting van knooppunten inschakelen op een bestaand cluster

  • Schakel automatische inrichting van knooppunten in op een bestaand cluster met behulp van de az aks update opdracht en stel --node-provisioning-mode in op Auto. U moet ook het --network-plugin instellen op azure, --network-plugin-mode op overlayen --network-dataplane op 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
    

Knooppuntpools

Automatische inrichting van knooppunten maakt gebruik van een lijst met VM-SKU's als uitgangspunt om te bepalen welke SKU het meest geschikt is voor de workloads die in behandeling zijn. Wanneer u controle hebt over welke SKU u in de eerste pool wilt, kunt u specifieke SKU-families of typen virtuele machines opgeven en het maximale aantal resources dat een provisioner gebruikt specificeren. U kunt ook verwijzen naar verschillende specificaties in het knooppuntgroepbestand, zoals het opgeven van spot- of on-demand exemplaren, meerdere architecturen en meer.

Als u bijvoorbeeld specifieke groottes voor virtuele machines hebt die gereserveerde instanties zijn, wilt u mogelijk alleen deze virtuele machines gebruiken als de startpool.

U kunt meerdere knooppuntgroepdefinities in een cluster hebben, maar AKS implementeert een standaarddefinitie voor knooppuntgroepen die u kunt wijzigen:

apiVersion: karpenter.sh/v1
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

Vereisten voor ondersteunde knooppuntvoorziening

SKU-selectors met bekende labels

Keuzemenu Beschrijving Voorbeeld
karpenter.azure.com/sku-family VM-SKU-serie D, F, L etc.
karpenter.azure.com/sku-name Expliciete SKU-naam Standard_A1_v2
karpenter.azure.com/sku-version SKU-versie (zonder 'v', kan 1 gebruiken) 1 , 2
karpenter.sh/capacity-type VM-toewijzingstype (Spot/On Demand) spot of on-demand
karpenter.azure.com/sku-cpu Aantal CPU's in VM 16
karpenter.azure.com/sku-memory Geheugen in VM in MiB 131072
karpenter.azure.com/sku-gpu-name GPU-naam A100
karpenter.azure.com/sku-gpu-manufacturer GPU-fabrikant nvidia
karpenter.azure.com/sku-gpu-count AANTAL GPU's per VM 2
karpenter.azure.com/sku-networking-accelerated Of de VIRTUELE machine versneld netwerken heeft [waar, onwaar]
karpenter.azure.com/sku-storage-premium-capable Of de VM Premium IO-opslag ondersteunt [waar, onwaar]
karpenter.azure.com/sku-storage-ephemeralos-maxsize Groottelimiet voor de tijdelijke besturingssysteemschijf in Gb 92
topology.kubernetes.io/zone De beschikbaarheidszone(s) [uksouth-1,uksouth-2,uksouth-3]
kubernetes.io/os Besturingssysteem (alleen Linux tijdens preview) Linux
kubernetes.io/arch CPU-architectuur (AMD64 of ARM64) [amd64, arm64]

Gebruik de Azure CLI-opdracht om de SKU-mogelijkheden en toegestane waarden van de vm list-skus virtuele machine weer te geven.

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

Limieten voor knooppuntgroepen

Standaard probeert automatische knooppunttoewijzing uw workloads in te plannen binnen het Azure-quotum dat beschikbaar is. U kunt ook de bovengrens opgeven voor resources die door een knooppuntgroep worden gebruikt, waarbij limieten worden opgegeven binnen de specificatie van de knooppuntgroep.

  # 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

Gewichten van knooppuntgroepen

Wanneer u meerdere knooppuntgroepen hebt gedefinieerd, is het mogelijk om een voorkeur in te stellen waar een workload moet worden gepland. Definieer het relatieve gewicht van uw knooppuntgroepdefinities.

  # 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

Updates voor Kubernetes- en node-afbeeldingen

AKS met automatische inrichting van knooppunten beheert standaard de Kubernetes-versie-upgrades en OS-schijfupdates voor VMs.

Kubernetes-upgrades

Kubernetes-upgrades voor autoprovisioning van knooppunten volgen de Kubernetes-versie van het controlevlak. Als u een clusterupgrade uitvoert, worden uw nodes voor automatische inrichting automatisch bijgewerkt om dezelfde versienummering te volgen.

Updates van knooppuntinstallatiekopieën

Standaard worden virtuele machines voor de NAP-knooppool automatisch bijgewerkt wanneer er een nieuw installatiekopie beschikbaar is. Als u een nodepool wilt vastmaken op een bepaalde versie van de knooppuntimage, kunt u de imageVersion instellen op de nodeklasse.

kubectl edit aksnodeclass default

Stel in de definitie van de knooppuntklasse de imageVersion in op een van de gepubliceerde releases die worden vermeld in de opmerkingen bij de AKS-release. U kunt ook de beschikbaarheid van afbeeldingen in regio's bekijken door te verwijzen naar de AKS-releasetracker

ImageVersion is het datumgedeelte van de Node Image, omdat alleen Ubuntu 22.04 wordt ondersteund. Bijvoorbeeld, 'AKSUbuntu-2204-202311.07.0' zou '202311.07.0' zijn.

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

Als u de imageVersion-specificatie verwijdert, wordt de node pool teruggezet naar de meest recente versie van de knooppuntinstallatiekopieën.

Belangrijk

Nadat u de SSH-sleutel hebt bijgewerkt, worden uw knooppunten niet automatisch bijgewerkt door AKS. U kunt er op elk gewenst moment voor kiezen om een [updatebewerking voor nodepool][node-image-upgrade] uit te voeren. Het bijwerken van SSH-sleutels treedt in werking nadat de update van een knooppuntbeeld is voltooid. Voor clusters met ingeschakelde auto-provisioning kan een update van een knooppuntimage worden uitgevoerd door een nieuw label toe te passen op de Kubernetes NodePool-customresource.

Onderbreking van knooppunt

Wanneer de workloads op uw knooppunten omlaag worden geschaald, maakt de autoprovisioning van knooppunten gebruik van verstoringsregels in de specificatie van de knooppuntgroep om te bepalen wanneer en hoe deze knooppunten moeten worden verwijderd en om uw workloads mogelijk efficiënter opnieuw in te plannen. Dit wordt voornamelijk gedaan door consolidatie, waardoor knooppunten worden verwijderd of vervangen om het bin-packen van uw pods in een optimale configuratie mogelijk te maken. De op statussen gebaseerde benadering maakt gebruik van ConsolidationPolicy zoals WhenUnderUtilized, WhenEmpty, of WhenEmptyOrUnderUtilized om samenvoeging te initiëren. consolidateAfter is een voorwaarde op basis van tijd die kan worden ingesteld om buffertijd tussen acties toe te staan.

U kunt een knooppunt handmatig verwijderen met behulp van kubectl delete node, maar automatische inrichting van knooppunten kan ook bepalen wanneer uw knooppunten moeten worden geoptimaliseerd op basis van uw specificaties.

  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

Selectie-gebeurtenissen bewaken

Bij het automatisch inrichten van knooppunten worden clustergebeurtenissen geproduceerd die kunnen worden gebruikt om beslissingen over implementatie en planning te monitoren. U kunt gebeurtenissen bekijken via de Kubernetes-gebeurtenissenstroom.

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

Automatische inrichting van knooppunten uitschakelen

Node-autoprovisioning kan alleen worden uitgeschakeld wanneer:

  • Er zijn geen bestaande DOOR NAP beheerde knooppunten. Gebruik kubectl get nodes -l karpenter.sh/nodepool dit om door NAP beheerde knooppunten weer te geven.
  • Alle bestaande karpenter.sh/NodePools zijn spec.limits.cpu ingesteld op 0.

Stappen voor het uitschakelen van automatische configuratie van knooppunten

  1. Stel alle karpenter.sh/NodePools spec.limits.cpu veld in op 0. Hiermee voorkomt u dat nieuwe knooppunten worden gemaakt, maar worden momenteel actieve knooppunten niet onderbroken.

Notitie

Als het u niet uitmaakt om ervoor te zorgen dat elke pod die op een NAP-knooppunt draait veilig naar een niet-NAP-knooppunt wordt gemigreerd, kunt u stap 2 en 3 overslaan en in plaats daarvan de kubectl delete node opdracht gebruiken voor elk door NAP beheerd knooppunt.

Het overslaan van stappen 2 en 3 wordt niet aanbevolen, omdat sommige pods mogelijk in afwachting blijven en niet voldoen aan PDBs.

Voer niet uit kubectl delete node op knooppunten die niet worden beheerd door NAP.

  1. Voeg de karpenter.azure.com/disable:NoSchedule taint toe aan elke karpenter.sh/NodePool.

    apiVersion: karpenter.sh/v1
    kind: NodePool
    metadata:
      name: default
    spec:
      template:
        spec:
          ...
          taints:
            - key: karpenter.azure.com/disable,
              effect: NoSchedule
    

    Hiermee start u het proces voor het migreren van de workloads van de door NAP beheerde knooppunten naar knooppunten die niet door NAP worden beheerd, met inachtneming van de PDBs en onderbrekingslimieten. Pods zullen migreren naar niet-NAP-knooppunten als ze passen. Als er onvoldoende capaciteit met vaste grootte is, blijven sommige door NAP beheerde knooppunten behouden.

  2. Schaal bestaande ManagedCluster AgentPools met vaste grootte op of maak nieuwe AgentPools met vaste grootte om de belasting van de door NAP beheerde knooppunten te nemen. Omdat deze knooppunten worden toegevoegd aan het cluster, worden de door NAP beheerde knooppunten leeggestroomd en worden werk gemigreerd naar de knooppunten op vaste schaal.

  3. Controleer of alle door NAP beheerde knooppunten worden verwijderd met behulp van kubectl get nodes -l karpenter.sh/nodepool. Als er nog steeds NAP-beheerde knooppunten zijn, betekent dit waarschijnlijk dat het cluster niet meer capaciteit op vaste schaal heeft en meer knooppunten nodig heeft, zodat de resterende workloads kunnen worden gemigreerd.

  4. Werk de parameter voor de inrichtingsmodus van het ManagedCluster-knooppunt bij naar Manual.

    az aks update \
        --name $CLUSTER_NAME \
        --resource-group $RESOURCE_GROUP_NAME \
        --node-provisioning-mode Manual