Konfigurera flera nodpooler med hjälp av AKS-skalningsuppsättningsnodpooler för VM med oanvänd kapacitet samt autoskalning av kluster

Slutförd

I Azure finns det Azure VM-instanser som ger skalbarhet samtidigt som kostnaderna minskar, och de är utmärkta för arbetsbelastningar som kan avbrytas. De här virtuella datorerna använder beräkningskapacitet till lägre kostnad, men kan fortfarande användas i scenarier med krav på höga prestanda.

Företagets lösning för drönarspårning distribueras i Azure Kubernetes Service (AKS) som många containerbaserade program och tjänster. En av dessa tjänster är en batchbearbetningstjänst som schemalägger flygvägar för drönare. På grund av en plötslig ökning av kundbasen översvämmas batchbearbetningstjänsten med begäranden vilket ger upphov till obehandlade leveranser. Den här situationen orsakar förseningar och kund frustration.

Automatisk skalning av antalet tjänstrepliker för batchbearbetning ger för bearbetning i rätt tid. Men det kräver också att du distribuerar fler noder för att hålla takten med behovet av beräkningsresurser. Vid analys av användningstrender i Azure Monitor märker du att dessa noder endast används vid specifika tidpunkter, och inte på ett kostnadseffektivt sätt. Batchbearbetningstjänsten är tillståndslös och sparar inte klientsessionsdata. Du inser att du kan spara pengar genom att göra följande:

  • använda nodinstanser med lägre kostnad
  • automatiskt skala antalet noder i den nodpool som konfigurerats för batchbearbetning.

Nu ska vi titta på infrastrukturen som ligger bakom den här kostnadsbesparande lösningen i AKS.

Vad är en virtuell dator för oanvänd kapacitet (VM för oanvänd kapacitet) i Azure?

En virtuell dator för oanvänd kapacitet är en virtuell dator som ger dig åtkomst till outnyttjad Azure-beräkningskapacitet till en stor rabatt. Virtuella datorer för oanvänd kapacitet ersätter befintliga, lågprioriterade virtuella datorer i Azure. Du kan använda virtuella datorer för oanvänd kapacitet för att köra arbetsbelastningar som omfattar följande:

  • högpresterande beräkningsscenarier, batchbearbetning eller program för visuell rendering

  • storskaliga, tillståndslösa program

  • utvecklings-/testmiljöer, inklusive arbetsbelastningar för kontinuerlig integrering (CI) och kontinuerlig leverans (CD).

Tillgänglighet för VM för oanvänd kapacitet

Tillgängligheten för VM för oanvänd kapacitet beror på faktorer som kapacitet, storlek, region och tid på dagen. Azure allokerar endast virtuella datorer om det finns tillgängligt med kapacitet. Därför finns det inget serviceavtal (SLA) för dessa typer av virtuella datorer och de erbjuder inga garantier för hög tillgänglighet.

Avlägsnandeprincip för VM för oanvänd kapacitet

Standardprincipen för avlägsnande för VM för oanvänd kapacitet är Frigör. Azure avlägsnar virtuella datorer med 30 sekunders varsel när kapaciteten i en region blir begränsad. Virtuella datorer som anges med principen Frigör flyttas till tillståndet stoppad-frigjord när de avlägsnas. Du kan omdistribuera en avlägsnad VM när kapacitet blir tillgänglig igen. En frigjord virtuell dator räknas fortfarande mot din kvot för virtuell CPU (vCPU) för oanvänd kapacitet, och avgifter för de underliggande allokerade diskarna gäller fortfarande.

Vad är en VM-skalningsuppsättning med oanvänd kapacitet?

VM-skalningsuppsättningar med oanvänd kapacitet är VM-skalningsuppsättningar som har stöd för virtuella Azure-datorer för oanvänd kapacitet. De här virtuella datorerna har samma beteende som vanliga virtuella datorer för oanvänd kapacitet, men med en skillnad: när du använder stöd för VM-skalningsuppsättningar för virtuella datorer för oanvänd kapacitet i Azure väljer du mellan två avlägsnandeprinciper:

  • Frigör: Principen Frigör fungerar exakt enligt beskrivningen tidigare.

  • Ta bort: Med borttagningsprincipen kan du undvika kostnaden för diskar och uppnå kvotgränser. Med avlägsnandeprincipen Ta bort tas avlägsnade virtuella datorer bort tillsammans med de underliggande diskarna. Skalningsuppsättningens autoskalningsfunktion kan nu automatiskt försöka kompensera för vm-borttagning genom att skapa nya virtuella datorer. Skapandet av virtuella datorer garanteras inte, men de avlägsnade virtuella datorerna räknas inte mot din vCPU-kvot och medför inte kostnader för underliggande diskar.

    Bästa praxis är att bara använda autoskalningsfunktionen när du anger avlägsnandeprincipen till Ta bort i skalningsuppsättningen.

