7 beste Praktiken für den Betrieb von Containern laut Google

Anmerkung des Übersetzers.: Autor des ursprünglichen Artikels ist Théo Chamley, Architekt für Cloud-Lösungen bei Google. In diesem Beitrag für den Google Cloud Blog präsentiert er eine kurze Zusammenfassung eines detaillierteren Leitfadens seines Unternehmens mit dem Titel „Best Practices for Operating Containers“. Darin haben Experten von Google die besten Praktiken für den Betrieb von Containern im Kontext der Nutzung von Google Kubernetes Engine und darüber hinaus gesammelt und ein breites Themenspektrum behandelt: von Sicherheit über Monitoring bis hin zu Logging. Was sind also laut Google die wichtigsten Praktiken im Umgang mit Containern?

7 beste Praktiken für den Betrieb von Containern laut Google

Kubernetes Engine (ein auf Kubernetes basierender Service zum Ausführen von containerisierten Anwendungen in Google Cloud — Anm. d. Ü.) — gehört zu den besten Möglichkeiten, Workloads zu starten, die skalierbar sind. Kubernetes es wird ein reibungsloses Funktionieren der meisten Anwendungen gewährleisten, sofern diese containerisiert sind. Wenn Sie jedoch möchten, dass die Anwendung einfach zu verwalten ist und alle Vorteile von Kubernetes nutzen möchten, müssen Sie bewährte Praktiken befolgen. Diese erleichtern den Betrieb der Anwendung, deren Überwachung und Fehlersuche und verbessern zudem die Sicherheit.

In diesem Artikel gehen wir die Liste durch, was Sie wissen und tun sollten, um die effiziente Funktionsweise von Containern in Kubernetes sicherzustellen. Wer tiefer in die Details eintauchen möchte, sollte das Material lesen Best Practices for Operating Containers, sowie auf unseren früheren Beitrag zur Container-Bereitstellung achten.

1. Verwenden Sie die nativen Mechanismen von Containern für Logging

Wenn die Anwendung in einem Kubernetes-Cluster läuft, benötigt man für Logs nicht viel. Ein zentrales Logging-System ist wahrscheinlich bereits in das verwendete Cluster integriert. Bei der Nutzung von Kubernetes Engine ist dafür Stackdriver Logging. (Anmerkung des Übersetzers.: sollte man sich bei der Nutzung einer eigenen Kubernetes-Installation unser Open-Source-Tool ansehen — loghouse.) Machen Sie es sich nicht selbst schwer und nutzen Sie die nativen Logging-Mechanismen von Containern. Schreiben Sie die Logs in stdout und stderr — diese werden automatisch erfasst, gespeichert und indiziert.

Wenn gewünscht, können Sie die Logs auch im JSON-Formatschreiben. Dieser Ansatz ermöglicht es, einfach Metadaten hinzuzufügen. Zusammen mit diesen wird in Stackdriver Logging die Möglichkeit geschaffen, in den Logs mithilfe dieser Metadaten zu suchen.

2. Stellen Sie sicher, dass die Container stateless und immutable sind

Für die ordnungsgemäße Funktion von Containern im Kubernetes-Cluster müssen sie stateless und immutable sein. Wenn diese Bedingungen erfüllt sind, kann Kubernetes seine Arbeit verrichten, indem es Anwendungsentitäten erstellt und löscht, wann und wo es nötig ist.

Stateless bedeutet, dass jeglicher Zustand (dauerhafte Daten jeglicher Art) außerhalb des Containers gespeichert wird. Dazu können je nach Bedarf verschiedene Arten externer Speicher verwendet werden: Cloud Storage, Persistent Disks, Redis, Cloud SQL oder andere verwaltete Datenbanken. (Anmerkung des Übersetzers.: Weitere Informationen hierzu finden Sie auch in unserem Artikel „Operatoren für Kubernetes: wie man zustandsbehaftete Anwendungen ausführt».)

Immutable bedeutet, dass der Container während seiner Lebensdauer nicht modifiziert wird: keine Updates, Patches oder Änderungen an der Konfiguration. Wenn Sie den Anwendungscode aktualisieren oder einen Patch anwenden müssen, erstellen Sie ein neues Image und deployen Sie es. Es wird empfohlen, die Container-Konfiguration (Port zum Lauschen, Optionen der Ausführungsumgebung usw.) nach außen zu verlagern — in Secrets und ConfigMaps. Diese können aktualisiert werden, ohne dass ein neues Container-Image erstellt werden muss. Für die einfache Erstellung von Pipelines zur Erstellung von Images kann man Cloud Build. (Anmerkung des Übersetzers.: Für diese Zwecke verwenden wir das Open Source-Tool dapp.)

7 beste Praktiken für den Betrieb von Containern laut Google
Beispiel für die Aktualisierung der Deployment-Konfiguration in Kubernetes mit Hilfe von ConfigMap, die in Pods als Konfiguration eingebunden ist.

3. Vermeiden Sie privilegierte Container

