7 Best Container Practices von Google

Hinweis perev. : Der Autor des Originalartikels ist Théo Chamley, ein Google Cloud Architect. In dieser Veröffentlichung für den Google Cloud-Blog präsentierte er einen kurzen Auszug aus der detaillierteren Verwaltung seines Unternehmens mit dem Titel " Best Practices for Operating Containers ". Darin sammelten Google-Experten die Best Practices für den Betrieb von Containern im Zusammenhang mit der Verwendung der Google Kubernetes Engine und berührten nicht nur eine Vielzahl von Themen: von der Sicherheit über die Überwachung bis hin zum Journaling. Welche Container-Praktiken sind für Google am wichtigsten?



Die Kubernetes Engine (Kubernetes-basierter Dienst zum Ausführen von Containeranwendungen in der Google Cloud - ca. übersetzt ) ist eine der besten Möglichkeiten zum Ausführen von Workloads, die skaliert werden müssen. Kubernetes stellt den reibungslosen Betrieb der meisten Anwendungen sicher, wenn sie containerisiert sind. Wenn Sie jedoch möchten, dass die Anwendung einfach zu verwalten ist und Kubernetes optimal nutzen kann, müssen Sie die Best Practices befolgen. Sie vereinfachen den Betrieb der Anwendung, ihre Überwachung und das Debuggen sowie die Sicherheit.

In diesem Artikel werden wir eine Liste der Dinge durchgehen, die Sie wissen und tun müssen, um Container in Kubernetes effizient zu funktionieren. Wer sich mit den Details befassen möchte, sollte das Material mit den Best Practices für den Betrieb von Containern lesen und auf unseren früheren Container-Montageposten achten.

1. Verwenden Sie native Containermechanismen für die Protokollierung


Wenn die Anwendung in einem Kubernetes-Cluster ausgeführt wird, wird für Protokolle nicht viel benötigt. Ein zentrales Protokollierungssystem ist wahrscheinlich bereits in den von Ihnen verwendeten Cluster integriert. Bei Verwendung der Kubernetes Engine ist die Stackdriver-Protokollierung dafür verantwortlich. ( Hinweis : Wenn Sie Ihre eigene Installation von Kubernetes verwenden, empfehlen wir Ihnen, sich unsere Open Source-Lösung - loghouse - genauer anzusehen .) Machen Sie Ihr Leben nicht komplizierter und verwenden Sie die nativen Mechanismen zum Protokollieren von Containern. Schreiben Sie die Protokolle in stdout und stderr - sie werden automatisch empfangen, gespeichert und indiziert.

Bei Bedarf können Sie auch Protokolle im JSON-Format schreiben. Dieser Ansatz erleichtert das Hinzufügen von Metadaten. Und mit ihnen in Stackdriver Logging können die Protokolle anhand dieser Metadaten durchsucht werden.

2. Stellen Sie sicher, dass die Behälter zustandslos und unveränderlich sind


Damit Container in einem Kubernetes-Cluster ordnungsgemäß funktionieren, müssen sie zustandslos und unveränderlich sein. Wenn diese Bedingungen erfüllt sind, kann Kubernetes seine Aufgabe erfüllen und bei Bedarf Anwendungsentitäten erstellen und zerstören.

Statuslos bedeutet, dass jeder Status (persistente Daten jeglicher Art) außerhalb des Containers gespeichert wird. Je nach Bedarf können verschiedene Arten von externem Speicher beteiligt sein: Cloud-Speicher , persistente Festplatten , Redis , Cloud SQL oder andere verwaltete Datenbanken. ( Anmerkung übersetzen : Weitere Informationen hierzu finden Sie in unserem Artikel „ Operatoren für Kubernetes: Ausführen von Stateful-Anwendungen “.)

Unveränderlich bedeutet, dass der Container während seiner Lebensdauer nicht geändert wird: keine Updates, Patches, Konfigurationsänderungen. Wenn Sie den Anwendungscode aktualisieren oder einen Patch anwenden müssen, erstellen Sie ein neues Image und stellen Sie es bereit. Es wird empfohlen, die Containerkonfiguration (Port zum Abhören, Optionen für die Laufzeit usw.) nach außen zu verschieben - in Secrets und ConfigMaps . Sie können aktualisiert werden, ohne dass ein neues Container-Image erstellt werden muss. Mit Cloud Build können Sie auf einfache Weise Pipelines mit Image-Assembly erstellen. ( Hinweis : Zu diesem Zweck verwenden wir das Open Source-Tool dapp .)


Beispiel für die Aktualisierung der Bereitstellungskonfiguration in Kubernetes mithilfe von ConfigMap, das in Pods als Konfiguration bereitgestellt wird

3. Vermeiden Sie privilegierte Container


Sie führen keine Anwendungen als Root auf Ihren Servern aus, oder? Wenn ein Angreifer in die Anwendung einbricht, erhält er Root-Zugriff. Die gleichen Überlegungen gelten für das Ausführen nicht privilegierter Container. Wenn Sie die Einstellungen auf dem Host ändern möchten, können Sie dem Container mithilfe der Option securityContext in Kubernetes spezifische Funktionen zuweisen. Wenn Sie sysctls ändern müssen , verfügt Kubernetes über eine separate Anmerkung . Versuchen Sie im Allgemeinen, die Verwendung von Init- und Sidecar-Containern zu maximieren, um solche privilegierten Vorgänge auszuführen. Sie müssen weder für internen noch für externen Datenverkehr zugänglich sein.

