Zagadnienia związane z izolacją zasobników w usłudze Azure Kubernetes Service (AKS)

Izolacja zasobników w usłudze Azure Kubernetes Service (AKS) wiąże się z zagadnieniami dotyczącymi zarządzania zasobami, pamięcią, procesorem i zabezpieczeniami.

Zarządzanie zasobami w izolacji Podów

Zapoznaj się z tymi zagadnieniami podczas określania zasobów dla wdrożenia, szczególnie w przypadku dużych lub wrażliwych na zasoby obciążeń.

Składniki kata

Wdrożenie Kata obejmuje składniki działające na węźle AKS oraz składniki działające wewnątrz maszyny wirtualnej (VM) zasobnika. Ten podział hosta i gościa określa, jak jest uwzględniane użycie pamięci i procesora CPU.

Składnik Działa w Purpose Wpływ na zasoby
podkładka dystansowa Kata Węzeł usługi AKS (host) Zarządza cyklem życia maszyny wirtualnej pod. Korzysta z zasobów po stronie hosta, wliczanych do narzutu RuntimeClass.
Hipernadzorca chmurowy Węzeł usługi AKS (host) Udostępnia monitor maszyn wirtualnych (VMM), który tworzy i uruchamia maszynę wirtualną podu. Używa zasobów po stronie hosta, które są uwzględniane przez RuntimeClass obciążenie.
virtiofsd Węzeł usługi AKS (host) Udostępnia pliki między maszyną wirtualną zasobnika a hostem kontenera. Korzysta z zasobów po stronie hosta, które są wliczane do narzutu RuntimeClass.
Agent Kata Maszyna wirtualna poda (gość) Zarządza kontenerami wewnątrz maszyny wirtualnej poda. Używa zasobów po stronie gościa z pamięci maszyny wirtualnej zasobnika i alokacji procesora CPU.
Jądro maszyny wirtualnej Pod Maszyna wirtualna poda (gość) Udostępnia jądro systemu operacyjnego gościa. Używa zasobów po stronie gościa z pamięci maszyny wirtualnej zasobnika i alokacji procesora CPU.
Kontenery obciążeń roboczych Maszyna wirtualna zasobnika (gość) Uruchom obciążenie generowane przez użytkownika. Użyj pozostałych zasobów po stronie gościa, w granicach limitów zasobów poda.

Zarządzanie pamięcią w izolacji Podów

Ustaw wystarczająco wysoki limit pamięci maszyny wirtualnej zasobnika, aby obsługiwać obciążenia i składniki gościa Kata bez przydzielania nieużywanej pamięci.

Rozmiar pamięci maszyny wirtualnej podu

Każda maszyna wirtualna poda otrzymuje pamięć dla obciążenia roboczego i wszystkich komponentów gościa Kata. Uwzględnij pamięć ponad przewidywane zużycie przez obciążenie dla komponentów gościa, takich jak agent Kata i jądro maszyny wirtualnej. Zobacz wartości użycia referencyjnego dla typowych wartości pamięci.

Limit pamięci poda Kubernetes określa rozmiar pamięci VM poda. Zmień limit pamięci poda, aby zmienić rozmiar pamięci maszyny wirtualnej poda.

Important

Jeśli nie określisz limitu pamięci poda, usługa AKS zastosuje domyślny limit pamięci VM dla poda wynoszący 512 Mi. Po uruchomieniu zasobnika rozmiar pamięci maszyny wirtualnej zasobnika jest stały.

RuntimeClass narzut pamięci zwykle rośnie wraz z rozmiarem pamięci maszyny wirtualnej poda.

RuntimeClass obciążenie pamięci

Obciążenia uruchamiane w piaskownicy poda są dostarczane z domyślnym środowiskiem Kata RuntimeClass (kata-vm-isolation), które obejmuje domyślne wartości narzutu zasobów. Aby uzyskać bardziej szczegółową kontrolę nad limitami przydziałów zasobów, skonfiguruj niestandardowy RuntimeClass za pomocą określonych obciążeń związanych z zasobami. Limit pamięci zasobnika określa ilość pamięci po stronie systemu gościa dostępnej dla maszyny wirtualnej zasobnika. RuntimeClass Narzut rezerwuje zasoby węzła dla komponentów Kata po stronie hosta i nie trzeba w nim uwzględniać oczekiwanego zużycia pamięci komponentów gościa.

Możesz utworzyć wyspecjalizowane środowisko uruchomieniowe i określić obciążenie pamięci za pośrednictwem overhead pola w RuntimeClass manifeście. Na przykład następujący manifest tworzy środowisko uruchomieniowe dla obciążeń, które powinny mieć mniejsze zużycie zasobów:

