Node Hardening (förhandsversion) i Azure Kubernetes Service (AKS)

Node Hardening är en opt-in-funktion för Linux-nodpooler som skyddar nodstabiliteten när arbetsbelastningar sätter noder under cpu-, minnes- eller disktryck. När du aktiverar Node Hardening i ett kluster ändrar AKS hur varje nod reserverar och framtvingar resurser för Kubernetes-komponenter och värdtjänster samt hur kubelet tar bort poddar när resurserna tar slut.

Den här artikeln förklarar vad Node Hardening ändrar, jämför de härdade standardvärdena med standardvärdena för AKS och visar hur du aktiverar, verifierar, anpassar och inaktiverar funktionen.

Important

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:

Fördelar med nodhärdning

På upptagna eller burstiga noder kan arbetsbelastningar använda resurser som kubelet, containerkörningen och värdtjänsterna behöver. När det händer kan noder sluta svara, rapportera statusen NotReady eller avsluta poddar plötsligt. Node Hardening minskar dessa risker på följande sätt:

  • Tvingande reservationer: Som standard använder AKS endast kube-reserverade värden för att beräkna hur mycket kapacitet schemaläggaren kan allokera till poddar. Med hjälp av Node Hardening framtvingar kubelet även kube-reserverad och systemreserverad kapacitet via Linux-kontrollgrupper (cgroups). Kubelet och containerd körs i en dedikerad kubereserved.slice cgroup, så de behåller sin reserverade CPU-resurs och minne även när poddar belastar noden fullt ut.
  • Dedikerad kapacitet för värdtjänster: Node Hardening lägger till en systemreserverad allokering för värdoperativsystemtjänster som körs på system.slice.
  • Mer minnesutrymme: Tröskelvärdet för hård eviktering för tillgängligt minne skalar med nodens minne, så kubelet tar bort poddar innan noden får kritiskt lite minne.
  • Mjuk vräkning: Med tröskelvärden för mjuk vräkning kan kubelet vräka poddar på ett kontrollerat sätt, med en respitperiod för avslutning, när minnet eller diskutrymmet tar slut. Hard eviction, som avslutar poddar omedelbart, är sedan en sista utväg.
  • Reservationer som skalas med podddensitet: Beräkningen av kube-reserverat minne ökar med det maximala antalet poddar per nod, vilket står för kubelet- och containerd-overheaden för att köra fler poddar.

Vad ändras när du aktiverar Node Hardening

I följande tabeller jämförs standardinställningarna för Linux-noder som kör Kubernetes 1.29 eller senare med de standardvärden som AKS använder när Node Hardening är aktiverat.

Resursbokningar

Setting Utan nodhärdning Med Node Hardening
CPU reserverad för Kube Baserat på antalet CPU-kärnor. Mer information finns i CPU-reservationer. Oförändrad
Reserverat minne för Kube min(20 × maxPods + 50, 25% of node memory) MiB min(35 × maxPods + max(250, 2% of node memory), 25% of node memory) MiB
Kube-reserverade process-ID:n (PID:er) 1000 Inte reserverad
Systemreserverad CPU None 100m
Systemreserverat minne None 200 MiB, plus 100 MiB för varje fullt 32 GiB nodminne, plus 100 MiB för kluster som använder Azure CNI
Systemreserverad ephemeral lagring None 1Gi

Tröskelvärden för avhysning

Setting Utan nodhärdning Med Node-härdning
Hård utrensning: memory.available 100Mi 250Mi för noder med 8 GiB minne eller mindre, 375Mi för noder med mer än 8 GiB och mindre än 32 GiB, och 512Mi för noder med 32 GiB eller mer
Hård avhysning: nodefs.available och nodefs.inodesFree 10% och 5% Oförändrad
Hård utkastning: pid.available 2000 Inte inställt
Mjuk utkastning: memory.available None 500Mi, 750Mi, eller 1Gi, med samma nodminnesnivåer som hård vräkning, med en respitperiod på 30 sekunder
Soft eviction: nodefs.available och nodefs.inodesFree None 12% och 7%, med en respitperiod på 2 minuter vardera
Maximal grace period för poddavslut under mjuk vräkning Inte inställt 60 sekunder

Cgroup-genomdrivning

Setting Utan Node-härdning Med Node Hardening
Framtvingade allokerbara nodresurser pods pods, kube-reserved och system-reserved
Kubelet och containerd cgroup system.slice, utan gränser kubereserved.slice, med minne begränsat till kube-reserverat minne och en CPU-resurs som är proportionell mot kube-reserverad CPU
Cgroup för värdtjänster system.slice, utan gränser system.slice, med minne begränsat till det systemreserverade minnet och en CPU-andel som är proportionell mot de systemreserverade CPU-resurserna

