Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Keine Neustarts, keine Ausfälle: Pod-Ressourcen nahtlos per In-Place-Resizing anpassen

By Chimbu ChinnaduraiJul 23, 20255 min read

Diese Seite ist auch in English, Español, Français, Italiano, 日本語 und Português verfügbar.

Foto von Andrii Yalanskyi via Shutterstock

Die Ressourcennutzung zu optimieren und gleichzeitig die Anwendungsleistung stabil zu halten, ist in Kubernetes eine Daueraufgabe. Den Ressourcenbedarf einer App von Anfang an richtig einzuschätzen, ist komplex – und der klassische Ansatz, CPU- oder Speicherressourcen anzupassen, kann Betriebsabläufe stören, weil Pods neu erstellt werden müssen und laufende Workloads beeinträchtigt werden können. Solche Unterbrechungen führen zu Service-Einbußen, Downtime und operativem Mehraufwand. Genau hier setzen Plattformen wie PerfectScale an: Sie analysieren die Ressourcennutzung über Workloads hinweg kontinuierlich und ermitteln optimale Allokationen, bevor disruptive Änderungen überhaupt nötig werden.

Viele Anwender haben lange darauf gewartet, Kubernetes-Pods ohne Neustart skalieren zu können. Seit Kubernetes v1.27 ist das Feature in Alpha verfügbar und mit v1.33 in den Beta-Status übergegangen. Es heißt InPlacePodVerticalScaling und das Feld resources in den Containern eines Pods erlaubt nun Änderungen für cpu- und memory-Ressourcen. Diese lassen sich einfach per Patch der laufenden Pod-Spezifikation anpassen.

Vorteile des In-Place-Resizings von Pod-Ressourcen:

  • Weniger Downtime: Vermeidet Ausfallzeiten und potenziellen Datenverlust durch Pod-Neustarts und sorgt so für reibungslosen Betrieb und unterbrechungsfreien Service für Ihre Nutzer.
  • Höhere Effizienz: Right-Sizing Ihrer Pods ist entscheidend für eine optimale Ressourcennutzung. InPlacePodVerticalScaling erlaubt eine punktgenaue Zuteilung – ohne Overprovisioning (Geldverschwendung) oder Underprovisioning (Performance-Einbußen).
  • Mehr Agilität: Dynamisches Skalieren ermöglicht es Ihnen, sofort auf veränderte Anforderungen zu reagieren. Ob plötzlicher Traffic-Anstieg oder geplanter Batch-Job – Ihre Pods passen ihre Ressourcennutzung nahtlos an und liefern stets optimale Performance und Reaktionsfähigkeit.
  • Kostenersparnis: Indem Overprovisioning vermieden und die Ressourcennutzung optimiert wird, schlägt sich InPlacePodVerticalScaling unmittelbar in Kosteneinsparungen nieder – besonders in Cloud-Umgebungen, in denen pro Ressourceneinheit abgerechnet wird.
  • Einfacheres Management: Komplexe Deployments zu verwalten ist anspruchsvoll – InPlacePodVerticalScaling vereinfacht den Prozess, indem manuelle Neustarts entfallen und ein neuer Ansatz für das Ressourcenmanagement geboten wird.

In diesem Blogbeitrag zeige ich Ihnen, wie Sie In-Place-Resizing von Pod-Ressourcen ausprobieren können. Das Feature befindet sich aktuell mit Kubernetes v1.33 in der Beta-Phase und wird nicht für den Produktiveinsatz empfohlen. Die Kubernetes-Community arbeitet weiter daran, das Feature zu härten, die Performance zu verbessern und es produktionsreif zu machen.

In-Place-Resizing von Pod-Ressourcen in der Praxis

Das Feature InPlacePodVerticalScaling ist in Clustern mit Version v1.33 standardmäßig aktiviert. Sie können es in einem minikube-Cluster mit folgendem Befehl explizit aktivieren oder das entsprechende Feature Gate in Ihrem Managed-Kubernetes-Cluster einschalten, falls es dort noch nicht aktiv ist.

minikube start --feature-gates=InPlacePodVerticalScaling=true

Deployen wir einen Beispiel-Pod im Cluster. Die neue restartPolicy in der Pod-Spezifikation gibt Ihnen die Kontrolle darüber, wie Container beim Resizing behandelt werden.

