Wzmacnianie zabezpieczeń węzłów (wersja zapoznawcza) w Azure Kubernetes Service (AKS)

Wzmacnianie zabezpieczeń węzłów to opcjonalna funkcja dla pul węzłów systemu Linux, która chroni stabilność węzłów, gdy obciążenia wywierają presję na zasoby procesora, pamięci lub dysku. Po włączeniu funkcji Node Hardening w klastrze usługa AKS zmienia sposób, w jaki każdy węzeł rezerwuje i wymusza zasoby dla składników Kubernetes i usług hosta, oraz sposób, w jaki kubelet usuwa pody, gdy zaczyna brakować zasobów.

W tym artykule wyjaśniono, jakie zmiany wprowadza funkcja Node Hardening, porównano wzmocnione ustawienia domyślne ze standardowymi ustawieniami domyślnymi usługi AKS i pokazano, jak włączać, weryfikować, dostosowywać i wyłączać tę funkcję.

Important

Funkcje usługi AKS w wersji zapoznawczej są dostępne na zasadzie samoobsługi i wymagają zapisania się. Wersje zapoznawcze są udostępniane w wersji "as is" i "jako dostępne" i są wykluczone z umów dotyczących poziomu usług i ograniczonej gwarancji. Wersje zapoznawcze usługi AKS są częściowo objęte pomocą techniczną dla klientów, świadczoną w miarę możliwości. W związku z tym te funkcje nie są przeznaczone do użytku produkcyjnego. Aby uzyskać więcej informacji, zobacz następujące artykuły pomocy technicznej:

Zalety utwardzania węzłów

W węzłach zajętych lub o skokowym obciążeniu obciążenia robocze mogą zużywać zasoby potrzebne przez rozwiązanie kubelet, środowisko uruchomieniowe kontenera i usługi hosta. W takim przypadku węzły mogą nagle przestać odpowiadać, zgłaszać stan NotReady lub gwałtownie kończyć działanie podów. Wzmacnianie zabezpieczeń węzłów zmniejsza te zagrożenia na następujące sposoby:

  • Wymuszone rezerwacje: Domyślnie usługa AKS używa wartości zarezerwowanych kube-reserved tylko do obliczenia pojemności, jaką harmonogram może przydzielić do zasobników. Dzięki zastosowaniu funkcji Node Hardening narzędzie kubelet wymusza również zasoby zarezerwowane dla kube-reserved i system-reserved za pośrednictwem grup kontroli systemu Linux (cgroups). Narzędzie kubelet i kontenerd działają w dedykowanej kubereserved.slice grupie cgroup, dzięki czemu zachowują swój zarezerwowany udział procesora CPU i pamięć nawet wtedy, gdy pody w pełni obciążają węzeł.
  • Dedykowana pojemność dla usług hosta: Node Hardening dodaje alokację zarezerwowaną przez system dla usług systemu operacyjnego hosta, uruchamianych w system.slice.
  • Więcej miejsca na pamięć: Twardy próg eksmisji dla dostępnej pamięci skaluje się wraz z pamięcią węzła, więc kubelet eksmituje pody, zanim węzeł osiągnie krytycznie niski poziom pamięci.
  • Łagodne usuwanie: Miękkie progi eksmisji pozwalają kubeletowi usuwać pody w sposób łagodny, z okresem prolongaty na zakończenie, gdy pamięć lub miejsce na dysku jest niskie. Twarda eksmisja, która natychmiast kończy zasobniki, stanowi ostateczność.
  • Rezerwacje skalowane wraz z gęstością podów: Obliczanie pamięci zarezerwowanej dla kube zwiększa się wraz z maksymalną liczbą podów na węzeł, co uwzględnia narzut kubelet i containerd związany z uruchamianiem większej liczby podów.

Co się zmienia po włączeniu wzmacniania zabezpieczeń węzła

W poniższych tabelach porównano standardowe wartości domyślne dla węzłów systemu Linux z uruchomionym rozwiązaniem Kubernetes 1.29 lub nowszym z wartościami domyślnymi, które AKS stosuje w przypadku włączenia wzmacniania zabezpieczeń węzła.

Rezerwacje zasobów