Eftersom Node Hardening reserverar mer kapacitet rapporterar noder mindre allokerbar kapacitet för poddar. På en nod med 4 vCPU:er och 16 GiB minne som använder Azure CNI minskar till exempel allokerbar kapacitet genom att aktivera Node Hardening på följande sätt:

  • Med standardmaximalt 250 poddar per nod, cirka 570 MiB minne, 100 millicores CPU och 1 GiB tillfällig lagring.
  • Med högst 30 poddar per nod, med cirka 1,3 GiB minne, 100 millicores CPU och 1 GiB tillfällig lagring.

Tröskelvärden för mjuk vräkning minskar inte allokerbar kapacitet. De ändras bara när kubelet börjar vräka poddar.

Considerations

Tänk på följande innan du aktiverar Node Hardening:

  • Du aktiverar Node Hardening på klusternivå och det gäller för alla Linux-nodpooler i klustret. Du kan inte aktivera det för enskilda nodpooler och det påverkar inte Windows nodpooler.
  • Noder rapporterar mindre allokerbar kapacitet, så poddar som får plats på en nod innan du aktiverar Node Hardening kanske inte längre får plats efteråt. Granska dina poddresursbegäranden och nodpoolstorlekar.
  • Värdtjänster i system.slice delar en hård minnesgräns som är lika med det systemreserverade minnet. Om du kör dina egna agenter på noder som systemd-tjänster, till exempel säkerhets-, övervaknings- eller loggvidarebefordringsagenter, räknas dessa agenter mot den här gränsen. Verifiera deras minnesanvändning och stabilitet innan du använder Node Hardening i produktion.
  • Värden som du anger i en nodpools anpassade kubelet-konfiguration åsidosätter motsvarande standardvärden för nodhärdning. Mer information finns i Anpassa nodhärdningsinställningar.
  • Om du inaktiverar Node Hardening senare behåller befintliga nodpooler de härdade inställningarna för mjuk vräkning, även efter att noderna har ominstallerats. Om du vill ta bort de här inställningarna måste du skapa nya nodpooler. Mer information finns, se Inaktivera nodhärdning.
  • Standardvärden kan ändras medan funktionen är i förhandsversion. Börja med ett icke-produktionskluster och verifiera dina arbetslaster under representativa nodtrycksförhållanden.

Prerequisites

  • Ett Azure-abonnemang. Om du inte har något skapar du ett kostnadsfritt konto.
  • Ett AKS-kluster med Linux-nodpooler, eller behörighet att skapa ett.
  • Azure CLI-tillägget aks-preview och funktionsflaggan CustomNodeConfigPreview, som beskrivs i följande avsnitt.

Installera tillägget aks-preview Azure CLI

  1. Installera aks-preview tillägget med hjälp av kommandot az extension add.

    az extension add --name aks-preview
    
  2. Uppdatera till den senaste versionen av tillägget med hjälp av kommandot az extension update.

    az extension update --name aks-preview
    

Registrera funktionsflaggan CustomNodeConfigPreview

  1. Registrera funktionsflaggan CustomNodeConfigPreview med kommandot az feature register.

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

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

  2. Verifiera registreringsstatusen az feature show med hjälp av kommandot .

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

    az provider register --namespace "Microsoft.ContainerService"
    

Aktivera nodhärdning

I förhandsversionen är Node Hardening inte aktiverat som standard.

Aktivera nodhärdning på ett nytt kluster

Skapa ett kluster med Node Hardening aktiverat med hjälp az aks create av kommandot med parametern --enable-node-hardening .

Det här kommandot kräver aks-preview tillägget och funktionsflaggan CustomNodeConfigPreview . Mer information finns i Förutsättningar.

az aks create \
    --resource-group <resource-group-name> \
    --name <cluster-name> \
    --enable-node-hardening \
    --generate-ssh-keys

Bekräfta ändringen, se Verifiera inställningar för nodhärdning.

Aktivera Node Hardening på ett befintligt kluster

Aktivera Node Hardening i ett befintligt kluster med hjälp az aks update av kommandot med parametern --enable-node-hardening .

Det här kommandot kräver aks-preview tillägget och funktionsflaggan CustomNodeConfigPreview . Mer information finns i Förutsättningar.

az aks update \
    --resource-group <resource-group-name> \
    --name <cluster-name> \
    --enable-node-hardening

För att bekräfta ändringen, se Verifiera inställningar för nodhärdning.