In der folgenden Beispielkonfiguration für Speicherressourcen legt die resizePolicy fest, dass Änderungen an der Speicherzuweisung einen Container-Neustart erfordern, während dies für CPU-Ressourcen nicht nötig ist.

Ob ein Container neu gestartet wird, hängt davon ab, ob die Anwendung die aktualisierten Ressourcen ohne Neustart nutzen kann. Ist beispielsweise die Speichernutzung kritisch für den Betrieb einer Anwendung, sorgt ein Neustart bei Speicheränderungen dafür, dass die Anwendung mit der korrekten Speichermenge startet. So lassen sich potenzielle Probleme oder Fehlfunktionen vermeiden.

cat <<EOF | kubectl apply -f -
---
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: nginx
  name: nginx
spec:
  containers:
  - image: nginx
    name: nginx
    resizePolicy:
    - resourceName: "memory"
      restartPolicy: "RestartContainer"
    - resourceName: "cpu"
      restartPolicy: "NotRequired"
    resources:
      limits:
        cpu: "300m"
        memory: "1Gi"
      requests:
        cpu: "100m"
        memory: "500Mi"
EOF

Warten Sie, bis der Pod in den Status "Running" wechselt, und sehen Sie sich die Pod-Konfiguration an. Im Pod-Status wurde unter containerStatuses ein neues Feld allocatedResources ergänzt, das die aktuell den Containern des Pods zugewiesenen Node-Ressourcen abbildet.

Zusätzlich gibt es im Container-Status ein neues Feld resources, das die tatsächlich konfigurierten Resource-Requests und -Limits der laufenden Container so wiedergibt, wie sie von der Container-Runtime gemeldet werden.

CPU-Resize

Passen wir die CPU-Ressourcen des Pods mit folgendem Patch-Befehl an und beobachten die Resize-Operation. Änderungen an Pod-Ressourcen müssen jetzt über die resize-Subresource des Pods erfolgen; kubectl-Versionen ab v1.32 unterstützen dieses Argument.

kubectl patch pod nginx --subresource resize --patch '{"spec": {"containers": [{"name":"nginx", "resources":{"requests": {"cpu" :"300m"},"limits": {"cpu" :"500m"}}}]}}'

Der Status einer Resize-Operation wird nun über zwei Pod-Conditions abgebildet:

  • PodResizePending: Zeigt an, dass das Kubelet das Resizing nicht sofort gewähren kann (z. B. reason: Deferred bei vorübergehender Nichtverfügbarkeit, reason: Infeasible, wenn es auf dem Node nicht möglich ist).
  • PodResizeInProgress: Zeigt an, dass das Resizing akzeptiert wurde und gerade angewendet wird. Fehler in dieser Phase werden in der Message dieser Condition mit reason: Error gemeldet.

Die Community hat den Pod Lifecycle Event Generator (PLEG) des Kubelets verbessert, sodass Kubelet in der Beta-Phase deutlich schneller auf Resizes reagieren und sie abschließen kann. Gelegentlich kann es jedoch zu einer Race Condition mit anderen Pod-Updates kommen. Das kann die Aktivierung des Resizings verzögern, und die aktualisierten Container-Ressourcen erscheinen unter Umständen erst mit etwas Verzögerung im Pod-Status.

Memory-Resize

Weiter geht es mit den Anpassungen der Memory-Ressourcen – der Container wird gemäß restartPolicy neu gestartet.

kubectl patch pod nginx --subresource resize --patch '{"spec": {"containers": [{"name":"nginx", "resources":{"requests": {"memory" :"700Mi"}}}]}}'

Der Screenshot zeigt den erfolgreichen Abschluss der Resize-Operation und den Container-Neustart 🚀.

Auch wenn das Feature noch reift, liefern Plattformen wie PerfectScale bereits produktionsreife Optimierungs-Workflows – mit automatisiertem Ressourcenmanagement, das Sicherheit, Performance und Kosteneffizienz vereint. Folgen Sie den Schritten in diesem Blogbeitrag, um es selbst auszuprobieren und die Vorteile unmittelbar zu erleben.

Ich hoffe, dieser Blogbeitrag war hilfreich. Weiterführende Informationen finden Sie in den folgenden Ressourcen: