Automatisk avetablering av noder (förhandsversion)

När du distribuerar arbetsbelastningar till AKS måste du fatta ett beslut om konfigurationen av nodpoolen när det gäller den VM-storlek som behövs. När dina arbetsbelastningar blir mer komplexa och kräver olika processorer, minne och funktioner för att köras blir det svårt att behöva utforma konfigurationen av den virtuella datorn för många resursbegäranden.

Nod autoprovisioning (NAP) (förhandsversion) bestämmer baserat på väntande poddresurskrav den optimala VM-konfigurationen för att köra dessa arbetsbelastningar på det mest effektiva och kostnadseffektiva sättet.

NAP baseras på Karpenter-projektet med öppen källkod och AKS-providern är också öppen källkod. NAP distribuerar och konfigurerar och hanterar Karpenter automatiskt i dina AKS-kluster.

Viktigt!

Nod autoprovisioning (NAP) för AKS är för närvarande i förhandsversion. Juridiska villkor för Azure-funktioner i betaversion, förhandsversion eller som av någon annan anledning inte har gjorts allmänt tillgängliga ännu finns i kompletterande användningsvillkor för Microsoft Azure-förhandsversioner.

Innan du börjar

Installera CLI-tillägget aks-preview

  1. Installera CLI-tillägget aks-preview med kommandot az extension add .

    az extension add --name aks-preview
    
  2. Uppdatera tillägget så att du har den senaste versionen installerad med kommandot az extension update .

    az extension update --name aks-preview
    

Registrera funktionsflaggan NodeAutoProvisioningPreview

  1. Registrera funktionsflaggan NodeAutoProvisioningPreviewaz feature register med kommandot .

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

    Det tar några minuter för statusen att visa Registrerad.

  2. Kontrollera registreringsstatusen az feature show med kommandot .

    az feature show --namespace "Microsoft.ContainerService" --name "NodeAutoProvisioningPreview"
    
  3. När statusen visar Registrerad uppdaterar du registreringen av resursprovidern Microsoft.ContainerService med hjälp av az provider register kommandot .

    az provider register --namespace Microsoft.ContainerService
    

Begränsningar

  • Den enda nätverkskonfiguration som tillåts är Cilium + Overlay + Azure
  • Du kan inte aktivera i ett kluster där nodpooler har autoskalning av kluster aktiverat

Funktioner som inte stöds:

  • Windows-nodpooler
  • Tillämpa anpassad konfiguration på nod-kubelet
  • IPv6-kluster
  • Tjänstens huvudnamn

    Kommentar

    Du kan använda antingen en systemtilldelad eller användartilldelad hanterad identitet.

  • Diskkrypteringsuppsättningar
  • CustomCATrustCertificates
  • Starta stoppläge
  • HTTP-proxy
  • UtgåendeTypmutation . Alla OutboundTypes stöds, men du kan inte ändra dem när du har skapat dem.

Aktivera automatisk avetablering av noder

Om du vill aktivera automatisk etablering av noder skapar du ett nytt kluster med kommandot az aks create och anger --node-provisioning-mode till "Auto". Du måste också använda överläggsnätverk och ciliumnätverksprincipen.

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

Nodpooler

Autoetablering av noder använder en lista över VM-SKU:er som utgångspunkt för att avgöra vilka som passar bäst för de arbetsbelastningar som är i ett väntande tillstånd. Om du har kontroll över vilken SKU du vill ha i den första poolen kan du ange specifika SKU-familjer eller VM-typer och den maximala mängden resurser som en provisioner använder.

Om du till exempel har specifika VM-SKU:er som är reserverade instanser kanske du bara vill använda de virtuella datorerna som startpool.

Du kan ha flera nodpooldefinitioner i ett kluster, men AKS distribuerar en standarddefinition för nodpoolen som du kan ändra:

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

Krav för nodetablering som stöds

SKU-väljare med välkända etiketter