Wenn Sie einen Cluster verwalten, können Sie die Pod-Sicherheitsrichtlinie verwenden , um die Verwendung privilegierter Container einzuschränken.

4. Vermeiden Sie es, als root zu laufen


Wir haben bereits über privilegierte Container gesprochen, aber es ist noch besser, wenn Sie darüber hinaus keine Anwendungen im Container als Root ausführen. Wenn ein Angreifer eine Remote-Sicherheitsanfälligkeit mit der Fähigkeit findet, Code in einer Anwendung mit Root-Rechten auszuführen. Danach kann er den Container über eine noch unbekannte Sicherheitsanfälligkeit beenden. Er erhält Root auf dem Host.

Der beste Weg, dies zu vermeiden, besteht darin, zunächst nichts als Root auszuführen. Dazu können Sie die USER Direktive in der Dockerfile oder runAsUser in Kubernetes verwenden. Der Clusteradministrator kann die Durchsetzung auch mithilfe der Pod-Sicherheitsrichtlinie konfigurieren.

5. Machen Sie die Anwendung einfach zu überwachen.


Wie die Protokollierung ist auch die Überwachung ein wesentlicher Bestandteil der Verwaltung der Anwendung. Eine beliebte Überwachungslösung in der Kubernetes-Community ist Prometheus , ein System, das Pods und Dienste, die überwacht werden müssen, automatisch erkennt. ( Hinweis : Siehe auch unseren ausführlichen Bericht zur Überwachung mit Prometheus und Kubernetes.) Stackdriver kann Kubernetes-Cluster überwachen und enthält eine eigene Version von Prometheus zur Überwachung von Anwendungen.


Kubernetes Dashboard in Stackdriver

Prometheus erwartet, dass die Anwendung Metriken an den HTTP-Endpunkt weiterleitet. Hierfür stehen Prometheus-Client-Bibliotheken zur Verfügung. Andere Tools wie OpenCensus und Istio verwenden dasselbe Format.

6. Stellen Sie den Integritätsstatus der Anwendung zur Verfügung.


Die Verwaltung einer Anwendung in der Produktion wird durch die Fähigkeit unterstützt, ihren Status dem gesamten System zu melden. Läuft die Anwendung? Ist es in Ordnung? Ist es bereit, Verkehr zu empfangen? Wie verhält er sich? Die häufigste Methode zur Lösung dieses Problems ist die Implementierung von Integritätsprüfungen . Kubernetes hat zwei Arten: Lebendigkeits- und Bereitschaftssonden .

Für eine Lebendigkeitsprüfung muss die Anwendung über einen HTTP-Endpunkt verfügen, der eine Antwort „200 OK“ zurückgibt, wenn sie funktioniert und die Hauptabhängigkeiten erfüllt sind. Für die Bereitschaftsprüfung (Überprüfung der Servicebereitschaft) muss die Anwendung einen anderen HTTP-Endpunkt haben und die Antwort „200 OK“ zurückgeben, wenn sich die Anwendung in einem fehlerfreien Zustand befindet, die Initialisierungsschritte abgeschlossen sind und eine korrekte Anforderung nicht zu einem Fehler führt. Kubernetes leitet den Datenverkehr nur dann zum Container, wenn die Anwendung gemäß diesen Überprüfungen bereit ist. Zwei Endpunkte können kombiniert werden, wenn kein Unterschied zwischen Lebendigkeit und Bereitschaft besteht.

Weitere Informationen hierzu finden Sie in einem verwandten Artikel von Sandeep Dinesh, Developer Advocate von Google: " Best Practices von Kubernetes: Einrichten von Gesundheitschecks mit Bereitschafts- und Lebendigkeitssonden ."

7. Wählen Sie die Version des Bildes sorgfältig aus


Die meisten öffentlichen und privaten Bilder verwenden ein Tagging-System, das dem in Best Practices for Building Containers beschriebenen ähnelt. Wenn das Image ein System verwendet, das der semantischen Versionierung nahe kommt , müssen Sie die Besonderheiten des Tagging berücksichtigen. Beispielsweise kann das latest Tag häufig von Bild zu Bild verschoben werden. Sie können sich nicht darauf verlassen, wenn Sie vorhersehbare und reproduzierbare Builds und Installationen benötigen.

Sie können das XYZ Tag verwenden (sie bleiben fast immer unverändert). In diesem Fall behalten Sie jedoch alle Patches und Aktualisierungen des Bildes im Auge. Wenn Ihr Bild ein XY Tag hat, ist dies eine gute Mittelwegoption. Wenn Sie diese Option auswählen, erhalten Sie automatisch Patches und verlassen sich gleichzeitig auf eine stabile Version der Anwendung.

PS vom Übersetzer


Lesen Sie auch in unserem Blog:

Source: https://habr.com/ru/post/de425085/


All Articles