apiVersion: node.k8s.io/v1
kind: RuntimeClass
metadata:
  name: small-kata-pods
handler: kata
overhead:
  podFixed:
    memory: "120Mi"

Wartość memory: "120Mi" dodaje 120Mi stałego obciążenia zasobnika, gdy platforma Kubernetes planuje zasobnik i jego rozmiary cgroup. Wartość handler: kata musi być zgodna z programem obsługi środowiska uruchomieniowego Kata skonfigurowanym na węzłach usługi AKS.

Przed użyciem niestandardowego RuntimeClass uruchom kubectl get runtimeclass i sprawdź, czy jego obsługa jest obsługiwana w klastrze AKS.

Określenie obciążenia nie jest wymagane, ale zaleca się, aby uzyskać dokładnszą kontrolę nad zasobami zarezerwowanymi dla obciążeń. Jeśli używasz domyślnego kata-vm-isolationRuntimeClass i nie określisz limitu pamięci poda, rozmiar maszyny wirtualnej poda domyślnie wynosi 512Mi. Wartość domyślna RuntimeClass powoduje dodanie około 88Mi obciążenia pamięci dla składników hosta, co powoduje przekroczenie limitu zasobnika 600Mi cgroup .

Obciążenia użytkowników

Obciążenie Kata może używać skonfigurowanego rozmiaru pamięci maszyny wirtualnej zasobnika pomniejszonego o pamięć, którą składniki gościa, takie jak agent Kata i jądro maszyny wirtualnej gościa, zużywają.

Aby oszacować pamięć, użyj następujących składników:

  1. Połącz się z maszyną wirtualną pod (za pośrednictwem kubectl exec lub kubectl debug), aby otworzyć terminal wewnątrz pod.
  2. Uruchom polecenie free.
  3. Sprawdź użytą kolumnę, aby oszacować pamięć zużywaną przez jądro gościa i agenta Kata.

Grupy pamięci

Gdy Kubernetes przydziela zasobnik Kata, kubelet przydziela zasobnikowi pamięć cgroup. Element cgroup wymusza żądania i limity pamięci zasobnika, dzięki czemu można zdefiniować zasoby dostępne dla zasobnika.

cgroup Pamięć ma dwa ważne pola:

pole cgroup Opis
memory.current Podaje bieżące użycie pamięci przez maszynę wirtualną poda, w tym komponenty gościa i komponenty hosta Kata.
memory.max Definiuje górny limit pamięci dla zasobnika cgroup. Narzędzie kubelet oblicza tę wartość jako sumę limitu pamięci zasobnika i obciążenie pamięci RuntimeClass.

Jeśli wartość memory.current kiedykolwiek przekracza wartość memory.max, to jądro może wyzwolić OOMKill na podzie, jeśli zostanie wykryte ciśnienie pamięci.

Odwołuj się do wartości użycia

Użyj następujących wartości jako typowych przykładów użycia pamięci. Rozmiary pamięci Pod VM poniżej 128 MiB nie są obsługiwane.

Jak odczytywać tę tabelę: memory.current obejmuje alokację pamięci maszyny wirtualnej poda oraz bieżące użycie zasobów składników hosta. Narzędzie kubelet oblicza memory.max na podstawie limitu pamięci Poda oraz narzutu RuntimeClass. Różnica między tymi wartościami wskazuje pojemność dostępną dla dodatkowego użycia składnika hosta.

Rozmiar pamięci maszyny wirtualnej podu RuntimeClass obciążenie pamięć.bieżaca memory.max Wolna pamięć dostępna dla komponentów hosta
128Mi 16Mi 133Mi 144Mi 11Mi
256Mi 32 MiB 263Mi 288Mi 25Mi
1Gi 128Mi 1034Mi 1152Mi 118Mi
2Gi 256Mi 2063Mi 2304Mi 241Mi
4Gi 374Mi 4122Mi 4470 MiB 348Mi
8 GiB 512Mi 8232Mi 8704Mi 472Mi
32Gi 640Mi 32918 MiB 33408Mi 490Mi
64Gi 768Mi 65825Mi 66304Mi 479Mi
96 GiB 896Mi 98738Mi 99200Mi 462Mi
128Gi 1Gi 131646Mi 132096Mi 450Mi

