Posílení zabezpečení uzlů (Preview) v Azure Kubernetes Service (AKS)

Posílení zabezpečení uzlů je volitelná funkce pro fondy uzlů s Linuxem, která chrání stabilitu uzlů, když úlohy zatěžují uzly z hlediska CPU, paměti nebo disku. Když povolíte posílení zabezpečení uzlů v clusteru, AKS změní způsob, jakým každý uzel rezervuje a vynucuje prostředky pro komponenty a hostitelské služby Kubernetes a jak kubelet vyřazuje pody, když je prostředků nedostatek.

Tento článek vysvětluje, jaké změny přináší posílení zabezpečení uzlů, porovnává výchozí nastavení se zvýšeným zabezpečením se standardními výchozími nastaveními AKS a ukazuje, jak tuto funkci povolit, ověřit, přizpůsobit a zakázat.

Important

Funkce AKS ve verzi Preview jsou k dispozici na bázi samoobsluhy a dobrovolného přihlášení. Ukázky jsou poskytovány "tak, jak jsou" a "dle dostupnosti" a jsou vyloučeny ze smluv o úrovni služeb a z omezené záruky. Předběžné verze AKS jsou částečně pokryty zákaznickou podporou podle možností. Proto tyto funkce nejsou určené pro produkční použití. Další informace najdete v následujících článcích podpory:

Výhody posílení zabezpečení uzlů

Na zaneprázdněných uzlech nebo uzlech se špičkovým zatížením můžou úlohy využívat prostředky, které potřebují kubelet, modul runtime kontejneru a hostitelské služby. V takovém případě se uzly můžou stát nereagujícími, nahlásit NotReady stav nebo ukončit pody náhle. Posílení zabezpečení uzlů snižuje tato rizika následujícími způsoby:

  • Vynucené rezervace: AKS ve výchozím nastavení používá hodnoty kube-reserved pouze k výpočtu kapacity, kterou může plánovač přidělit podům. Pomocí posílení zabezpečení uzlu kubelet také vynucuje kapacitu kube-reserved a system-reserved prostřednictvím skupin řízení Linuxu (cgroups). Kubelet a containerd běží ve vyhrazené kubereserved.slice skupině cgroup, takže si zachovají rezervovaný podíl CPU a paměť i v případě, že pody plně vytíží uzel.
  • Vyhrazená kapacita pro hostitelské služby: Node Hardening přidává přidělení rezervované systémem pro služby hostitelského operačního systému, které běží v system.slice.
  • Větší paměťová rezerva: Prahová hodnota vyřazení pro dostupnou paměť se škáluje s pamětí uzlu, takže kubelet vyřadí pody před kritickým nedostatkem paměti uzlu.
  • Šetrné vypuzení: Prahové hodnoty pro mírné vypuzení umožňují kubeletu šetrně vypuzovat pody s dobou odkladu ukončení, když na uzlu dochází paměť nebo místo na disku. Tvrdé vypuzení, které okamžitě ukončí pody, pak funguje jako poslední možnost.
  • Rezervace, které se škálují s hustotou podů: Výpočet paměti kube-reserved se zvyšuje s maximálním počtem podů na uzel, což zohledňuje režii kubeletu a containerd při běhu většího počtu podů.

Co se změní, když povolíte posílení zabezpečení uzlu

Následující tabulky porovnávají standardní výchozí hodnoty pro uzly s Linuxem, na kterých běží Kubernetes 1.29 nebo novější, s výchozími nastaveními, které AKS použije při povolení posílení zabezpečení uzlů.

Rezervace prostředků

Setting Bez hardeningu uzlu Posílení zabezpečení uzlů
CPU rezervované pro kube Na základě počtu jader procesoru. Další informace najdete v tématu Rezervace procesoru. Nezměněný
Rezervovaná paměť pro Kubernetes min(20 × maxPods + 50, 25% of node memory) MiB min(35 × maxPods + max(250, 2% of node memory), 25% of node memory) MiB
ID procesů (PID) vyhrazené pro Kube 1000 Nerezervováno
CPU vyhrazené systémem None 100m
Systémově rezervovaná paměť None 200 MiB plus 100 MiB pro každou plnou 32 GiB paměti uzlu a 100 MiB pro clustery, které používají Azure CNI
Dočasné úložiště vyhrazené systémem None 1Gi

