Dela via


Ä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.

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!

Om du vill tömma noder och avlägsna poddar som körs kontrollerar du att alla PodDisruptionBudgets (PDB) tillåter att minst en poddreplik flyttas i taget. 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!

    Användning --delete-emptydir-data krävs för att avlägsna AKS-skapade coredns och metrics-server poddar. 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.

Dricks

Ö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.