Generator Kubernetes ResourceQuota
Limity CPU, pamięci, podów i PVC dla namespace oraz domyślne wartości LimitRange dla kontenerów w gotowym YAML.
-
1Wprowadź dane
Wpisz treść, wklej tekst lub załaduj plik z dysku. -
2Kliknij przycisk
Narzędzie natychmiast przetworzy Twoje dane w przeglądarce. -
3Pobierz wynik
Skopiuj gotowy tekst lub zapisz plik na urządzeniu.
return "Wynik gotowy w 0.1s";
}
Małe litery, cyfry i myślniki (DNS-1123)
Suma gwarantowana (rdzenie lub m)
Suma limitów kontenerów
Jednostki: Mi, Gi, Ti
Jednostki: Mi, Gi, Ti
Pody w namespace
0 = brak wolumenów
Więcej limitów: pojemność, Service, ConfigMap, Secret
Puste pole = bez limitu (klucz nie trafi do YAML).
requests.storage
services
services.loadbalancers
configmaps
secrets
Wartości LimitRange na kontener
Musi być: request ≤ limit ≤ maks. Używane, gdy zaznaczysz LimitRange.
default.cpu
default.memory
defaultRequest.cpu
defaultRequest.memory
max.cpu
max.memory
Manifest dla namespace
Dokumenty: ResourceQuota + LimitRange. Zapisz jako plik i wdróż: kubectl apply -f resourcequota-production.yaml
CPU requests / limits
Pamięć requests / limits
Średnio na pod
limits ÷ 20 (maks. pody)
Pody z domyślnym LimitRange
Pierwsze skończy się: limits.cpu
Limits ÷ requests
CPU · pamięć
Uwaga: sprawdź ten punkt
- Przy domyślnych wartościach LimitRange (1 kontener na pod) zmieści się 16 podów, a limit podów to 20. Wcześniej skończy się limits.cpu.
resourcequota-production.yaml
Polecenia kubectl
| Klucz | Co ogranicza | Wartość |
|---|---|---|
| requests.cpu | Suma gwarantowanego CPU (requests) wszystkich podów | 4 vCPU (4 000m) |
| requests.memory | Suma zarezerwowanej pamięci (requests) | 8Gi (8 192 MiB) |
| limits.cpu | Suma limitów CPU wszystkich kontenerów | 8 vCPU (8 000m) |
| limits.memory | Suma limitów pamięci wszystkich kontenerów | 16Gi (16 384 MiB) |
| pods | Liczba podów w stanie innym niż zakończony | 20 |
| persistentvolumeclaims | Liczba PersistentVolumeClaim | 10 |
ResourceQuota działa na namespace; LimitRange nie zastępuje requests i limits w workloadach. Przetestuj wartości z realnym zużyciem.
Ściąga: jednostki CPU i pamięci w Kubernetes
| Zapis | Zasób | Ile to jest |
|---|---|---|
| 250m | CPU | 0,25 rdzenia (ćwierć vCPU) |
| 500m lub 0.5 | CPU | 0,5 rdzenia |
| 1 lub 1000m | CPU | 1 rdzeń (fizyczny lub wirtualny) |
| 256Mi | Pamięć | 268 435 456 B |
| 1Gi | Pamięć | 1 024 Mi = 1 073 741 824 B |
| 1G | Pamięć | 1 000 000 000 B ≈ 0,93 Gi (tu nieobsługiwane, użyj Gi) |
| 1Ti | Pamięć | 1 024 Gi = 1 099 511 627 776 B |
ResourceQuota a LimitRange
ResourceQuota ogranicza sumę zasobów i liczbę obiektów w całym namespace. LimitRange działa na pojedynczy kontener: wstawia domyślne requests i limits, gdy pod ich nie podaje, i odrzuca kontenery większe niż max. Zwykle używa się obu naraz: quota pilnuje budżetu zespołu, a LimitRange sprawia, że każdy pod da się do tego budżetu wliczyć.
Dlaczego pod zostaje odrzucony
Gdy quota obejmuje requests.cpu, limits.cpu, requests.memory lub limits.memory, każdy nowy pod musi mieć te wartości. Bez nich API odrzuci go błędem „failed quota … must specify …”. Pod nie powstanie też, gdy przekroczyłby pozostały budżet. Zużycie sprawdzisz w kubectl describe resourcequota (kolumny Used i Hard).
Jak liczymy pody z domyślnym LimitRange
Każdy z czterech progów quoty dzielimy przez wartość domyślną jednego kontenera i bierzemy najmniejszy wynik. Dla ustawień startowych: limits.cpu 8 ÷ 500m = 16, limits.memory 16Gi ÷ 512Mi = 32, requests.cpu 4 ÷ 250m = 16, requests.memory 8Gi ÷ 256Mi = 32. Zmieści się 16 podów, choć limit podów to 20. Kilka kontenerów w podzie lub własne wartości zmieniają wynik.
Dobór wartości i wdrożenia
Zacznij od realnego zużycia (kubectl top pods -n production, wymaga metrics-server). Requests ustaw blisko typowego zużycia, limits blisko szczytów. Zostaw zapas na rolling update: stare i nowe pody działają wtedy jednocześnie i obie wersje liczą się do quoty. Zmiana quoty lub LimitRange nie dotyka działających podów, tylko nowo tworzone.
Oceń to narzędzie:
Powiązane narzędzia
Inne narzędzia, które mogą Ci się przydaćGenerator Kubernetes ResourceQuota i LimitRange
Kubernetes ResourceQuota ogranicza łączne zasoby całego namespace: sumę requests i limits CPU oraz pamięci, liczbę podów, PVC i wybranych obiektów. LimitRange działa na pojedynczy kontener i wstawia mu domyślne requests i limits, gdy pod ich nie deklaruje. Generator buduje oba manifesty w jednym pliku YAML, sprawdza spójność wartości i liczy, ile podów z domyślnymi ustawieniami faktycznie zmieści się w quocie.
ResourceQuota kontra LimitRange
| Obiekt | Działa na | Przykład (ustawienia startowe) |
|---|---|---|
| ResourceQuota | cały namespace | łącznie 4 CPU requests, 8 CPU limits, 16Gi pamięci limits, 20 podów |
| LimitRange | pojedynczy kontener | domyślnie request 250m i limit 500m CPU, maks. 2 CPU na kontener |
Co trafia do manifestu YAML
Plik zawiera dwa dokumenty rozdzielone ---: ResourceQuota o nazwie <namespace>-quota i LimitRange o nazwie <namespace>-limits. LimitRange dodajesz lub pomijasz jednym polem wyboru. Nazwa namespace musi spełniać regułę DNS-1123: małe litery, cyfry i myślniki, najwyżej 63 znaki.
| Klucz w spec.hard | Pole w formularzu | Wymagane |
|---|---|---|
requests.cpu | CPU requests | tak |
limits.cpu | CPU limits | tak |
requests.memory | Pamięć requests | tak |
limits.memory | Pamięć limits | tak |
pods | Maks. pody | tak, minimum 1 |
persistentvolumeclaims | Maks. PVC | tak, 0 blokuje tworzenie PVC |
requests.storage | Suma pojemności PVC | nie |
services, services.loadbalancers | Maks. Service, Maks. LoadBalancer | nie |
configmaps, secrets | Maks. ConfigMap, Maks. Secret | nie |
CPU podajesz w rdzeniach (4, 0.5) albo milirdzeniach (500m), pamięć jako liczbę całkowitą z jednostką Mi, Gi lub Ti. Jednostki dziesiętne G i M nie są przyjmowane, bo 1G to tylko około 0,93Gi i łatwo o pomyłkę. LimitRange dostaje sekcje default, defaultRequest i max dla typu Container. Gotowe zestawy Mały (2/4 vCPU, 10 podów), Średni (4/8 vCPU, 20 podów) i Duży (16/32 vCPU, 100 podów) wypełniają główne limity jednym kliknięciem. Wynik kopiujesz albo pobierasz jako resourcequota-<namespace>.yaml, a obok dostajesz polecenia kubectl do wdrożenia i sprawdzenia zużycia.
Dlaczego to ważne
- chroni klaster przed wyczerpaniem zasobów przez jeden namespace,
- wymusza deklarowanie requestów i limitów,
- pozwala sprawiedliwie dzielić zasoby między zespoły.
Jak działa quota w Kubernetes i co sprawdza generator
ResourceQuota działa na poziomie namespace i jest sprawdzana przez kontroler admission w momencie tworzenia lub aktualizacji poda. API server sumuje deklaracje wszystkich podów w namespace i porównuje je z wartościami hard. Jeśli suma przekroczy którąkolwiek z granic, operacja jest odrzucana. Mechanizm można zapisać wzorem: suma requests.cpu wszystkich podów ≤ hard.requests.cpu, suma limits.cpu ≤ hard.limits.cpu, liczba podów ≤ hard.pods. Analogicznie dla pamięci i pozostałych kluczy.
LimitRange działa na poziomie pojedynczego kontenera. Przy przyjęciu poda kontroler wstawia domyślne wartości, jeśli kontener ich nie zadeklarował, i odrzuca kontener większy niż max. W ustawieniach startowych kontener bez własnych wartości dostaje request 250m CPU i 256Mi pamięci oraz limit 500m CPU i 512Mi. Te liczby wliczają się potem do sum w ResourceQuota. Gdy LimitRange ma tylko default bez defaultRequest, Kubernetes przyjmuje request równy limitowi.
Generator nie łączy się z klastrem, ale pilnuje arytmetyki. Zablokuje wynik, jeśli w LimitRange domyślny request przekracza domyślny limit albo limit przekracza maksimum na kontener. Ostrzeże, gdy requests w quocie są wyższe niż limits, gdy maksymalny kontener nie zmieści się w limits całego namespace i gdy limit podów jest nieosiągalny przy wartościach domyślnych. Bez LimitRange przypomni, że pod bez requests i limits zostanie odrzucony przez quotę. Kafelki pokazują też średni przydział na pod (limits ÷ maks. pody) i stosunek limits do requests.
Przykład krok po kroku: ile podów zmieści się w quocie
- W namespace production tworzysz ResourceQuota z wartościami hard: requests.cpu: "4", requests.memory: 8Gi, limits.cpu: "8", limits.memory: 16Gi, pods: "20" i persistentvolumeclaims: "10".
- Dodajesz LimitRange z defaultRequest 250m CPU i 256Mi, default 500m CPU i 512Mi oraz max 2 CPU i 2Gi. Każdy kontener bez deklaracji zabiera 0,25 CPU z puli requests.cpu i 0,5 CPU z puli limits.cpu.
- Generator dzieli każdy z czterech progów przez wartość jednego kontenera: requests.cpu 4000m ÷ 250m = 16, limits.cpu 8000m ÷ 500m = 16, requests.memory 8192Mi ÷ 256Mi = 32, limits.memory 16384Mi ÷ 512Mi = 32. Decyduje najmniejszy wynik, czyli 16.
- Wdrażasz 16 podów po jednym kontenerze. Suma requests.cpu wynosi 16 × 250m = 4000m, czyli równo 4 CPU, a suma limits.cpu 16 × 500m = 8 CPU. Obie są równe wartościom hard, więc quota przepuszcza.
- Siedemnasty pod podniósłby sumy do 4250m requests i 8500m limits, więc API server go odrzuci, choć limit 20 podów nie został osiągnięty. Generator pokazuje to w uwagach: zmieści się 16 podów, wcześniej skończy się limits.cpu.
- Aby przyjąć 20 podów, podnieś quotę do requests.cpu 5 i limits.cpu 10 (5000m ÷ 250m = 20, 10000m ÷ 500m = 20) albo zmniejsz domyślne wartości kontenera do 200m request i 400m limit (4 CPU ÷ 20 i 8 CPU ÷ 20). Limit kontenera nadal musi być większy lub równy jego requestowi.
ResourceQuota i LimitRange – dane referencyjne z przykładu
| Parametr | ResourceQuota (namespace) | LimitRange (kontener) |
|---|---|---|
| CPU requests | 4 | 250m (defaultRequest) |
| CPU limits | 8 | 500m (default), maks. 2 |
| Pamięć requests | 8Gi | 256Mi (defaultRequest) |
| Pamięć limits | 16Gi | 512Mi (default), maks. 2Gi |
| Pody | 20 | nie dotyczy |
| Średnio na pod (limits ÷ 20) | 400m CPU i 819 MiB | – |
| Stosunek limits do requests | 2× CPU, 2× pamięć | 2× (500m wobec 250m) |
| Pody z domyślnym LimitRange | 16 z 20 | przy jednym kontenerze na pod |
| 20 podów z wartościami domyślnymi | 5 CPU requests i 10 CPU limits | przekracza quotę 4 i 8 CPU |
Praktyczne wskazówki przed wdrożeniem quota
- Najpierw policz budżet zespołu: ile CPU i pamięci ma przypadać na namespace. Dopiero potem wpisz wartości do ResourceQuota. Limitów z innego środowiska nie kopiuj bez przeliczenia.
- Ustawiaj LimitRange razem z ResourceQuota. Sam LimitRange nie ograniczy sumy w namespace, a sama quota nie wstawi wartości do kontenerów, które ich nie mają.
- Regularnie porównuj zużycie z wartościami hard. Zbliżanie się do limitu requests.cpu lub limits.cpu oznacza, że kolejne wdrożenia mogą być odrzucane.
- Quota ustawiona równo z obecnym zużyciem nie zmieści rolloutów ani dodatkowych replik, bo przy rolling update stare i nowe pody liczą się jednocześnie. Zostaw zapas.
- Testuj politykę na stagingu. Sprawdź, czy domyślne wartości z LimitRange nie powodują przekroczenia quoty przy typowej liczbie podów, i dopiero potem przenieś YAML na produkcję.
Czego nie uwzględnia generator
- Pojemność klastra: ResourceQuota to limit logiczny w namespace, a nie gwarancja, że węzły mają tyle CPU i pamięci. Scheduler może nie umieścić poda nawet przy niewykorzystanej quocie.
- Rzeczywiste zużycie: narzędzie pracuje na deklaracjach. Nie zna metryk i nie podpowie, czy wartość hard pasuje do realnego profilu aplikacji.
- Kilka kontenerów w podzie: wyliczenie „pody z domyślnym LimitRange” zakłada jeden kontener na pod. Sidecar dostaje własne wartości domyślne, więc pod z dwoma kontenerami zużywa dwa razy więcej, a init containers również wpływają na efektywny request poda.
- Autoskalowanie: HPA tworzy nowe pody pod obciążeniem. W szczycie liczba replik rośnie i może wyczerpać quotę, czego statyczny manifest nie przewidzi.
Najczęstsze pytania
Co się stanie, gdy przekroczysz ResourceQuota?
Utworzenie nowego poda zostanie odrzucone błędem „exceeded quota” z informacją, ile zasobu zażądano, ile jest zużyte i jaki jest limit. Działające pody pracują dalej, a nowe przejdą, gdy zwolnią się zasoby albo podniesiesz quotę.
Po co requests i limits osobno?
Requests wpływają na planowanie (scheduling), limits na maksymalne zużycie kontenera. Limit musi być większy lub równy requestowi.
Czy LimitRange wymusza limity?
Wstawia domyślne wartości kontenerom bez deklaracji i odrzuca kontenery większe niż max. Generator ustawia sekcje default, defaultRequest i max; minimum (min) trzeba dopisać ręcznie, jeśli go potrzebujesz.
Jak sprawdzić, ile zasobów zużywa ResourceQuota w namespace?
Poleceniem kubectl describe resourcequota production-quota -n production. Kolumna Used pokazuje bieżące sumy dla requests.cpu, limits.cpu, requests.memory i innych kluczy, a Hard wartości maksymalne.
Czy ResourceQuota ogranicza liczbę ConfigMap i Secretów?
Tak, kluczami configmaps i secrets; generator obsługuje też services i services.loadbalancers. Inne typy obiektów ogranicza się kluczami w formacie count/<zasób>.<grupa>, np. count/deployments.apps.
Czy LimitRange działa na już istniejące pody?
Nie, działa w momencie przyjęcia nowego poda. Istniejące pody zachowują swoje ustawienia, dopóki nie zostaną odtworzone, np. przy kolejnym rolloucie.