Vad är en skalningsuppsättningsnodpool för VM med oanvänd kapacitet i Azure Kubernetes Service (AKS)?

En skalningsuppsättningsnodpool för VM med oanvänd kapacitet är en användarnodpool som använder en VM-skalningsuppsättning med oanvänd kapacitet. AKS stöder virtuella datorer för oanvänd kapacitet i följande scenarier:

  • när du behöver skapa användarnodpooler
  • när du vill använda de kostnadsfördelar som stöd för VM-skalningsuppsättningar för virtuella Azure-datorer för oanvänd kapacitet ger.

Använd skalningsuppsättningsnodpooler för VM med oanvänd kapacitet när du vill göra följande:

  • dra nytta av oanvänd kapacitet i Azure
  • använda skalningsuppsättningsfunktioner med avlägsnandeprincipen Ta bort
  • definiera det maximala pris som du är villig att betala per timme
  • aktivera den rekommenderade autoskalningen för AKS Kubernetes-kluster vid användning av skalningsuppsättningsnodpooler för VM med oanvänd kapacitet.

För att till exempel stödja drönarspårningsprogrammets batchbearbetningstjänst kan du skapa en användarnodpool för oanvänd kapacitet och aktivera autoskalning av klustret. Du kan sedan konfigurera den vågräta poddskalaren för att distribuera fler batchbearbetningstjänster för att matcha resursbehoven.

När efterfrågan på noderna ökar kan autoskalning av kluster skala upp eller ned antalet noder i skalningsuppsättningsnodpoolen för VM med oanvänd kapacitet. Om nodavhysningar inträffar fortsätter autoskalningsfunktionen i klustret att försöka skala upp antalet noder om det fortfarande behövs extra noder.

Begränsningar för skalningsuppsättningsnodpooler för VM med oanvänd kapacitet

Innan du bestämmer dig för att lägga till en användarnodpool för VM med oanvänd kapacitet i ditt AKS-kluster bör du överväga följande begränsningar:

  • Den underliggande skalningsuppsättningen med oanvänd kapacitet distribueras endast till en enskild feldomän och ger inga garantier vad gäller hög tillgänglighet.
  • Stöd för flera nodpooler måste vara aktiverat för AKS-klustret.
  • Du kan bara använda användarnodpooler för VM med oanvänd kapacitet som användarnodpooler .
  • Du kan inte uppgradera nodpooler för oanvänd kapacitet.
  • Skapandet av virtuella datorer för oanvänd kapacitet garanteras inte. Skapandet av noder för oanvänd kapacitet beror på tillgängligheten av kapacitet och kvot i klustrets distribuerade Azure-region.

Kom ihåg att skalningsuppsättningsnodpooler för VM med oanvänd kapacitet endast ska användas för arbetsbelastningar som kan avbrytas.

Viktigt!

I vissa prenumerationer, till exempel sponsringsprenumerationer, är möjligheten att skapa virtuella datorer för oanvänd kapacitet och skalningsuppsättningsnodpooler för VM med oanvänd kapacitet begränsad. Du kanske inte kan skapa en skalningsuppsättningsnodpool för VM med oanvänd kapacitet för klustret.

Lägga till en skalningsuppsättningsnodpool för VM med oanvänd kapacitet i ett AKS-kluster

En användarnodpool för VM med oanvänd kapacitet kan inte vara systemnodpool för ett AKS-kluster. Först måste du skapa klustret och sedan använda az aks nodepool add kommandot för att lägga till en ny användarnodpool.

Du anger flera parametrar för en ny nodpool för att konfigurera den som en skalningsuppsättningsnodpool för VM med oanvänd kapacitet.

Prioritet

Parametern --priority anges till Regular som standard för en ny nodpool. Ange värdet till Spot för att ange att den nya poolen som du skapar är en skalningsuppsättningsnodpool för VM med oanvänd kapacitet. Det går inte att ändra det här värdet när det har skapats.

Avlägsnandeprincip