Najlepsze rozwiązania dotyczące zarządzania pamięcią

  • Określ rozmiary pamięci maszyny wirtualnej poda, ustawiając limits.memory w manifestach, i zdefiniuj odpowiednie limity zasobów dla wszystkich wdrożeń.
    • Użyj niezerowego żądania pamięci, aby zarezerwować zasoby węzła dla maszyny wirtualnej poda przed uruchomieniem maszyny wirtualnej. Żądanie powinno uwzględniać maszynę wirtualną poda i kontenery, które są na niej uruchomione.
    • Użyj niezerowego narzutu pamięci RuntimeClass, aby uwzględnić zasoby węzła zużywane przez komponenty hosta Kata.
  • W przypadku obciążeń wymagających dużych zasobów ustaw limit pamięci poda, który zapewni wystarczającą ilość pamięci dla obciążenia i komponentów gościa.
  • Ustaw RuntimeClass narzut pamięci na wystarczająco wysoki poziom dla komponentów hosta Kata, nie rezerwując przy tym znacznie większych zasobów węzła, niż wymagają.

Zarządzanie procesorem CPU w piaskownicy zasobnika

Przydziel zasoby procesora CPU do obciążeń Kata, ustawiając limity RuntimeClass procesora i obciążenie zasobnika. Bez limitu użycia CPU komponenty hosta Kata mogą wykorzystywać dowolną moc CPU dostępną w danym węźle.

Rezerwowanie CPU

Ustaw jedno lub oba z następujących pól, aby zarezerwować zasoby procesora dla obciążeń roboczych Kata:

  • RuntimeClass Obciążenie procesora CPU
  • Limit CPU poda

Po określeniu co najmniej jednej z dwóch wartości, płaszczyzna sterowania rezerwuje określoną liczbę procesorów na węźle na potrzeby twojego obciążenia. Inne pody na tym samym węźle nie mogą uzyskać dostępu do tej pojemności zarezerwowanej.

Limit CPU dla Pod

Zadeklaruj limit CPU poda w manifeście aplikacji. Limit określa, z ilu procesorów mogą korzystać kontenery w skojarzonej maszynie wirtualnej poda.

Important

Ułamkowe limity CPU poda są zaokrąglane w górę do najbliższej wyższej pełnej wartości vCPU na potrzeby przydziału maszyny wirtualnej dla poda. Procesor zasobnika cgroup nadal wymusza limit ułamkowy obciążenia. Uwzględnij to zaokrąglenie podczas planowania kosztów i gęstości węzłów.

Jeśli nie zadeklarujesz limitu CPU dla poda, usługa AKS przydzieli 1 vCPU do maszyny wirtualnej poda, gdy węzeł ma wystarczające zasoby. Komponenty hosta Kata nie mają limitu zużycia procesora.

RuntimeClass Obciążenie procesora CPU

RuntimeClass Określ obciążenie, aby zarezerwować pojemność węzła dla składników hosta Kata przed wdrożeniem obciążenia.

Obciążenie procesora CPU można określić za pomocą overhead pola w RuntimeClass manifeście. Na przykład:

apiVersion: node.k8s.io/v1
kind: RuntimeClass
metadata:
  name: custom-kata-runtime
handler: kata
overhead:
  podFixed:
    cpu: "250m"

Wartość cpu: "250m" dodaje 0,25 vCPU stałego narzutu zasobnika, gdy Kubernetes planuje umieszczenie zasobnika i określa rozmiar jego cgroup. Dostosuj tę wartość w oparciu o oczekiwane zużycie procesora przez komponenty hosta Kata.

Najlepsze rozwiązania dotyczące zarządzania procesorem CPU

  • Jeśli węzeł zwykle ma dużo wolnych zasobów CPU, te rezerwacje mogą być niepotrzebne.
  • Jeśli węzły zwykle działają na granicy zużycia CPU, rezerwacja większa niż zero zapewnia, że zasobniki mogą działać bardziej niezawodnie.
    • Żądania procesora dla Poda pomagają planiście Kubernetes zarezerwować wystarczające zasoby węzła na potrzeby obciążenia. Pojemność zarezerwowana dla określonego obciążenia nie jest dostępna dla innych obciążeń w węźle.
  • Określ żądania CPU, które może obsłużyć Twoja infrastruktura. Jeśli dostępna pojemność działa blisko zera lub żądanie jest zbyt duże, uruchomienie obciążeń może zakończyć się niepowodzeniem.
  • Dopasuj żądania CPU do jego limitów. Żądania zasobów wpływają na szeregowanie w Kubernetes, ale shim Kata nie używa ich do określania rozmiaru maszyny wirtualnej poda. Limit CPU określa przydział vCPU maszyny wirtualnej poda. Jeśli nie zostanie zadeklarowany żaden limit procesora CPU, maszyna wirtualna zasobnika otrzyma jeden procesor wirtualny, a składniki hosta Kata nie mają limitu użycia procesora CPU.