Prahové hodnoty evikce

Setting Bez zpevnění uzlu Posílení zabezpečení uzlů
Vynucené vyřazení: memory.available 100Mi 250Mi pro uzly s 8 GiB paměti nebo méně, 375Mi pro uzly s více než 8 GiB a méně než 32 GiB a 512Mi pro uzly s 32 GiB nebo více
Nucené vytěsnění: nodefs.available a nodefs.inodesFree 10% a 5% Nezměněný
Tvrdé vypuzení: pid.available 2000 Nenastaví se
Měkké vyřazení: memory.available None 500Mi, 750Mi, nebo 1Gi, pomocí stejných úrovní paměti uzlu jako při tvrdém vypuzení, s 30sekundovou ochrannou lhůtou
Měkké vyřazení: nodefs.available a nodefs.inodesFree None 12% a 7%, oba s 2minutovým obdobím odkladu
Maximální doba odkladu před ukončením podu během měkkého vytěsnění Nenastaví se 60 sekund

Vynucení cgroup

Setting Bez hardeningu uzlu S posílením uzlů
Vynuceně alokovatelné prostředky uzlu pods pods, kube-reserved a system-reserved
Kubelet a containerd cgroup system.slice, bez omezení kubereserved.slice, s pamětí omezenou na paměť rezervovanou pro kube a s podílem CPU úměrným CPU rezervovanému pro kube
cgroup hostitelských služeb system.slice, bez omezení system.slice, s pamětí omezenou na paměť vyhrazenou systémem a s podílem CPU úměrným procesoru vyhrazenému systémem

Vzhledem k tomu, že posílení zabezpečení uzlu si vyhrazuje větší kapacitu, hlásí uzly menší alokovatelnou kapacitu pro pody. Například na uzlu se 4 virtuálními procesory a 16 GiB paměti, který používá Azure CNI, povolení Node Hardening snižuje allocatable kapacitu následujícím způsobem:

  • Při výchozím maximálním počtu 250 podů na uzel se zvýší přibližně o 570 MiB paměti, 100 milijader CPU a 1 GiB dočasného úložiště.
  • Při maximálně 30 podech na uzel přibližně 1,3 GiB paměti, 100 milijader CPU a 1 GiB efemérního úložiště.

Prahy měkkého vystěhování nesnižují přidělitelnou kapacitu. Změní se jenom v případech, kdy kubelet začne vypuzovat pody.

Considerations

Než povolíte posílení zabezpečení uzlů, mějte na paměti následující skutečnosti:

  • Posílení zabezpečení uzlů povolíte na úrovni clusteru a vztahuje se na všechny fondy uzlů Linuxu v clusteru. Nemůžete ho povolit pro jednotlivé fondy uzlů a nemá vliv na Windows fondy uzlů.
  • Uzly hlásí méně alokovatelné kapacity, takže pody, které se vejdou do uzlu předtím, než povolíte posílení zabezpečení uzlu, se pak nemusí vejít. Zkontrolujte požadavky na prostředky podu a velikosti fondů uzlů.
  • Služby hostitele v system.slice sdílejí pevný limit paměti, který se rovná systémem rezervované paměti. Pokud na uzlech spouštíte vlastní agenty jako služby systemd, jako jsou bezpečnostní a monitorovací agenti nebo agenti pro předávání protokolů, započítávají se tito agenti do tohoto limitu. Před použitím Node Hardening v produkčním prostředí ověřte využití paměti a stabilitu.
  • Hodnoty, které jste nastavili ve vlastní konfiguraci kubeletu ve fondu uzlů, mají přednost před odpovídajícím výchozím nastavením posílení zabezpečení uzlu. Další informace najdete v tématu Přizpůsobení nastavení posílení zabezpečení uzlu.
  • Pokud posílení zabezpečení uzlů zakážete později, stávající fondy uzlů zachovávají posílená nastavení měkkého vyřazení i po opětovném vytvoření image jejich uzlů. Pokud chcete tato nastavení odebrat, musíte vytvořit nové pooly uzlů. Další informace najdete v tématu Zakázání posílení zabezpečení uzlu.
  • Výchozí hodnoty se můžou změnit, když je funkce ve verzi Preview. Začněte s neprodukčním clusterem a ověřte úlohy za reprezentativních podmínek zatížení uzlů.

