Kubernetes ermöglicht die Verwaltung von Compute-Ressourcen für Container über Konzepte wie Anforderungen, Grenzen und Quotas. Diese Mechanismen sind essenziell, um die Effizienz und Stabilität von Anwendungen im Cluster zu gewährleisten.
requests)Anforderungen sind die Menge an Ressourcen, die ein Container benötigt, um garantiert zu starten. Wenn ein Container in einem Pod gestartet wird, reserviert der Kubernetes Scheduler die angeforderte Menge an CPU und Speicher. Dies stellt sicher, dass Anwendungen vorhersehbar laufen.
Angegeben in CPU-Einheiten. 1 entspricht einem vCPU/Kern
für Cloud-Provider oder einem Hyperthread für Bare-Metal.
Angegeben in Bytes. Unterstützt Einheiten sind E,
P, T, G, M,
K, Ei, Pi, Ti,
Gi, Mi, Ki.
limits)Die Grenzen definieren die maximal zulässige Ressourcennutzung für einen Container. Wenn ein Container diese Grenze überschreitet, kann er gedrosselt oder neugestartet werden, je nachdem, ob es sich um CPU- oder Speichergrenzen handelt.
Setzt die Obergrenze der CPU-Nutzung. Ein Container kann mehr CPU-Ressourcen nutzen, wenn das System ungenutzte Ressourcen hat.
Wenn der Speicherbedarf eines Containers die Grenze überschreitet, könnte der Container beendet und neugestartet werden, da dies ein Zeichen für ein Speicherleck oder eine schlechte Konfiguration sein kann.
Das ResourceQuota-Objekt limitiert den Gesamtverbrauch von Ressourcen pro Namespace. Es kann die Anzahl von Ressourcen wie Pods, Services, persistenten Volume Claims (PVCs) sowie CPU und Speicher auf Namespace-Ebene beschränken.
Quotas werden durch YAML- oder JSON-Konfigurationsdateien definiert
und mit kubectl auf den Cluster angewendet. Ein Quota zu
setzen, verhindert die Überschreitung der zugeteilten Ressourcen und
sorgt für Fair-Use-Policies innerhalb eines Teams oder Unternehmens.
apiVersion: v1
kind: ResourceQuota
metadata:
name: example-quota
namespace: example-namespace
spec:
hard:
pods: "10"
limits.cpu: "4"
limits.memory: "16Gi"
requests.cpu: "2"
requests.memory: "8Gi"Dies definiert ein Quota, das den Namespace
example-namespace begrenzt, sodass nicht mehr als 10 Pods
laufen können, die CPU-Anforderungen insgesamt 2 vCPUs und
Speicheranforderungen insgesamt 8 GiB nicht überschreiten, während die
Grenzen für CPU auf 4 vCPUs und für Speicher auf 16 GiB festgelegt
sind.
Kubernetes überwacht kontinuierlich den Ressourcenverbrauch im Verhältnis zu den definierten Quotas. Wenn eine Anforderung die Quota-Regeln verletzt, wird sie abgelehnt, und der Nutzer wird informiert. Überwachungswerkzeuge und -Dashboards können helfen, den Ressourcenverbrauch in Echtzeit zu verfolgen.
Die Kombination aus Anforderungen, Grenzen und Quotas ermöglicht eine feinkörnige Ressourcensteuerung in Kubernetes, welche für das Aufrechterhalten der Servicequalität und Betriebsstabilität in einem Multi-Tenant-Cluster unerlässlich ist.
Bei der Erstellung einer Konfiguration für einen Nginx-Container in Kubernetes legt man Ressourcenanforderungen und -grenzen fest, um sicherzustellen, dass der Container stabil läuft und die ihm zugewiesenen Ressourcen effizient nutzt.
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
containers:
- name: nginx
image: nginx:latest
resources:
requests:
cpu: "250m" # 250 millicores, entspricht 1/4 vCPU
memory: "64Mi" # 64 MiB
limits:
cpu: "500m" # 500 millicores, bis zu 1/2 vCPU
memory: "128Mi" # 128 MiBIn diesem Beispiel startet der Pod nginx-pod mit einem
Nginx-Container, der mindestens 250 millicores CPU und 64 MiB Speicher
garantiert bekommt. Die Grenzen sind so gesetzt, dass der Container bis
zu 500 millicores CPU und 128 MiB Speicher nutzen kann.
Um die Ressourcennutzung für einen Namespace, der Nginx-Pods ausführt, zu beschränken, können Quotas wie folgt definiert werden:
apiVersion: v1
kind: ResourceQuota
metadata:
name: nginx-quota
namespace: nginx-namespace
spec:
hard:
requests.cpu: "1" # Gesamt-CPU-Anforderungen von 1 vCPU für den Namespace
requests.memory: "256Mi" # Gesamt-Speicheranforderungen von 256 MiB
limits.cpu: "2" # CPU-Limits von 2 vCPUs für den Namespace
limits.memory: "512Mi" # Speicher-Limits von 512 MiB
pods: "4" # Maximale Anzahl von PodsHiermit wird ein Quota namens nginx-quota im Namespace
nginx-namespace gesetzt. Dies begrenzt die Anzahl der Pods
auf 4 und setzt Gesamt-CPU-Anforderungen von 1 vCPU und
Gesamt-Speicheranforderungen von 256 MiB, mit maximal erlaubten
Ressourcen von 2 vCPUs und 512 MiB für den Speicher.
| Ressourcenfeld | Unterpunkt | Bedeutung | Beispiel |
|---|---|---|---|
requests |
cpu |
Minimale CPU-Anforderung, die dem Container garantiert wird. | requests: cpu: "250m" bedeutet 250 Milli-CPUs (¼
CPU). |
requests |
memory |
Minimale Speicheranforderung, die dem Container garantiert wird. | requests: memory: "64Mi" reserviert 64 Mebibyte
Speicher. |
limits |
cpu |
Maximale CPU-Nutzung, die ein Container verwenden darf. Bei Überschreitung kann der Container gedrosselt werden. | limits: cpu: "1" bedeutet 1 volle CPU-Einheit. |
limits |
memory |
Maximale Speichermenge, die ein Container verwenden darf. Bei Überschreitung kann der Container neugestartet werden. | limits: memory: "256Mi" erlaubt dem Container bis zu
256 Mebibyte zu benutzen. |
limits |
ephemeral-storage |
Maximale Größe des temporären Speichers, den ein Container nutzen darf. | limits: ephemeral-storage: "1Gi" beschränkt den
temporären Speicher auf 1 Gibibyte. |
requests |
ephemeral-storage |
Mindestgröße des temporären Speichers, die dem Container garantiert wird. | requests: ephemeral-storage: "500Mi" sichert dem
Container 500 Mebibyte temporären Speicher zu. |
limits |
nvidia.com/gpu |
Maximale Anzahl an GPUs, die einem Container zugewiesen werden können (nur wenn GPU-Ressourcen verfügbar sind). | limits: nvidia.com/gpu: "2" weist zwei GPUs zu. |
requests |
nvidia.com/gpu |
Mindestanzahl an GPUs, die einem Container garantiert werden. | requests: nvidia.com/gpu: "1" sichert eine GPU zu. |
limits |
hugepages-<size> |
Maximale Menge an HugePages eines bestimmten Sizes, die ein Container nutzen darf. | limits: hugepages-2Mi: "100Mi" limitiert die Nutzung
von 2-MiB-HugePages auf 100 MiB. |
requests |
hugepages-<size> |
Minimale Menge an HugePages eines bestimmten Sizes, die einem Container garantiert werden. | requests: hugepages-2Mi: "50Mi" garantiert 50 MiB an
2-MiB-HugePages. |
limits |
pods |
Maximale Anzahl an Pods, die in einem Namespace erstellt werden können (nur in einem ResourceQuota Objekt). | limits: pods: "10" begrenzt die Anzahl der Pods in
einem Namespace auf 10. |
Die Werte für CPU-Anforderungen und -Grenzen können in Bruchteilen
einer CPU angegeben werden (mittels der Einheit m, wobei
1000m = 1 CPU) und für Speicher in
Binärpräfixen (z.B. Ki, Mi, Gi).
Für die GPU-Anforderungen und -Grenzen muss das entsprechende
Device-Plugin im Cluster installiert sein, um die Ressource
nvidia.com/gpu nutzen zu können. HugePages sind eine
Funktion des Linux-Kernels, die es erlaubt, große Speicherseiten zu
verwalten, die größer als die Standardgröße sind.