En skalningsuppsättningsnodpool för VM med oanvänd kapacitet måste använda en VM-skalningsuppsättning. Kom ihåg att nodpoolen för oanvänd kapacitet använder en skalningsuppsättning för oanvänd kapacitet. Ange --eviction-policy till Delete för att tillåta att skalningsuppsättningen tar bort både noden och den underliggande allokerade disken som noden använder. Du kan inte ändra det här värdet när du har skapat det.

Du kan ange borttagningsprincipen till Deallocate, men när dessa noder tas bort räknas de fortfarande mot din beräkningskvot mot skalning eller uppgradering av klustret.

Maximalt pris för nod för oanvänd kapacitet

Nodpooler med oanvänd kapacitet optimerar kostnaderna genom att begränsa det maximala belopp som du är villig att betala per nod för oanvänd kapacitet per timme. Du anger ett säkert belopp med hjälp av parametern --spot-max-price. Nya noder för oanvänd kapacitet avlägsnas när det här värdet nås.

Du kan ange det här värdet till ett positivt belopp på upp till fem decimaler eller ställa in det på -1. Om du anger värdet --spot-max-price till -1 påverkar det din nodpool på följande sätt:

  • Noder tas inte bort baserat på nodens pris.
  • Kostnaden för nya noder baseras på det aktuella priset för skalningsnoder eller priset för en standardnod, beroende på vilket som är lägre.

Om du till exempel anger värdet till 0,98765 är det högsta priset för en nod i USD 0,98765 per timme. När nodens förbrukning överskrider det här beloppet avlägsnas noden.

Aktivera autoskalning av kluster

Vi rekommenderar att du aktiverar autoskalning av kluster med hjälp av parametern --enable-cluster-autoscaler. Om du inte använder autoskalning av kluster riskerar du att antalet noder sjunker till noll i nodpoolen när noderna avlägsnas på grund av kapacitetsbegränsningar i Azure.

Minsta antal noder

Ange det minsta antalet noder till ett värde mellan 1 och 100 med hjälp av parametern --min-count. Ett minsta antal noder krävs när du aktiverar autoskalning av kluster.

Högsta antal noder

Ange det högsta antalet noder till ett värde mellan 1 och 100 med hjälp av parametern --max-count. Ett högsta antal noder krävs när du aktiverar autoskalning av kluster.

Exempelkonfiguration

Här är ett exempelkommando az aks nodepool add som lägger till en skalningsuppsättningsnodpool med maxantalet 3 och min på 1. Observera användningen av --enable-cluster-autoscaler för att aktivera funktionerna för skalningsnoder för oanvänd kapacitet.

az aks nodepool add \
    --resource-group resourceGroup \
    --cluster-name aksCluster \
    --name spotpool01 \
    --enable-cluster-autoscaler \
    --max-count 3 \
    --min-count 1 \
    --priority Spot \
    --eviction-policy Delete \
    --spot-max-price -1 \
    --no-wait

Distribuera poddar till skalningsuppsättningsnodpooler för VM med oanvänd kapacitet

När du distribuerar arbetsbelastningar i Kubernetes kan du ange information till schemaläggaren för att ange vilka noder som arbetsbelastningarna kan eller inte kan köra. Du kontrollerar schemaläggning av arbetsbelastningar genom att konfigurera taints, tolerans eller nodtillhörighet. Noder för oanvänd kapacitet konfigureras med en specifik etikett och taint.

Vad är en taint?

En taint tillämpas på en nod för att ange att endast specifika poddar kan schemaläggas i den. Noder för oanvänd kapacitet konfigureras med en etikett som anges till kubernetes.azure.com/scalesetpriority:spot.

Vad är tolerans?

Tolerans är en specifikation som tillämpas på en podd för att tillåta, men inte kräva, att en podd schemaläggs på en nod med motsvarande taint. Noder för oanvänd kapacitet konfigureras med en nod-taint som anges till kubernetes.azure.com/scalesetpriority=spot:NoSchedule.

Kommentar

Taints och toleranser garanterar inte att en podd placeras på en specifik nod. Om en nod till exempel inte har någon taint är det möjligt att podden med toleransen kan schemaläggas på den otainerade noden. Det här problemet kan åtgärdas genom att ange en tillhörighet med taints och toleranser.

Vad är nodtillhörighet?