Verifiera inställningar för Node Hardening

  1. Hämta autentiseringsuppgifterna för klustret med hjälp av kommandot az aks get-credentials.

    az aks get-credentials --resource-group <resource-group-name> --name <cluster-name>
    
  2. Granska de effektiva kubelet-reservations- och vräkningsinställningarna på en nod genom att fråga kubelet-konfigurationsslutpunkten.

    kubectl get --raw "/api/v1/nodes/<node-name>/proxy/configz" | jq '.kubeletconfig | {kubeReserved, systemReserved, evictionHard, evictionSoft, evictionSoftGracePeriod, evictionMaxPodGracePeriod, enforceNodeAllocatable}'
    

    På en härdad nod systemReserved och evictionSoft innehåller värden och enforceNodeAllocatable innehåller kube-reserved och system-reserved.

  3. Jämför nodens kapacitet med dess allokerbara resurser.

    kubectl get node <node-name> -o jsonpath='{.status.capacity}{"\n"}{.status.allocatable}{"\n"}'
    

    På en härdad nod är allokerbar processor, minne och tillfällig lagring lägre än kapaciteten. Skillnaden motsvarar värdena för kube-reserverad och systemreserverad i resursreservationer, plus tröskelvärdena för hård vräkning i vräkningströsklar. På en nod med 4 virtuella processorer och 16 GiB minne som använder Azure CNI är allokerbar PROCESSOR 240 millicores lägre än kapaciteten: 140 millicores kube-reserverad CPU och 100 millicores systemreserverad CPU.

Anpassa nodhärdningsinställningar

Du kan åsidosätta standardvärdena för kube-reserved och vräkning för en Linux-nodpool med hjälp av en anpassad kubelet-konfiguration. De här inställningarna kräver funktionsflaggan CustomNodeConfigPreview . Du kan använda dem oavsett om Node Hardening är aktiverat i klustret eller inte. AKS hanterar systemreserverade värden och cgroup-tillämpning, och du kan inte anpassa dem.

Varje inställning åsidosätter en rad i tabellerna Resursreservationer eller Tröskelvärden för borttagning . Kube-reserverade rader motsvarar inställningarna för kubeReserved. Rader för hård borttagning motsvarar hardEvictionThreshold inställningarna. Rader för mjuk eviktering motsvarar softEvictionThreshold- och softEvictionGracePeriod-inställningarna. Den maximala tidsfristen för avslutning av podd motsvarar evictionMaxPodGracePeriodInSeconds.

Du kan konfigurera följande inställningar:

Setting Overrides Description
kubeReserved.cpuMillicores CPU reserverad för Kube CPU reserverad för Kubernetes-systemdaemoner, i millicores.
kubeReserved.memoryMB Kube-reserverat minne Minne reserverat för Kubernetes-systemdaemoner i MiB.
hardEvictionThreshold.memoryAvailable Hård eviktering: memory.available Tröskelvärde för hård vräkning för tillgängligt minne.
hardEvictionThreshold.nodeFsAvailable Hård eviktering: nodefs.available Tröskelvärde för hård vräkning för tillgängligt utrymme i nodens filsystem.
hardEvictionThreshold.nodeFsInodesFree Hård avhysning: nodefs.inodesFree Tröskelvärde för hård vräkning för lediga inode för nodens filsystem.
softEvictionThreshold.memoryAvailable Mjuk utrensning: memory.available Tröskelvärde för mjuk vräkning för tillgängligt minne.
softEvictionThreshold.nodeFsAvailable Mjuk avhysning: nodefs.available Tröskelvärde för mjuk eviktion för tillgängligt filsystemutrymme på noden.
softEvictionThreshold.nodeFsInodesFree Mjuk eviktion: nodefs.inodesFree Tröskelvärde för mjuk eviktering för lediga nodfilsystemsinoder.
softEvictionGracePeriod.memoryAvailable Mjuk vräkning: memory.available respitperiod Hur länge tillgängligt minne måste ligga under det mjuka tröskelvärdet innan kubelet tar bort poddar.
softEvictionGracePeriod.nodeFsAvailable Mjuk vräkning: nodefs.available respitperiod Hur länge tillgängligt nodfilsystemutrymme måste ligga under det mjuka tröskelvärdet innan kubelet tar bort poddar.
softEvictionGracePeriod.nodeFsInodesFree Mjuk vräkning: nodefs.inodesFree respitperiod Hur länge free node filesystem inodes måste ligga under sitt mjuka tröskelvärde innan kubelet tar bort poddar.
evictionMaxPodGracePeriodInSeconds Maximal respitperiod för poddavslut under mjuk vräkning Maximalt antal sekunder som kubelet tillåter poddar att avslutas under en mjuk vräkning.
  • Tillåtna värden, minimivärden och verifieringsregler för varje inställning finns i Konfigurationsparametrar för anpassade noder för AKS.
  • För varje vräkningssignal anger du både tröskelvärdet för mjuk vräkning och dess matchande respitperiod och ser till att varje tröskelvärde för mjuk vräkning är större än tröskelvärdet för hård vräkning för samma signal.
  1. Skapa en kubelet-konfigurationsfil, till exempel nodehardening-kubelet.json, med de inställningar som du vill anpassa. I följande exempel anges varje konfigurerbart värde. Den anger kube-reserved till 200 millicores cpu och 1 024 MiB minne. Den anger tröskelvärden för hård borttagning av 512Mi tillgängligt minne, 10% tillgängligt filsystemutrymme och 5% fria inoder. Den anger tröskelvärden för mjuk borttagning av 1Gi, 12%och 7% med respitperioder på 30 sekunder, 2 minuter och 2 minuter. Den anger också en maximal tidsfrist på 60 sekunder för poddavslut.

    {
      "kubeReserved": {
        "cpuMillicores": 200,
        "memoryMB": 1024
      },
      "hardEvictionThreshold": {
        "memoryAvailable": "512Mi",
        "nodeFsAvailable": "10%",
        "nodeFsInodesFree": "5%"
      },
      "softEvictionThreshold": {
        "memoryAvailable": "1Gi",
        "nodeFsAvailable": "12%",
        "nodeFsInodesFree": "7%"
      },
      "softEvictionGracePeriod": {
        "memoryAvailable": "30s",
        "nodeFsAvailable": "2m",
        "nodeFsInodesFree": "2m"
      },
      "evictionMaxPodGracePeriodInSeconds": 60
    }
    
  2. Skapa en Linux-nodpool som använder konfigurationsfilen med hjälp az aks nodepool add av kommandot med parametern --kubelet-config .

    az aks nodepool add \
        --resource-group <resource-group-name> \
        --cluster-name <cluster-name> \
        --name <node-pool-name> \
        --kubelet-config ./nodehardening-kubelet.json
    

    Du kan också använda parametern --kubelet-config med az aks create kommandot för att tillämpa konfigurationen på klustrets första nodpool.

