Ändra storleken på nodpooler i Azure Kubernetes Service (AKS)

Du kanske vill ändra storleken på dina virtuella datorer (VM) för att hantera ett ökande antal distributioner eller för att köra en större arbetsbelastning. Storleksändring av AKS-instanser direkt stöds inte när du använder Virtuella Datorers Skalningsuppsättningar i AKS, enligt AKS supportprinciper:

AKS-agentnoder visas i Azure Portal som vanliga Azure IaaS-resurser. Men dessa virtuella datorer distribueras till en anpassad Azure-resursgrupp (vanligtvis prefix med MC_*). Du kan inte göra direkta anpassningar till dessa noder med hjälp av IaaS-API:er eller resurser. Eventuella anpassade ändringar som inte görs via AKS-API:et bevaras inte via en uppgradering, skalning, uppdatering eller omstart.

I den här artikeln lär du dig den rekommenderade metoden för att ändra storlek på en nodpool genom att skapa en ny nodpool med önskad SKU-storlek, spärra och tömma befintliga noder och sedan ta bort den befintliga nodpoolen.

Viktigt!

Den här metoden är specifik för VM Scale Sets-baserade AKS-kluster. När du använder virtual machines-baserade nodpooler kan du enkelt uppdatera VM-storlekarna i en befintlig nodpool med ett enda Azure CLI-kommando och ha flera VM-storlekar i samma nodpool. Mer information finns i dokumentationen om nodpooler för virtuella datorer.

Ändra storlek på en VMSS-nodpool på plats (förhandsversion)

Viktigt!

AKS-förhandsversionsfunktioner är tillgängliga via självbetjäning och frivillig registrering. Förhandsversioner tillhandahålls "i befintligt skick" och "i mån av tillgång," och de är undantagna från servicenivåavtal och begränsad garanti. AKS-förhandsversioner stöds delvis av kundsupport efter bästa förmåga. Därför är dessa funktioner inte avsedda för produktionsanvändning. Mer information finns i följande supportartiklar:

Nu kan du ändra storlek på vm-storleken (SKU) för en befintlig VMSS-baserad nodpool i ett enda kommando med hjälp av az aks nodepool update --node-vm-size <new-size>. När du utlöser den här uppdateringen utför AKS-resursprovidern en löpande uppgradering genom att:

  1. Skalar upp nya noder med målstorleken för den virtuella datorn.
  2. Avspärrning och tömning av de gamla noderna.
  3. Ta bort de gamla noderna.

Detta undviker det manuella arbetsflödet med create/cordon/drain/delete som beskrivs i resten av den här artikeln.

Så här fungerar storleksändringsdistributionen

Storleksändringsdistributionen använder samma löpande uppgraderingsmotor som en nodbilduppgradering och en Kubernetes-versionsuppgradering, så att den uppfyller följande uppgraderingsrelaterade inställningar som redan har konfigurerats i nodpoolen. I synnerhet tar storleksändringen hänsyn till:

  • Maximal ökning (--max-surge): Styr hur många extra noder med mål-VM-storleken som läggs till under distributionen. Ett högre värde ändrar storlek på poolen snabbare men förbrukar mer beräknings- och IP-kvot. ett lägre värde är långsammare men mindre störande. AKS-standardvärdet är 1, och 33% rekommenderas för produktionsnodpooler.
  • Tidsgräns för noddränering (--drain-timeout): Hur länge AKS väntar på att poddavhysningen ska tas bort på varje gammal nod innan den tas bort. Standardvärdet är 30 minuter. Kombinera detta med lämpliga PodDisruptionBudgets så att arbetsbelastningar kan tömmas på ett säkert sätt.
  • Varaktighet för nodblödning (--node-soak-duration): Hur länge AKS väntar efter att en ny nod blir Klar innan den går vidare till nästa batch. Användbart för att låta arbetsbelastningar stabiliseras på den nya vm-storleken innan du fortsätter distributionen.

Eftersom ändring av storlek återanvänder uppgraderingsprocessen gäller samma förutsättningar: se till att din prenumeration har tillräcklig ersättningskapacitet för målstorleken på den virtuella datorn och tillgängliga undernäts-IP-adresser för surge-noder, och att dina PodDisruptionBudgets tillåter att minst en replik avvisas i taget, annars kan ändring av storlek blockeras under dräneringen. Rekommendationer från slutpunkt till slutpunkt finns i Metodtips för uppgraderingar av AKS-nodpooler.

Prerequisites

Ändra storlek på nodpoolen

az aks nodepool update Använd kommandot med parametern --node-vm-size för att ändra storleken på den virtuella datorn för en befintlig VMSS-baserad nodpool:

az aks nodepool update \
    --resource-group MyResourceGroup \
    --cluster-name MyManagedCluster \
    --name nodepool1 \
    --node-vm-size Standard_D4s_v3

Validering och kombinationer som inte stöds

AKS-resursprovidern validerar storleksändringsbegäran och blockerar ändringar i den inkompatibla vm-storleken. Följande ändringar stöds inte som en del av en VMSS-storleksändring på plats:

  • Ändra typ av diskkontrollant (till exempel SCSI till NVMe).
  • Ändra CPU-arkitekturen (till exempel x64 till ARM64).
  • Ändra stöd för konfidentiell databehandling (till exempel aktivering eller inaktivering av SNP).
  • Ändra hypervisor-genereringen (till exempel V1 till V2).
  • Kombinera storleksändringen med en Kubernetes-versionsuppgradering eller en ändring av antalet noder i samma åtgärd.

Om din virtuella måldators storlek kräver någon av ändringarna ovan använder du arbetsflödet för manuell avspärrning och avspärrning som beskrivs i följande avsnitt i stället.

Kommentar

Storleksändring på plats kräver extra kapacitet för att provisionera nya noder med den virtuella datorns målstorlek innan de gamla töms på arbetslaster. Om nodpoolen har konfigurerats med --max-surge 0 (dvs --max-unavailable . gäller) avvisas begäran om storleksändring med en 400 Bad Request. Om du vill fortsätta anger du --max-surge till minst 1 när du ändrar storlek med hjälp av

az aks nodepool update \
    --resource-group MyResourceGroup \
    --cluster-name MyManagedCluster \
    --name nodepool1 \
    --node-vm-size Standard_D4s_v3 \
    --max-surge 33%

och du kan också återställa originalet --max-surge och --max-unavailable värdena när storleksändringen har slutförts.

Skapa en ny nodpool med önskad SKU

Kommentar

Varje AKS-kluster måste innehålla minst en systemnodpool med minst en nod. I det här exemplet använder vi en --mode av System för att lägga till en systemnodpool för att ersätta den systemnodpool som vi vill ändra storlek på. Du kan uppdatera läget för en nodpool när som helst. Du kan också lägga till en användarnodpool genom att ange --mode till User.

När du ändrar storlek bör du överväga alla arbetsbelastningskrav, till exempel tillgänglighetszoner, och konfigurera VMSS-nodpoolen i enlighet med detta. Du kan behöva ändra följande kommando så att det passar dina behov. En fullständig lista över konfigurationsalternativen finns på az aks nodepool add referenssidan.

  1. Skapa en ny nodpool med kommandot az aks nodepool add . I det här exemplet skapar vi en ny nodpool, , mynodepoolmed tre noder och vm-SKU Standard_DS3_v2 :n för att ersätta en befintlig nodpool, nodepool1, som har vm-SKU Standard_DS2_v2 :n.

    az aks nodepool add \
        --resource-group myResourceGroup \
        --cluster-name myAKSCluster \
        --name mynodepool \
        --node-count 3 \
        --node-vm-size Standard_DS3_v2 \
        --mode System \
        --no-wait
    

    Det tar några minuter innan den nya nodpoolen skapas.

  2. Hämta status för den nya nodpoolen kubectl get nodes med kommandot .

    kubectl get nodes
    

    Dina utdata bör likna följande exempelutdata som visar både den nya nodpoolen mynodepool och den befintliga nodpoolen nodepool1:

    NAME                                 STATUS   ROLES   AGE   VERSION
    aks-mynodepool-98765432-vmss000000   Ready    agent   23m   v1.21.9
    aks-mynodepool-98765432-vmss000001   Ready    agent   23m   v1.21.9
    aks-mynodepool-98765432-vmss000002   Ready    agent   23m   v1.21.9
    aks-nodepool1-12345678-vmss000000    Ready    agent   10d   v1.21.9
    aks-nodepool1-12345678-vmss000001    Ready    agent   10d   v1.21.9
    aks-nodepool1-12345678-vmss000002    Ready    agent   10d   v1.21.9
    

Spärra de befintliga noderna