Setting Bez wzmacniania węzła Z utwardzaniem węzłów
CPU zarezerwowany przez Kube Na podstawie liczby rdzeni procesora CPU. Aby uzyskać więcej informacji, zobacz Rezerwacje procesora CPU. Niezmienione
Pamięć zarezerwowana dla Kube min(20 × maxPods + 50, 25% of node memory) MiB min(35 × maxPods + max(250, 2% of node memory), 25% of node memory) MiB
Identyfikatory procesów (PID) zarezerwowane dla kube-reserved 1000 Niezarezerwowane
CPU zarezerwowany przez system None 100m
Pamięć zarezerwowana przez system None 200 MiB, plus 100 MiB na każde pełne 32 GiB pamięci węzła, plus 100 MiB dla klastrów używających Azure CNI
Efemeryczna pamięć zarezerwowana przez system None 1Gi

Progi eksmisji

Setting Bez utwardzania węzła Z utwardzaniem węzłów
Twarde usunięcie: memory.available 100Mi 250Mi dla węzłów z 8 GiB pamięci lub mniej, 375Mi dla węzłów z więcej niż 8 GiB i mniej niż 32 GiB, a 512Mi dla węzłów z 32 GiB lub więcej
Wymuszone usunięcie: nodefs.available i nodefs.inodesFree 10% i 5% Niezmienione
Twarda eksmisja: pid.available 2000 Nie ustawiono
Miękkie usuwanie: memory.available None 500Mi, 750Mi lub 1Gi, używając tych samych warstw pamięci węzła co twarde eksmisje, z 30-sekundowym okresem karencji
Miękkie usuwanie: nodefs.available i nodefs.inodesFree None 12% i 7%, każdy z 2-minutowym okresem prolongaty
Maksymalny okres prolongaty zakończenia poda podczas miękkiej eksmisji Nie ustawiono 60 sekund

Wymuszanie cgroup

Setting Bez utwardzania węzła Z utwardzaniem węzłów
Wymuszony przydział zasobów węzła pods pods, kube-reservedi system-reserved
Kubelet i containerd cgroup system.slice, bez ograniczeń kubereserved.slice, z pamięcią ograniczoną do pamięci zarezerwowanej kube-reserved oraz udziałem CPU proporcjonalnym do CPU zarezerwowanego kube-reserved
Host services cgroup system.slice, bez ograniczeń system.slice, z pamięcią ograniczoną do pamięci zarezerwowanej przez system oraz udziałem procesora CPU proporcjonalnym do procesora CPU zarezerwowanego przez system

Ponieważ Node Hardening rezerwuje więcej pojemności, węzły zgłaszają mniejszą pojemność możliwą do przydzielenia dla podów. Na przykład w węźle z 4 procesorami wirtualnymi i 16 GiB pamięci, który używa Azure CNI, włączenie funkcji Node Hardening zmniejsza pojemność możliwą do przydzielenia w następujący sposób:

  • Przy domyślnym maksymalnym rozmiarze 250 zasobników na węzeł, około 570 MiB pamięci, 100 milirdzeni CPU i 1 GiB magazynu efemerycznego.
  • Przy maksymalnie 30 zasobnikach na węzeł o około 1,3 GiB pamięci, 100 milirdzeni CPU i 1 GiB magazynu efemerycznego.

Miękkie progi usuwania podów nie zmniejszają pojemności allocatable. Zmieniają się tylko wtedy, gdy kubelet zaczyna eksmitować pody.

Considerations

