In Kubernetes-Clustern ist es entscheidend, die Ressourcenallokation für jeden Tenant vorab zu definieren, um ungewollte Ressourcenkonflikte und -erschöpfung zu verhindern.
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.
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.
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.
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.
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 NamespaceDieses 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.