Avspärrning markerar angivna noder som oplanerade och förhindrar att fler poddar läggs till i noderna.

  1. Hämta namnen på de noder som du vill spärra med kommandot kubectl get nodes .

    kubectl get nodes
    

    Dina utdata bör likna följande exempelutdata som visar noderna i den befintliga nodpoolen nodepool1 som du vill spärra:

    NAME                                STATUS   ROLES   AGE     VERSION
    aks-nodepool1-12345678-vmss000000   Ready    agent   7d21h   v1.21.9
    aks-nodepool1-12345678-vmss000001   Ready    agent   7d21h   v1.21.9
    aks-nodepool1-12345678-vmss000002   Ready    agent   7d21h   v1.21.9
    
  2. Spärra de befintliga noderna med kommandot kubectl cordon och ange önskade noder i en blankstegsavgränsad lista. Till exempel:

    kubectl cordon aks-nodepool1-12345678-vmss000000 aks-nodepool1-12345678-vmss000001 aks-nodepool1-12345678-vmss000002
    

    Dina utdata bör likna följande exempelutdata som visar att noderna är avspärrade:

    node/aks-nodepool1-12345678-vmss000000 cordoned
    node/aks-nodepool1-12345678-vmss000001 cordoned
    node/aks-nodepool1-12345678-vmss000002 cordoned
    

Töm de befintliga noderna

Viktigt!

För att lyckas dränera noder och vräka poddar som körs, kontrollera att alla PodDisruptionBudgets (PDB:er) tillåter att minst en podreplik flyttas åt gången. Annars misslyckas dränerings-/vräkningsåtgärden. Om du vill kontrollera detta kan du köra kubectl get pdb -A och kontrollera ALLOWED DISRUPTIONS att det är minst 1 eller högre.

När du tömmer noder avlägsnas podarna som körs på dem, vilket innebär att de återskapas på andra schemaläggningsbara noder.

  1. Töm de befintliga noderna med kubectl drain-kommandot och flaggorna --ignore-daemonsets och --delete-emptydir-data, genom att ange önskade noder i en blankstegsavgränsad lista. Till exempel:

    Viktigt!

    Det är nödvändigt att använda --delete-emptydir-data för att ta bort de coredns- och metrics-server-poddar som skapats av AKS. Om du inte använder den här flaggan får du ett fel. Mer information finns i dokumentationen om emptydir.

    kubectl drain aks-nodepool1-12345678-vmss000000 aks-nodepool1-12345678-vmss000001 aks-nodepool1-12345678-vmss000002 --ignore-daemonsets --delete-emptydir-data
    
  2. När dräneringsåtgärden är klar ska alla poddar (exklusive poddar som styrs av daemonuppsättningar) köras i den nya nodpoolen. Du kan verifiera detta med kommandot kubectl get pods.

    kubectl get pods -o wide -A
    

Felsöka problem med utvisning av poddar

Du kan stöta på följande fel när du tömmer noder:

Error when evicting pods/[podname] -n [namespace] (will retry after 5s): Cannot evict pod as it would violate the pod's disruption budget.

Som standardinställning har klustret AKS-hanterade poddavbrottsbudgetar (till exempel coredns-pdb eller konnectivity-agent) med en MinAvailable av 1. Om det till exempel finns två coredns poddar som körs kan bara en avbrytas i taget. Medan en av dem återskapas och inte är tillgänglig kan den andra coredns podden inte tas bort på grund av poddens avbrottsbudget. Det här problemet löser sig när den första coredns podden schemaläggs och är igång, vilket möjliggör att den andra podden kan avlägsnas och återskapas korrekt.

Tips

Överväg att avlasta noder en i taget för en smidigare avlastningsprocess och för att undvika strypning. Mer information finns i:

Ta bort den befintliga nodpoolen

Viktigt!

När du tar bort en nodpool utför AKS inte avspärrning och tömning. Utför en avspärrning och tömning på alla noder i nodpoolen innan du tar bort för att minimera störningarna i de omplanerade poddar som körs på nodpoolen som du planerar att ta bort.

  1. Ta bort den ursprungliga nodpoolen az aks nodepool delete med kommandot .

    az aks nodepool delete \
        --resource-group myResourceGroup \
        --cluster-name myAKSCluster \
        --name nodepool1
    
  2. Kontrollera att AKS-klustret bara har den nya nodpoolen med program och poddar som körs korrekt med kommandot kubectl get nodes .

    kubectl get nodes
    

    Dina utdata bör likna följande exempelutdata, som endast visar den nya nodpoolen mynodepool:

    NAME                                 STATUS   ROLES   AGE   VERSION
    aks-mynodepool-98765432-vmss000000   Ready    agent   63m   v1.21.9
    aks-mynodepool-98765432-vmss000001   Ready    agent   63m   v1.21.9
    aks-mynodepool-98765432-vmss000002   Ready    agent   63m   v1.21.9
    

Nästa steg

När du har storleksanpassat en nodpool genom avspärrning och tömning kan du läsa mer om hur du använder flera nodpooler.