Przed włączeniem wzmacniania zabezpieczeń węzłów należy pamiętać o następujących kwestiach:

  • Włączasz utwardzanie węzłów na poziomie klastra i jest ono stosowane do wszystkich pul węzłów systemu Linux w klastrze. Nie można go włączyć dla poszczególnych pul węzłów i nie ma to wpływu na pule węzłów systemu Windows.
  • Węzły zgłaszają mniej pojemności możliwej do przydzielenia, więc pody, które mieszczą się w węźle przed włączeniem Node Hardening, mogą nie mieścić się później. Przejrzyj żądania zasobów poda i rozmiary puli węzłów.
  • Usługi hosta w system.slice współdzielą sztywny limit pamięci równy pamięci zarezerwowanej przez system. Jeśli uruchamiasz własnych agentów na węzłach jako usługi systemowe, takie jak zabezpieczenia, monitorowanie lub agenci przekazujący dzienniki, ci agenci wliczają się do tego limitu. Przed użyciem Node Hardening w środowisku produkcyjnym zweryfikuj użycie pamięci i stabilność.
  • Wartości ustawione w niestandardowej konfiguracji kubelet puli węzłów zastępują odpowiednie domyślne ustawienia utwardzania węzłów. Aby uzyskać więcej informacji, zobacz Dostosowywanie ustawień wzmacniania zabezpieczeń węzła.
  • Jeśli później wyłączysz utwardzanie węzłów, istniejące pule węzłów zachowają ustawienia miękkiego usuwania w ramach utwardzania, nawet po ponownym utworzeniu obrazu ich węzłów. Aby usunąć te ustawienia, należy utworzyć nowe pule węzłów. Aby uzyskać więcej informacji, zobacz Wyłącz utwardzanie węzłów.
  • Wartości domyślne mogą ulec zmianie, gdy funkcja jest w wersji zapoznawczej. Zacznij od klastra nieprodukcyjnego i zweryfikuj obciążenia w reprezentatywnych warunkach presji na zasoby węzła.

Prerequisites

  • Subskrypcja platformy Azure. Jeśli go nie masz, utwórz bezpłatne konto.
  • Klaster usługi AKS z pulami węzłów systemu Linux lub uprawnienia do jego utworzenia.
  • aks-preview Rozszerzenie Azure CLI i flaga CustomNodeConfigPreview funkcji zgodnie z opisem w poniższych sekcjach.

Zainstaluj rozszerzenie Azure CLI aks-preview

  1. Zainstaluj rozszerzenie przy użyciu polecenia az extension add.

    az extension add --name aks-preview
    
  2. Przeprowadź aktualizację do najnowszej wersji rozszerzenia przy użyciu az extension update polecenia .

    az extension update --name aks-preview
    

Zarejestruj flagę funkcji CustomNodeConfigPreview

  1. Zarejestruj flagę funkcji CustomNodeConfigPreview za pomocą polecenia az feature register.

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

    Wyświetlenie stanu Zarejestrowane trwa kilka minut.

  2. Sprawdź stan rejestracji przy użyciu az feature show polecenia .

    az feature show --namespace "Microsoft.ContainerService" --name "CustomNodeConfigPreview"
    
  3. Gdy jako stan jest wyświetlane Registered, odśwież rejestrację dostawcy zasobów Microsoft.ContainerService za pomocą polecenia az provider register.

    az provider register --namespace "Microsoft.ContainerService"
    

Włącz utwardzanie węzłów

W trakcie korzystania z wersji zapoznawczej funkcja wzmacniania zabezpieczeń węzła nie jest domyślnie włączona.

Włącz wzmacnianie zabezpieczeń węzłów w nowym klastrze

Utwórz klaster z włączonym wzmacnianiem zabezpieczeń węzłów przy użyciu polecenia az aks create z parametrem --enable-node-hardening.

To polecenie wymaga aks-preview rozszerzenia i flagi funkcji CustomNodeConfigPreview. Aby uzyskać więcej informacji, zobacz Wymagania wstępne.

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

Aby potwierdzić zmianę, zobacz Weryfikacja ustawień wzmacniania zabezpieczeń węzła.

Włącz utwardzanie węzłów w istniejącym klastrze

Włącz Node Hardening w istniejącym klastrze za pomocą polecenia az aks update z parametrem --enable-node-hardening.

To polecenie wymaga rozszerzenia aks-preview i flagi funkcji CustomNodeConfigPreview. Aby uzyskać więcej informacji, zobacz Wymagania wstępne.

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

Aby potwierdzić zmianę, zobacz Weryfikacja ustawień wzmacniania zabezpieczeń węzła.

Weryfikacja ustawień wzmacniania zabezpieczeń Node

  1. Pobierz poświadczenia dla klastra, używając polecenia az aks get-credentials.

    az aks get-credentials --resource-group <resource-group-name> --name <cluster-name>
    
  2. Sprawdź efektywne ustawienia rezerwacji i eksmisji kubelet w węźle, wysyłając zapytanie do punktu końcowego konfiguracji kubelet.

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

    Na wzmocnionym węźle systemReserved i evictionSoft zawierają wartości, a enforceNodeAllocatable zawiera kube-reserved i system-reserved.

  3. Porównaj pojemność węzła z jego zasobami allocatable.

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

    W węźle ze wzmocnionymi zabezpieczeniami zasoby procesora CPU, pamięci i magazynu efemerycznego możliwe do przydzielenia są niższe niż pojemność. Różnica jest równa wartościom zarezerwowanym kube-reserved i system-reserved w Resource reservations oraz twardym progom eksmisji w progach eksmisji. Na przykład w węźle z 4 procesorami wirtualnymi i 16 GiB pamięci, korzystającym z Azure CNI, przydzielalne CPU jest niższe od pojemności zasobu o 240 millicores: 140 millicores CPU zarezerwowanego dla kube-reserved i 100 millicores CPU zarezerwowanego dla systemu.