Prerequisites

  • Předplatné služby Azure. Pokud žádné nemáte, vytvořte si bezplatný účet.
  • Cluster služby AKS s fondy uzlů se systémem Linux nebo oprávněním k jeho vytvoření.
  • Rozšíření Azure CLI aks-preview a příznak funkce CustomNodeConfigPreview, jak je popsáno v následujících částech.

aks-preview Instalace rozšíření Azure CLI

  1. Nainstalujte aks-preview rozšíření pomocí příkazu az extension add.

    az extension add --name aks-preview
    
  2. Pomocí příkazu az extension update aktualizujte rozšíření na nejnovější verzi.

    az extension update --name aks-preview
    

Zaregistruj příznak funkce CustomNodeConfigPreview

  1. CustomNodeConfigPreview Pomocí příkazu zaregistrujte příznak az feature register funkce.

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

    Zobrazení stavu Zaregistrované trvá několik minut.

  2. Pomocí příkazu ověřte stav az feature show registrace.

    az feature show --namespace "Microsoft.ContainerService" --name "CustomNodeConfigPreview"
    
  3. Když se zobrazí stav Registered, obnovte registraci poskytovatele prostředků Microsoft.ContainerService pomocí příkazu az provider register.

    az provider register --namespace "Microsoft.ContainerService"
    

Povolit zabezpečení uzlů

Ve verzi Preview není Node Hardening ve výchozím nastavení povolen.

Povolit hardening uzlů v novém clusteru

Vytvořte cluster s povoleným posílením zabezpečení uzlu pomocí az aks create příkazu s parametrem --enable-node-hardening .

Tento příkaz vyžaduje aks-preview rozšíření a CustomNodeConfigPreview příznak funkce. Další informace najdete v části Předpoklady.

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

Chcete-li změnu potvrdit, viz Ověřte nastavení posílení zabezpečení uzlu.

Povolte posílení zabezpečení uzlů v existujícím clusteru

Povolte posílení zabezpečení uzlu v existujícím clusteru pomocí az aks update příkazu s parametrem --enable-node-hardening .

Tento příkaz vyžaduje rozšíření aks-preview a příznak funkce CustomNodeConfigPreview. Další informace najdete v části Předpoklady.

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

Pokud chcete změnu potvrdit, přečtěte si téma Ověření nastavení posílení zabezpečení uzlu.

Ověřit nastavení posílení zabezpečení uzlu

  1. Pomocí příkazu az aks get-credentials získejte přihlašovací údaje pro váš cluster.

    az aks get-credentials --resource-group <resource-group-name> --name <cluster-name>
    
  2. Zkontrolujte efektivní nastavení rezervace kubeletu a evikce na uzlu dotazováním koncového bodu konfigurace kubeletu.

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

    Na posíleném uzlu systemReserved a evictionSoft obsahují hodnoty a enforceNodeAllocatable zahrnuje kube-reserved a system-reserved.

  3. Porovnejte kapacitu uzlu s alokovatelnými prostředky.

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

    Na zabezpečených uzlech jsou alokovatelné prostředky procesoru, paměti a dočasného úložiště nižší než kapacita. Rozdíl se rovná hodnotám kube-reserved a system-reserved v rezervacích prostředků plus pevným prahovým hodnotám vyřazení v prahových hodnotách vyřazení. Například na uzlu se 4 virtuálními procesory a 16 GiB paměti, který používá Azure CNI, je alokovatelný procesor o 240 millicores nižší než kapacita: 140 millicores CPU rezervovaného pro kube a 100 millicores CPU rezervovaného pro systém.