Väljare beskrivning Exempel
karpenter.azure.com/sku-family VM SKU-familj D, F, L osv.
karpenter.azure.com/sku-name Explicit SKU-namn Standard_A1_v2
karpenter.azure.com/sku-version SKU-version (utan "v", kan använda 1) 1 , 2
karpenter.sh/capacity-type Vm-allokeringstyp (spot/på begäran) spot or on-demand
karpenter.azure.com/sku-cpu Antal processorer i den virtuella datorn 16
karpenter.azure.com/sku-memory Minne i virtuell dator i MiB 131072
karpenter.azure.com/sku-gpu-name GPU-namn A100
karpenter.azure.com/sku-gpu-manufacturer GPU-tillverkare nvidia
karpenter.azure.com/sku-gpu-count GPU-antal per virtuell dator 2
karpenter.azure.com/sku-networking-accelerated Om den virtuella datorn har accelererat nätverk [sant, falskt]
karpenter.azure.com/sku-storage-premium-capable Om den virtuella datorn stöder Premium IO-lagring [sant, falskt]
karpenter.azure.com/sku-storage-ephemeralos-maxsize Storleksgräns för den tillfälliga OS-disken i Gb 92
topology.kubernetes.io/zone Tillgänglighetszonerna [uksouth-1,uksouth-2,uksouth-3]
kubernetes.io/os Operativsystem (endast Linux under förhandsversionen) linux
kubernetes.io/arch CPU-arkitektur (AMD64 eller ARM64) [amd64, arm64]

Om du vill visa en lista över de virtuella datorernas SKU-funktioner och tillåtna värden använder du vm list-skus kommandot från Azure CLI.

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

Nodpoolsgränser

Som standard försöker NAP schemalägga dina arbetsbelastningar inom den Azure-kvot som du har tillgänglig. Du kan också ange den övre gränsen för resurser som används av en nodpool och ange gränser i specifikationen för nodpoolen.

  # 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

Vikter för nodpool

När du har definierat flera nodpooler kan du ange var en arbetsbelastning ska schemaläggas. Definiera den relativa vikten för nodpoolens definitioner.

  # 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

Uppdateringar av Kubernetes- och nodbild

AKS med NAP hanterar Kubernetes-versionsuppgraderingar och VM OS-diskuppdateringar åt dig som standard.

Kubernetes-uppgraderingar

Kubernetes-uppgraderingar för NAP-nodpooler följer Kubernetes-versionen för kontrollplanet. Om du utför en klusteruppgradering uppdateras NAP-noderna automatiskt för att följa samma versionshantering.

Uppdateringar av nodbild

Som standard uppdateras virtuella datorer i NAP-nodpoolen automatiskt när en ny avbildning är tillgänglig. Om du vill fästa en nodpool på en viss nodbildversion kan du ange imageVersion på nodklassen:

kubectl edit aksnodeclass default

I nodklassdefinitionen anger du imageVersion till en av de publicerade versionerna som visas i AKS-versionsanteckningarna. Du kan också se tillgängligheten för bilder i regioner genom att referera till AKS-versionsspåraren

ImageVersion är datumdelen på nodavbildningen eftersom endast Ubuntu 22.04 stöds, till exempel "AKSUbuntu-2204-202311.07.0" skulle vara "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

Om du tar bort imageVersion-specifikationen återställs nodpoolen så att den uppdateras till den senaste nodbildversionen.

Nodstörningar

När arbetsbelastningarna på noderna skalas ned använder NAP avbrottsregler i specifikationen för nodpoolen för att bestämma när och hur dessa noder ska tas bort och eventuellt schemalägga om dina arbetsbelastningar så att de blir mer effektiva.

Du kan ta bort en nod manuellt med hjälp av kubectl delete node, men NAP kan också styra när noderna ska optimeras.

  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

Övervaka urvalshändelser

Autoprovision för Nod skapar klusterhändelser som kan användas för att övervaka distributions- och schemaläggningsbeslut som fattas. Du kan visa händelser via Kubernetes-händelseströmmen.

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