Dostosuj ustawienia utwardzania Node

Można nadpisać ustawienia domyślne kube-reserved i eksmisji dla puli węzłów systemu Linux przy użyciu niestandardowej konfiguracji kubelet. Te ustawienia wymagają flagi feature flag CustomNodeConfigPreview. Można ich używać niezależnie od tego, czy w klastrze włączono Node Hardening. Usługa AKS zarządza wartościami zarezerwowanymi przez system i wymuszaniem mechanizmu cgroup i nie można ich dostosowywać.

Każde ustawienie nadpisuje wiersz w tabelach Rezerwacje zasobów lub Progi usuwania. Wiersze zarezerwowane przez Kube odpowiadają ustawieniom kubeReserved. Wiersze trwałego usuwania odpowiadają ustawieniu hardEvictionThreshold. Wiersze miękkiego usuwania odpowiadają ustawieniom softEvictionThreshold i softEvictionGracePeriod. Maksymalny okres prolongaty przed zakończeniem poda odpowiada evictionMaxPodGracePeriodInSeconds.

Możesz skonfigurować następujące ustawienia:

Setting Overrides Description
kubeReserved.cpuMillicores CPU zarezerwowany przez Kube Procesor CPU zarezerwowany dla demonów systemu Kubernetes w milicores.
kubeReserved.memoryMB Pamięć zarezerwowana dla Kube Pamięć zarezerwowana dla demonów systemowych Kubernetes, w MiB.
hardEvictionThreshold.memoryAvailable Twarde usunięcie: memory.available Próg twardego usuwania dla dostępnej pamięci.
hardEvictionThreshold.nodeFsAvailable Hard eviction: nodefs.available Twardy próg usuwania podów dla dostępnego miejsca w systemie plików węzła.
hardEvictionThreshold.nodeFsInodesFree Twarde usunięcie: nodefs.inodesFree Twardy próg usuwania dla wolnych i-węzłów systemu plików węzła.
softEvictionThreshold.memoryAvailable Miękkie usunięcie: memory.available Miękki próg usuwania dla dostępnej pamięci.
softEvictionThreshold.nodeFsAvailable Eksmisja miękka: nodefs.available Próg miękkiej eksmisji dla dostępnego miejsca w systemie plików węzła.
softEvictionThreshold.nodeFsInodesFree Miękkie usunięcie: nodefs.inodesFree Próg miękkiej eksmisji dla wolnych i-węzłów systemu plików węzła.
softEvictionGracePeriod.memoryAvailable Miękkie usuwanie: memory.available okres karencji Jak długo dostępna pamięć musi pozostać poniżej progu miękkiego, zanim kubelet wyeksmituje zasobniki.
softEvictionGracePeriod.nodeFsAvailable miękkie usunięcie: nodefs.available okres prolongaty Jak długo dostępne miejsce systemu plików węzłów musi pozostawać poniżej progu miękkiego, zanim kubelet eksmituje zasobniki.
softEvictionGracePeriod.nodeFsInodesFree Eksmisja miękka: nodefs.inodesFree okres karencji Jak długo wolne i-węzły systemu plików muszą pozostawać poniżej progu miękkiego, zanim kubelet usunie pody.
evictionMaxPodGracePeriodInSeconds Maksymalny okres prolongaty przed zakończeniem poda podczas miękkiej eksmisji Maksymalna liczba sekund, przez które kubelet umożliwia zakończenie podów podczas miękkiego usuwania.
  • Aby uzyskać informacje o dozwolonych wartościach, minimalnych i regułach walidacji dla każdego ustawienia, zobacz Niestandardowe parametry konfiguracji węzła dla usługi AKS.
  • Dla każdego sygnału usuwania ustaw zarówno próg miękkiego usuwania, jak i odpowiadający mu okres karencji, i upewnij się, że każdy próg miękkiego usuwania jest większy niż próg twardego usuwania dla tego samego sygnału.
  1. Utwórz plik konfiguracji kubelet, taki jak nodehardening-kubelet.json, z ustawieniami, które chcesz dostosować. Poniższy przykład ustawia każdą konfigurowalną wartość. Ustawia wartość kube-reserved na 200 milirdzeni CPU i 1024 MiB pamięci. Ustawia twarde progi eksmisji na poziomie 512Mi dostępnej pamięci, 10% dostępnego miejsca w systemie plików i 5% wolnych i-węzłów. Ustawia miękkie progi wykluczania 1Gi, 12% i 7% z okresami karencji wynoszącymi 30 sekund, 2 minuty i 2 minuty. Ustawia również 60-sekundowy maksymalny okres prolongaty przy zakończeniu poda.

    {
      "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. Utwórz pulę węzłów systemu Linux, która używa pliku konfiguracji za pomocą polecenia az aks nodepool add z parametrem --kubelet-config.

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

    Możesz również użyć parametru --kubelet-config z poleceniem az aks create , aby zastosować konfigurację do początkowej puli węzłów klastra.

Wyłącz utwardzanie węzła

Wyłącz ochronę węzła za pomocą polecenia az aks update z parametrem --disable-node-hardening.

To polecenie wymaga rozszerzenia aks-preview i flagi funkcji CustomNodeConfigPreview. Aby uzyskać więcej informacji, zobacz Wymagania wstępne.

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

Wyłączenie wzmacniania zabezpieczeń węzła powoduje wyłączenie ustawienia na poziomie klastra, ale nie zmienia od razu istniejących węzłów. Istniejące węzły zachowają wszystkie utwardzone ustawienia do momentu ponownego zainstalowania obrazu, na przykład podczas uaktualniania obrazu węzła. Po ponownym zainstalowaniu obrazu na węźle mają zastosowanie następujące zmiany:

  • Przywrócono standardowe wartości domyślne usługi AKS: Zasoby zarezerwowane kube-reserved i system-reserved, progi twardej eksmisji i wymuszanie mechanizmu cgroup. Zasoby węzła możliwe do przydzielenia zwiększają się odpowiednio.
  • Zachowane: Miękkie progi usuwania, miękkie okresy prolongaty usuwania i maksymalny okres prolongaty zakończenia poda podczas miękkiego usuwania.

Niestandardową konfigurację kubelet można ustawić tylko podczas tworzenia klastra lub puli węzłów, dlatego nie można usunąć zachowanych ustawień miękkiej eksmisji z istniejącej puli węzłów. Aby je usunąć, utwórz nową pulę węzłów, która jawnie je usuwa, przenieś swoje obciążenia robocze do nowej puli węzłów, a następnie usuń starą pulę węzłów.

  1. Utwórz plik konfiguracji kubeletu, taki jak remove-soft-eviction.json. W poniższym przykładzie każdy miękki próg wysiedlenia i okres karencji są ustawiane na pusty ciąg, co powoduje wyłączenie miękkiego wysiedlenia dla tego sygnału. Ustawia również maksymalny okres prolongaty zakończenia poda na wartość 0, która jest standardową wartością domyślną usługi AKS.

    {
      "softEvictionThreshold": {
        "memoryAvailable": "",
        "nodeFsAvailable": "",
        "nodeFsInodesFree": ""
      },
      "softEvictionGracePeriod": {
        "memoryAvailable": "",
        "nodeFsAvailable": "",
        "nodeFsInodesFree": ""
      },
      "evictionMaxPodGracePeriodInSeconds": 0
    }
    
  2. Utwórz pulę węzłów systemu Linux, która używa pliku konfiguracji przy użyciu az aks nodepool add polecenia z parametrem --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. Przenieś obciążenia do nowej puli węzłów, a następnie usuń starą pulę węzłów. Aby uzyskać więcej informacji, zobacz Zmienianie rozmiaru pul węzłów w usłudze AKS.

Aby sprawdzić ustawienia węzła, zobacz Weryfikowanie ustawień wzmacniania zabezpieczeń węzła. Na węzłach w nowej puli węzłów element evictionSoft jest pusty.