Przykładowe deklaracje

RuntimeClass Obciążenie procesora CPU Żądanie lub limit CPU dla Pod Oczekiwane zachowanie
1 1 Płaszczyzna sterowania rezerwuje dwa CPU w węźle. Maszyna wirtualna poda otrzymuje jeden vCPU, a kontenery w podzie mogą używać maksymalnie jednego vCPU. Komponenty hosta Kata i maszyna wirtualna poda mogą łącznie używać maksymalnie dwóch jednostek CPU z puli zasobów zarezerwowanej dla węzła.
1 2.5 Płaszczyzna sterowania rezerwuje 3,5 procesorów CPU w węźle. Maszyna wirtualna poda otrzymuje 3 vCPU, ale kontenery w maszynie wirtualnej poda mogą używać do 2,5 vCPU. Komponenty hosta Kata i maszyna wirtualna poda mogą łącznie używać maksymalnie 3,5 CPU z zarezerwowanej pojemności węzła.
Żaden 1 Płaszczyzna sterowania rezerwuje jeden procesor CPU w węźle. Maszyna wirtualna poda ma przydzielony 1 vCPU, a kontenery w tej maszynie wirtualnej mogą używać maksymalnie 1 vCPU. Komponenty hosta Kata i maszyna wirtualna poda mogą łącznie używać maksymalnie jednego CPU z zarezerwowanej pojemności węzła. Żądanie procesora CPU udostępnia jeden procesor dla maszyny wirtualnej zasobnika.
1 Żaden Płaszczyzna sterowania rezerwuje jeden procesor CPU w węźle. Maszyna wirtualna poda ma jeden vCPU, a kontenery w tej maszynie wirtualnej mogą używać maksymalnie jednego vCPU. Komponenty hosta Kata i maszyna wirtualna poda mogą używać dowolnej mocy procesora dostępnej w węźle. Rezerwacja narzutowa udostępnia co najmniej jeden procesor CPU.

Zagadnienia dotyczące zabezpieczeń dotyczące piaskownicy zasobnika

Izolacja piaskownicowa poda oddziela obciążenia od pozostałych obciążeń oraz od hosta, ale nadal należy uwzględnić następujące zagrożenia bezpieczeństwa.

Uprzywilejowane pody

Niektóre obciążenia wymagają uprzywilejowanych podów. Można tworzyć uprzywilejowane zasobniki, ale urządzenia hosta nie są podłączane do zasobników.

Korzystanie z kontenerów uprzywilejowanych zapewnia dostęp główny na maszynie wirtualnej gościa, ale kontenery pozostają odizolowane od hosta.

Używaj uprzywilejowanych Podów tylko wtedy, gdy jest to konieczne, nawet przy użyciu mechanizmu piaskownicy Poda. Zezwalaj tylko zaufanym użytkownikom na zarządzanie uprzywilejowanymi zasobnikami.

Woluminy pamięci wykorzystujące ścieżkę hosta

Montowanie woluminów hostPath do zasobników Kata udostępnia część systemu plików hosta bezpośrednio kontenerowi i może osłabić izolację piaskownicy zasobnika. Zastosuj źródłowe wytyczne dotyczące zabezpieczeń do obciążeń korzystających z piaskownicy Pod.

Pliki w obszarze /dev są wyjątkiem, ponieważ są instalowane w kontenerze z systemu gościa zamiast systemu hosta. To zachowanie utrzymuje izolację zasobnika, gdy obciążenie wymaga tej ścieżki.

Ostrzeżenie

Unikaj hostPath woluminów pamięci masowej, chyba że wymagają ich używane przez Ciebie obciążenia.

Blokuj hostPath woluminy przy użyciu Azure Policy

Azure Policy zapewnia scentralizowane, spójne wymuszanie i zabezpieczenia składników klastra.

Usługa AKS udostępnia wbudowane definicje zasad , które wymuszają najlepsze rozwiązania. Przypisz zasadę zasobniki klastra Kubernetes powinny używać wyłącznie dozwolonych typów woluminów z efektem Deny oraz wyklucz hostPath z dozwolonych typów woluminów, aby blokować zasobniki, które próbują montować woluminy typu hostPath.

Dalsze kroki

Dowiedz się, jak wdrożyć izolację typu sandbox dla poda w usłudze AKS.