Přizpůsobte nastavení posílení zabezpečení Node

Výchozí nastavení kube-reserved a evikce pro fond uzlů s Linuxem můžete přepsat pomocí vlastní konfigurace kubeletu. Tato nastavení vyžadují CustomNodeConfigPreview feature flag. Můžete je použít bez ohledu na to, ať už je v clusteru povolené posílení zabezpečení uzlu, nebo ne. AKS spravuje hodnoty rezervované systémem a vynucení cgroup a nemůžete je přizpůsobit.

Každé nastavení přepíše řádek v tabulkách rezervací prostředků nebo prahových hodnot vyřazení. Řádky vyhrazené pro Kube odpovídají nastavení kubeReserved. Řádky pevného vytěsnění odpovídají nastavení hardEvictionThreshold. Řádky měkkého vytěsnění odpovídají nastavením softEvictionThreshold a softEvictionGracePeriod. Maximální ochranná lhůta ukončení podu odpovídá evictionMaxPodGracePeriodInSeconds.

Můžete nakonfigurovat následující nastavení:

Setting Overrides Description
kubeReserved.cpuMillicores CPU rezervované pro kube CPU vyhrazené pro systémové démony Kubernetes, v milijádrech.
kubeReserved.memoryMB Paměť rezervovaná pro kube Paměť vyhrazená pro démony systému Kubernetes v MiB.
hardEvictionThreshold.memoryAvailable Tvrdé vytěsnění: memory.available Prahová hodnota tvrdého uvolnění pro dostupnou paměť.
hardEvictionThreshold.nodeFsAvailable Tvrdé vytěsnění: nodefs.available Prahová hodnota vystěhování pro dostupný prostor systému souborů uzlu
hardEvictionThreshold.nodeFsInodesFree Vynucené vypuzení: nodefs.inodesFree Prahová hodnota tvrdého vyřazení pro volné inody souborového systému uzlu.
softEvictionThreshold.memoryAvailable Měkké vyřazení: memory.available Prahová hodnota měkkého vytěsnění pro dostupnou paměť
softEvictionThreshold.nodeFsAvailable Měkké vyřazení: nodefs.available Prahová hodnota měkkého vytěsnění pro dostupný prostor souborového systému uzlu
softEvictionThreshold.nodeFsInodesFree Měkké vyřazení: nodefs.inodesFree Prahová hodnota měkkého vyřazení pro volné inody systému souborů uzlu
softEvictionGracePeriod.memoryAvailable Měkké vyřazení: memory.available ochranná lhůta Jak dlouho musí dostupná paměť zůstat pod svou měkkou prahovou hodnotou, než kubelet vypudí pody.
softEvictionGracePeriod.nodeFsAvailable Měkké vyřazení: nodefs.available období odkladu Jak dlouho musí dostupné místo v systému souborů uzlu zůstat pod svým měkkým prahem, předtím než kubelet vypudí pody.
softEvictionGracePeriod.nodeFsInodesFree Měkké vyřazení: nodefs.inodesFree období odkladu Jak dlouho musí volné inody souborového systému na uzlu zůstat pod svým měkkým prahem, než kubelet vyřadí pody.
evictionMaxPodGracePeriodInSeconds Maximální lhůta pro ukončení podu během měkkého vytěsnění Maximální počet sekund, po které kubelet umožňuje ukončení podů během měkkého vytěsnění.
  • Povolené hodnoty, minimum a ověřovací pravidla pro každé nastavení najdete v tématu Vlastní konfigurační parametry uzlu pro AKS.
  • Pro každý signál vyřazení nastavte měkký práh vyřazení i odpovídající období odkladu a zajistěte, aby každý měkký práh vyřazení byl větší než tvrdý práh vyřazení pro stejný signál.
  1. Vytvořte konfigurační soubor kubeletu, například nodehardening-kubelet.json, s nastaveními, která chcete přizpůsobit. Následující příklad nastaví každou konfigurovatelnou hodnotu. Nastaví kube-reserved na 200 milicores procesoru a 1 024 MiB paměti. Nastaví pevné prahové hodnoty pro vyřazení při 512Mi dostupné paměti, 10% dostupného prostoru systému souborů a 5% volných inodech. Nastaví prahové hodnoty 1Gi, 12% a 7% pro měkké vystěhování s obdobími odkladu 30 sekund, 2 minuty a 2 minuty. Nastaví také maximální 60sekundové období odkladu ukončení podu.

    {
      "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. Pomocí příkazu --kubelet-config s parametrem az aks nodepool add vytvořte fond uzlů s Linuxem, který používá konfigurační soubor.

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

    Pomocí parametru --kubelet-config s příkazem az aks create můžete také použít konfiguraci pro počáteční fond uzlů clusteru.

Zakázat posílení zabezpečení uzlů

Zakažte posílení zabezpečení uzlů pomocí az aks update příkazu s parametrem --disable-node-hardening .

Tento příkaz vyžaduje rozšíření aks-preview a feature flag CustomNodeConfigPreview. Další informace najdete v části Předpoklady.

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

Vypnutí posílení zabezpečení uzlu vypne nastavení na úrovni clusteru, ale okamžitě nezmění stávající uzly. Stávající uzly zachovávají všechna posílená nastavení, dokud nebudou znovu vytvořeny z image, například během upgradu image uzlu. Po přeinstalaci uzlu se použijí následující změny:

  • Vrácení standardních výchozích hodnot AKS: Rezervované prostředky Kube a rezervované systémem, pevné prahové hodnoty vyřazování a vynucení cgroup Kapacita pro přidělení uzlu se odpovídajícím způsobem zvyšuje.
  • Zachováno: Prahové hodnoty měkkého vytěsnění, doba hájení měkkého vytěsnění a maximální doba hájení ukončení podu během měkkého vytěsnění.

Vlastní konfiguraci kubeletu můžete nastavit jenom při vytváření clusteru nebo fondu uzlů, takže z existujícího fondu uzlů nemůžete odebrat zachovaná nastavení měkké evikce. Pokud je chcete odebrat, vytvořte nový fond uzlů, u kterého je explicitně nenastavíte, přesuňte úlohy do nového fondu uzlů a potom odstraňte starý fond uzlů.

  1. Vytvořte konfigurační soubor kubeletu, například remove-soft-eviction.json. Následující příklad nastaví každou prahovou hodnotu měkkého vystěhování a ochrannou lhůtu na prázdný řetězec, který vypne měkké vystěhování pro tento signál. Také nastaví maximální dobu odkladu před ukončením podu na 0, což je standardní výchozí hodnota AKS.

    {
      "softEvictionThreshold": {
        "memoryAvailable": "",
        "nodeFsAvailable": "",
        "nodeFsInodesFree": ""
      },
      "softEvictionGracePeriod": {
        "memoryAvailable": "",
        "nodeFsAvailable": "",
        "nodeFsInodesFree": ""
      },
      "evictionMaxPodGracePeriodInSeconds": 0
    }
    
  2. Pomocí příkazu --kubelet-config s parametrem az aks nodepool add vytvořte fond uzlů s Linuxem, který používá konfigurační soubor.

    az aks nodepool add \
        --resource-group <resource-group-name> \
        --cluster-name <cluster-name> \
        --name <node-pool-name> \
        --kubelet-config ./remove-soft-eviction.json
    
  3. Přesuňte úlohy do nového fondu uzlů a odstraňte starý fond uzlů. Další informace najdete v tématu Změna velikosti fondů uzlů v AKS.

Informace o potvrzení nastavení uzlu najdete v tématu Ověření nastavení posílení zabezpečení uzlu. Na uzlech v novém poolu uzlů je evictionSoft prázdné.