Sie führen doch keine Anwendungen als root auf Ihren Servern aus, oder? Wenn ein Angreifer in die Anwendung eindringt, erhält er Zugriff mit Root-Rechten. Dieselben Überlegungen gelten auch, um keine privilegierten Container auszuführen. Wenn es erforderlich ist, Einstellungen auf dem Host zu ändern, kann dem Container spezifische Capabilities festzulegen mit der Option securityContext in Kubernetes gegeben werden. Wenn es erforderlich ist, sysctls, besitzt Kubernetes eine separate Annotation dafür. Im Allgemeinen sollten Sie versuchen, so viele wie möglich init- und Sidecar-Container für solche privilegierten Operationen zu verwenden. Sie benötigen keine Erreichbarkeit für internen oder externen Datenverkehr.

Wenn Sie den Cluster verwalten, können Sie die Pod Security Policy für Beschränkungen bei der Verwendung privilegierter Container nutzen.

4. Vermeiden Sie es, als root auszuführen

Über privilegierte Container wurde bereits gesprochen, es wäre jedoch noch besser, wenn Sie zusätzlich dazu keine Anwendungen innerhalb des Containers als root ausführen. Wenn ein Angreifer eine Remote-Schwachstelle mit Codeausführung in einer Anwendung mit root-Rechten findet und dann durch eine bisher unbekannte Schwachstelle den Container verlässt, erhält er root-Rechte auf dem Host.

Der beste Weg, dies zu vermeiden, besteht darin, zunächst nichts unter root auszuführen. Dazu kann die Direktive USER in Dockerfile oder runAsUser in Kubernetes verwendet werden. Der Cluster-Administrator kann auch ein erzwungenes Verhalten mithilfe von Pod Security Policy.

5. Machen Sie die Anwendung einfach zu überwachen

Wie bei der Protokollierung ist das Monitoring ein unverzichtbarer Bestandteil des Anwendungsmanagements. Eine beliebte Lösung für das Monitoring in der Kubernetes-Community ist Prometheus — ein System, das Pods und Dienste, die überwacht werden müssen, automatisch erkennt. (Anmerkung des Übersetzers.: Siehe auch unseren ausführlichen Bericht zum Thema Monitoring mit Prometheus und Kubernetes.) Stackdriver kann Kubernetes-Cluster überwachen und enthält eine eigene Version von Prometheus zur Überwachung von Anwendungen.

7 beste Praktiken für den Betrieb von Containern laut Google
Das Kubernetes-Dashboard in Stackdriver

erwartet, dass die Anwendung Metriken über einen HTTP-Endpunkt bereitstellt. Dazu stehen Prometheus-Client-Bibliothekenzur Verfügung. Ein ähnliches Format wird von anderen Tools wie OpenCensus und Istio.

6. Machen Sie den Gesundheitszustand der Anwendung zugänglich

Das Management der Anwendung in der Produktion wird durch ihre Fähigkeit unterstützt, ihren Status dem gesamten System mitzuteilen. Ist die Anwendung gestartet? Ist sie in Ordnung? Ist sie bereit, Traffic zu akzeptieren? Wie verhält sie sich? Die gängigste Lösung für dieses Problem ist die Implementierung von Gesundheitsprüfungen (health checks). Kubernetes hat zwei Typen davon: liveness und readiness probes.

Für die liveness probe (Lebensfähigkeitsprüfung) muss die Anwendung einen HTTP-Endpunkt haben, der eine Antwort von „200 OK“ zurückgibt, wenn sie funktioniert und ihre grundlegenden Abhängigkeiten erfüllt sind. Für die readiness probe (Bereitschaftsprüfung) Die Anwendung sollte einen anderen HTTP-Endpunkt haben, der eine Antwort "200 OK" zurückgibt, wenn die Anwendung in einem gesunden Zustand ist, die Initialisierungsschritte abgeschlossen sind und keine korrekten Anfragen zu einem Fehler führen. Kubernetes leitet den Verkehr nur zu dem Container weiter, wenn die Anwendung gemäß diesen Überprüfungen bereit ist. Zwei Endpunkte können zusammengeführt werden, wenn es keinen Unterschied zwischen den Zuständen der Lebensfähigkeit (liveness) und der Einsatzbereitschaft (readiness) gibt.

Weitere Informationen finden Sie in dem entsprechenden Artikel von Sandeep Dinesh, Developer Advocate bei Google: „Kubernetes Best Practices: Gesundheitstests mit Readiness- und Liveness-Proben einrichten».

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

Die meisten öffentlichen und privaten Images verwenden ein Tagging-System, das dem in Best Practices for Building Containersbeschriebenen ähnlich ist. Wenn das Image ein System anwendet, das nahe am semantischen Versionieren liegt,muss die spezifische Tagging-Praxis berücksichtigt werden. Zum Beispiel kann das Tag latest häufig zwischen Images wechseln — es ist nicht zuverlässig, wenn Sie vorhersehbare und reproduzierbare Build- und Installationsprozesse benötigen.

Sie können das Tag X.Y.Z verwenden (es bleibt fast immer konstant), aber in diesem Fall sollten Sie alle Patches und Updates des Images überwachen. Wenn das verwendete Image ein Tag hat X.Y, ist das eine gute Zwischenlösung. Wenn Sie es wählen, erhalten Sie automatisch alle Patches und stützen sich gleichzeitig auf eine stabile Version der Anwendung.

P.S. vom Übersetzer

Lesen Sie auch in unserem Blog:

Quelle: habr.com

60GB SSD 8Gb DDR4