42 Ressourcenanforderungen, -grenzen und Quotas in Kubernetes

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.

42.1 Ressourcenanforderungen und -grenzen

42.1.1 Anforderungen (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.

42.1.1.1 CPU-Anforderungen

Angegeben in CPU-Einheiten. 1 entspricht einem vCPU/Kern für Cloud-Provider oder einem Hyperthread für Bare-Metal.

42.1.1.2 Speicheranforderungen

Angegeben in Bytes. Unterstützt Einheiten sind E, P, T, G, M, K, Ei, Pi, Ti, Gi, Mi, Ki.

42.1.2 Grenzen (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.

42.1.2.1 CPU-Grenzen

Setzt die Obergrenze der CPU-Nutzung. Ein Container kann mehr CPU-Ressourcen nutzen, wenn das System ungenutzte Ressourcen hat.

42.1.2.2 Speichergrenzen

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.

42.2 Quotas

42.2.1 ResourceQuota

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.

42.2.1.1 Festlegen von Quotas

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.

42.2.2 Beispiele für Quotas

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.

42.2.3 Quota-Überwachung und -Enforcement

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.

42.3 Anwendung von Ressourcenanforderungen, -grenzen und Quotas am Beispiel von Nginx in Kubernetes

42.3.1 Ressourcenanforderungen und -grenzen für Nginx

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 MiB

In 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.

42.3.2 Quotas für einen Namespace mit Nginx-Pods

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 Pods

Hiermit 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.