Du använder nodtillhörighet för att beskriva vilka poddar som är schemalagda för en nod. Tillhörigheten anges med hjälp av etiketter som definierats i noden. I AKS konfigureras till exempel systempoddar med anti-tillhörighet gentemot noder för oanvänd kapacitet för att förhindra att poddarna schemaläggs i dessa noder.

Definiera tolerans i en manifestfil för en podd

Du anger nod-taint-tolerans genom att skapa en tolerations ordlistepost i arbetsbelastningsmanifestfilen. I den här ordlistan anger du följande egenskaper för varje nod-taint som arbetsbelastningen måste tolerera i det här avsnittet:

Property beskrivning
key Identifierar ett nyckel/värde-par för nod-taint som anges i noden. På en skalningsuppsättningsnodpool för VM med oanvänd kapacitet är nyckel/värde-paret till exempel kubernetes.azure.com/scalesetpriority:spot. Nyckeln är kubernetes.azure.com/scalesetpriority.
operator Gör att toleransen kan matcha en taint. Standardoperatorn är Equal. Du kan även ange Exists för att matcha tolerans. När du använder Exists specificerar du dock inte följande egenskap (value).
value Representerar värdedelen i nyckel/värde-paret node-taint som anges på noden. En skalningsuppsättningsnodpool för VM med oanvänd kapacitet med ett nyckel/värde-par som är kubernetes.azure.com/scalesetpriority:spot har till exempel värdet spot.
effect Anger hur schemaläggning av en podd hanteras i systemet. Det finns tre alternativ: NoSchedule, PreferNoSchedule och NoExecute. NoSchedule ser till att systemet inte kan schemalägga podden. PreferNoSchedule tillåter att systemet försöker att inte schemalägga podden. NoExecute avlägsnar antingen poddar som redan körs på tainted-noden eller schemalägger inte podden alls.

Definiera nodtillhörighet i en poddmanifestfil

Du anger tillhörighet genom att skapa en affinity post i arbetsbelastningsmanifestfilen. I den här posten anger du följande egenskaper för varje nodetikett som en arbetsbelastning måste matcha:

Property beskrivning
nodeAffinity Beskriver schemaläggningsregler för nodtillhörighet för podden.
requiredDuringSchedulingIgnoredDuringExecution Om de tillhörighetskrav som anges i det här fältet inte uppfylls vid schemaläggningstiden kan podden inte schemaläggas till noden. Om de tillhörighetskrav som anges i det här fältet inte uppfylls någon gång under poddkörningen (till exempel på grund av en uppdatering) kan systemet välja att försöka ta bort podden från noden.
nodeSelectorTerms En lista över nodväljarens termer. De villkor som returneras matchar något av filtren i stället för alla filter.
matchExpressions En lista över nodväljarens krav efter nodens etiketter.
key Etikettnyckeln som väljaren gäller för. Nyckeln är kubernetes.azure.com/scalesetpriority
operator Representerar en nyckels relation till en uppsättning värden. Giltiga operatorer är In, NotIn, Exists, DoesNotExist Gtoch Lt
values Representerar värdedelen av nyckel/värde-paret för nodetiketten som anges på noden. På en nodpool för oanvänd kapacitet med nyckel/värde-par kubernetes.azure.com/scalesetpriority:spotär spotvärdet .

Här är ett exempel på en arbetsbelastning som har tolerans och tillhörighet som lagts till för nodpooler med oanvänd kapacitet.

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    env: test
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
  tolerations:
  - key: "kubernetes.azure.com/scalesetpriority"
    operator: "Equal"
    value: "spot"
    effect: "NoSchedule"
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: "kubernetes.azure.com/scalesetpriority"
            operator: In
            values:
            - "spot"

Kontrollera dina kunskaper

1.

Anta att du har en tillståndslös tjänst som bearbetar onlineordrar och körs i ett Azure Kubernetes Service-kluster (AKS). Du väljer att använda skalningsuppsättningsnodpooler för VM med oanvänd kapacitet i AKS-klustret för att optimera beräkningskostnader i klustret. Hur lägger du till skalningsuppsättningsnodpooler för VM med oanvänd kapacitet i ett AKS-kluster?

2.

Vilken avlägsnandeprincip blir det kostnadseffektivaste alternativet vid konfiguration av skalningsuppsättningsnodpoolen för VM med oanvänd kapacitet för den tjänst som beskrivs i föregående fråga?

3.

För den tjänst som beskrivs i föregående frågor, hur säkerställer du att arbetsbelastningar schemaläggs till noderna i användarnodpoolen för VM med oanvänd kapacitet?