43 Kubernetes ResourceQuota und Namespaces

In Kubernetes-Clustern ist es entscheidend, die Ressourcenallokation für jeden Tenant vorab zu definieren, um ungewollte Ressourcenkonflikte und -erschöpfung zu verhindern.

43.1 ResourceQuota-Objekt

Das ResourceQuota-Objekt ermöglicht es Administratoren, die Ressourcennutzung pro Namespace zu beschränken. Es legt Grenzen für die Menge und Art der Ressourcen fest, die Pods, PersistentVolumeClaims und andere Ressourcen in einem bestimmten Namespace verbrauchen können. Dies verhindert, dass ein einzelner Tenant zu viele Clusterressourcen beansprucht und sorgt für eine faire Verteilung der Ressourcen.

43.2 Namespaces als virtuelle Cluster

Namespaces sind eine Schlüsselkomponente in Kubernetes, die es erlauben, eine zusätzliche Isolationsebene zwischen den verschiedenen Benutzern des Clusters zu schaffen. Sie fungieren als virtuelle Cluster innerhalb eines physischen Kubernetes-Clusters und helfen dabei, Namenskonflikte zu vermeiden und die Kapazitätsverwaltung zu vereinfachen.

43.3 Funktionsweise von Resource Quota Limits

43.3.1 Anfragenverarbeitung im Kubernetes API-Server

Alle Erstellungs-, Lösch- und Aktualisierungsanfragen für Systemressourcen werden über den Kubernetes API-Server geleitet. Der API-Server nutzt Admission Controller, um Anfragen zu prüfen und gegebenenfalls zu filtern. Diese Controller können spezifische Regeln und Richtlinien durchsetzen, bevor Ressourcen im Cluster erstellt oder modifiziert werden.

43.3.2 Kubernetes Quota Admission Controller

Der Kubernetes Quota Admission Controller spielt eine wichtige Rolle bei der Verwaltung von ResourceQuotas. Wenn ein neues Objekt in einem Namespace erstellt wird, überwacht der Quota Admission Controller die Schöpfung dieser Ressourcen und führt eine Kontrolle durch. Er verfolgt die aktuelle Ressourcennutzung und stellt sicher, dass diese die im ResourceQuota definierten Grenzen nicht überschreitet. Falls die Erstellung eines neuen Objekts die festgelegten Quoten überschreiten würde, lehnt der Controller die Anfrage ab.

Durch die kontinuierliche Überwachung und Nachverfolgung der Ressourcennutzung können Administratoren sicherstellen, dass der Cluster effizient und fair genutzt wird, und vermeiden, dass Workloads anderer Tenants durch unerwartet hohe Ressourcennutzung beeinträchtigt werden.

43.4 Beispiel für ein ResourceQuota-Manifest

Ein typisches ResourceQuota-Manifest in YAML-Format für einen Kubernetes-Namespace könnte wie folgt aussehen:

apiVersion: v1
kind: ResourceQuota
metadata:
  name: example-quota
  namespace: example-namespace
spec:
  hard:
    requests.cpu: "20" # Gesamt-CPU-Anforderungen für den Namespace begrenzen
    requests.memory: "10Gi" # Gesamtspeicheranforderungen für den Namespace begrenzen
    limits.cpu: "40" # CPU-Grenzen für den Namespace festlegen
    limits.memory: "20Gi" # Speichergrenzen für den Namespace festlegen
    pods: "10" # Maximalzahl der Pods im Namespace
    services: "5" # Maximalzahl der Services im Namespace
    persistentvolumeclaims: "4" # Maximalzahl der PVCs im Namespace
    secrets: "10" # Maximalzahl der Secrets im Namespace
    configmaps: "10" # Maximalzahl der ConfigMaps im Namespace

Dieses Manifest definiert eine Ressourcenquote für den example-namespace. Die hard Sektion definiert die maximalen Ressourcenlimits für verschiedene Ressourcentypen. Zum Beispiel dürfen in diesem Namespace insgesamt nicht mehr als 20 CPU-Einheiten und 10 GiB Speicher in Form von Anforderungen (requests) und nicht mehr als 40 CPU-Einheiten und 20 GiB Speicher als Limits für Pods angefordert werden. Außerdem wird die Anzahl der erlaubten Pods auf 10 und die Anzahl der Services auf 5 beschränkt.

Nachdem dieses Manifest mit kubectl apply -f angewendet wurde, überwacht der Kubernetes Quota Admission Controller die Erstellung neuer Ressourcen und stellt sicher, dass sie die in der Quota definierten Werte nicht überschreiten. Wenn eine Anforderung die festgelegten Grenzen übersteigt, wird sie mit einer Fehlermeldung zurückgewiesen.