Erkennung von Container-Drift in Kubernetes mit Admission Controllern
Box-Ingenieure haben einen benutzerdefinierten Admission Controller und ein kubectl-Plugin entwickelt, um Laufzeitänderungen an Containern zu erkennen und Pod-Eviction-Richtlinien durchzusetzen.
Automatisch aus dem englischen Original übersetzt.
In einem Beitrag im Kubernetes Blog im Dezember 2021 beschrieben Ingenieure bei Box ein System, das sie entwickelt haben, um Container-Drift zu erkennen und zu verwalten, der durch interaktive Befehle verursacht wird. Das Team entwickelte einen benutzerdefinierten Admission Controller und ein entsprechendes kubectl-Plugin, um Pods zu identifizieren, die über kubectl exec oder attach geändert wurden, und automatische Eviction-Richtlinien durchzusetzen.
Was passiert ist
Box betreibt Hunderte von Microservices auf Kubernetes, um Datenströme im Petabyte-Bereich zu verarbeiten. Ihr Deployment-Workflow basiert auf GitOps und nutzt kube-applier, um deklarative Konfigurationen aus einem Git-Repository nach Code-Reviews und automatisierten Checks anzuwenden. Dieser Prozess stellt sicher, dass alle Änderungen an Produktionsumgebungen verfolgt, überprüft und konsistent mit dem im Code definierten gewünschten Zustand sind.
Entwickler können diese Kontrollen jedoch umgehen, indem sie interaktive Befehle wie kubectl exec verwenden, um laufende Container direkt zu modifizieren. Diese Ad-hoc-Änderungen erzeugen „Container-Drift“, bei dem sich der Live-Zustand eines Containers von seiner deklarierten Konfiguration unterscheidet. Solche Modifikationen untergraben Change-Control-Prozesse und ermöglichen es betroffenen Containern, ohne Aufsicht weiterhin Traffic in der Produktion zu bedienen.
Um diese Sicherheits- und Betriebslücke zu schließen, erstellte Box kube-exec-controller, eine benutzerdefinierte Kubernetes-Komponente, zusammen mit einem kubectl-Plugin namens kubectl pi. Dieses System erkennt, wenn Entwickler mit laufenden Containern interagieren, versieht die betroffenen Pods mit Labels und evictiert sie schließlich, um den deklarierten Zustand wiederherzustellen. Das Projekt wurde Open Source veröffentlicht, um anderen Teams zu helfen, ähnliche Risiken in ihren Clustern zu managen.
Wie es funktioniert
Die Lösung nutzt Kubernetes Admission Controller, die Anfragen an den API Server abfangen, bevor Objekte persistiert werden. Konkret verwendete das Team einen ValidatingAdmissionWebhook, so konfiguriert, dass er CONNECT-Operationen auf pods/exec- und pods/attach-Ressourcen überwacht. Wenn ein Entwickler einen interaktiven Befehl ausführt, sendet der Webhook die Anfrage zur Validierung an den kube-exec-controller-Service.