Inaktivera Node Hardening

Inaktivera Node Hardening med hjälp az aks update av kommandot med parametern --disable-node-hardening .

Det här kommandot kräver aks-preview tillägget och funktionsflaggan CustomNodeConfigPreview . Mer information finns i Förutsättningar.

az aks update \
    --resource-group <resource-group-name> \
    --name <cluster-name> \
    --disable-node-hardening

Om du inaktiverar Node Hardening inaktiveras inställningen på klusternivå, men befintliga noder ändras inte omedelbart. Befintliga noder behåller alla härdade inställningar tills de har installerats om med en ny avbild, till exempel under en uppgradering av nodbilden. När en nod har avbildats om gäller följande ändringar:

  • Återgick till standardinställningarna för AKS: Kube-reserverade och systemreserverade resurser, tröskelvärden för hård borttagning och cgroup-tillämpning. Nodens allokerbara kapacitet ökar i enlighet med detta.
  • Behålls: Tröskelvärdena för mjuk eviktion, respitperioderna för mjuk eviktion och den maximala tidsgränsen för avslutning av poddar under mjuk eviktion.

Du kan bara ange en anpassad kubelet-konfiguration när du skapar ett kluster eller en nodpool, så att du inte kan ta bort de kvarhållna inställningarna för mjuk eviktion från en befintlig nodpool. Om du vill ta bort dem skapar du en ny nodpool som uttryckligen avaktiverar dem, flyttar dina arbetsbelastningar till den nya nodpoolen och tar sedan bort den gamla nodpoolen.

  1. Skapa en kubelet-konfigurationsfil, till exempel remove-soft-eviction.json. I följande exempel anges varje tröskelvärde för soft eviction och respitperiod till en tom sträng, vilket inaktiverar soft eviction för den signalen. Den anger också den maximala respitperioden för poddavslut till 0, vilket är standardvärdet för AKS.

    {
      "softEvictionThreshold": {
        "memoryAvailable": "",
        "nodeFsAvailable": "",
        "nodeFsInodesFree": ""
      },
      "softEvictionGracePeriod": {
        "memoryAvailable": "",
        "nodeFsAvailable": "",
        "nodeFsInodesFree": ""
      },
      "evictionMaxPodGracePeriodInSeconds": 0
    }
    
  2. Skapa en Linux-nodpool som använder konfigurationsfilen med hjälp az aks nodepool add av kommandot med parametern --kubelet-config .

    az aks nodepool add \
        --resource-group <resource-group-name> \
        --cluster-name <cluster-name> \
        --name <node-pool-name> \
        --kubelet-config ./remove-soft-eviction.json
    
  3. Flytta dina arbetsbelastningar till den nya nodpoolen och ta sedan bort den gamla nodpoolen. Mer information finns i Ändra storlek på nodpooler i AKS.

Se Verifiera inställningar för nodhärdning. På noder i den nya nodpoolen är evictionSoft tom.