Der Controller blockiert die ursprüngliche Anfrage nicht, da eine sofortige Verweigerung das Debugging behindern würde. Stattdessen erlaubt er die Verbindung und versieht den Ziel-Pod asynchron mit Metadaten wie dem Benutzernamen des Interactors und einem Zeitstempel. Er protokolliert auch ein Warnereignis am Pod. Ein separater Prozess innerhalb des Controllers verfolgt einen Time-to-Live (TTL)-Timer für jeden gelabelten Pod. Sobald der TTL abläuft, evictiert der Controller den Pod. Eviction wird gegenüber Löschung bevorzugt, da sie PodDisruptionBudgets respektiert und so die Verfügbarkeit des Dienstes während des Bereinigungsprozesses gewährleistet.
Um Sichtbarkeit und Nutzbarkeit zu verbessern, entwickelte Box das kubectl pi-Plugin. Da Kubernetes-Ereignisse standardmäßig nur eine Stunde lang aufbewahrt werden, liest das Plugin die vom Controller angehängten Labels und Annotationen, um menschenlesbare Informationen über Pod-Interaktionen bereitzustellen. Es enthält einen get-Subbefehl zur Anzeige von Interaktionsdetails und einen extend-Subbefehl. Der extend-Befehl ermöglicht es Entwicklern, mehr Zeit vor der Eviction anzufordern, indem sie Pod-Annotationen aktualisieren, was den Eviction-Timer zurücksetzt, nachdem die Anfrage durch einen weiteren validierenden Webhook gegangen ist.
Wichtige Details
- Das System verwendet einen
ValidatingAdmissionWebhook, umpods/exec- undpods/attach-CONNECT-Anfragen abzufangen. - Betroffene Pods werden mit Metadaten versehen, einschließlich des Benutzernamens des Interactors und des Zeitstempels der ersten Interaktion.
- Pods werden nach einer vordefinierten TTL evictiert, die je nach Umgebung variiert (länger für Dev, kürzer für Produktion).
- Eviction respektiert PodDisruptionBudgets, um Serviceausfälle bei erzwungenen Neustarts zu verhindern.
- Das
kubectl pi-Plugin bietetget- undextend-Subbefehle zur Statusanzeige und zum Anfordern von TTL-Verlängerungen. - Das Projekt mit dem Namen
kube-exec-controllerwurde von Box auf GitHub als Open Source veröffentlicht.
Warum es wichtig ist
Für Teams, die Software auf Kubernetes entwickeln, ist die Integrität des deployeten Zustands entscheidend für Sicherheit und Zuverlässigkeit. Der interaktive Zugriff auf Container ist eine häufig notwendige Maßnahme für das Debugging, führt aber zu nicht protokollierten Änderungen, die zu Konfigurationsdrift führen können. Ohne Mechanismen zur Erkennung und Rückgängigmachung dieser Änderungen können Cluster Inkonsistenzen ansammeln, die die Fehlerbehebung erschweren und Sicherheitsrisiken erhöhen.
Dieser Ansatz zeigt, wie Admission Controller nicht nur zur Durchsetzung von Richtlinien, sondern auch für betriebliche Hygiene genutzt werden können. Durch die Automatisierung der Erkennung und Behebung von Drift können Teams notwendige Debugging-Zugriffe gewähren, während gleichzeitig sichergestellt wird, dass Produktionssysteme schließlich in ihren deklarierten, überprüften Zustand zurückkehren. Es balanciert Entwicklerflexibilität mit Plattform-Governance.
Die Verwendung von Eviction statt sofortiger Beendigung zeigt ein reifes Verständnis der Produktionsbedingungen. Die Respektierung von PodDisruptionBudgets stellt sicher, dass Sicherheitsmaßnahmen nicht versehentlich Ausfallzeiten verursachen. Dieses Muster ist auf jede Organisation anwendbar, die Kubernetes nutzt und strenges Change Management neben aktiven Entwicklungs- und Support-Workflows erfordert.
Was Sie tun können
- Bewerten Sie Ihre aktuellen Kubernetes-Sicherheitsrichtlinien, um festzustellen, ob interaktive Befehle wie
kubectl execuneingeschränkt sind. - Erwägen Sie die Implementierung eines validierenden Admission Webhooks, um
pods/exec- undpods/attach-Anfragen zu überwachen und zu protokollieren. - Definieren Sie klare TTL-Richtlinien für gedriftete Pods basierend auf der Umgebung, mit strengeren Grenzen für Produktionscluster.
- Verwenden Sie Pod-Eviction statt Löschung bei der Bereinigung gedrifteter Container, um Disruption Budgets zu respektieren.
- Entwickeln oder übernehmen Sie kubectl-Plugins, um Entwicklern Einsicht in die Pod-Interaktionshistorie und Eviction-Timer zu geben.
- Prüfen Sie das Open-Source-Projekt
kube-exec-controllerauf GitHub, um die Implementierungsdetails zu verstehen und sie an Ihre Bedürfnisse anzupassen.


