2016-11-22 2 views
0

Ich habe ein Setup mit einem Webserver (NGINX) und einem reag-basierten Frontend, das Webpack verwendet, um die endgültigen statischen Quellen zu erstellen.Wie wiederkehrende kurzlebige Aufgaben mit Kubernetes gehandhabt werden

Der Webserver hat ein eigenes Kubernetes deployment + service.

Das Frontend muss erstellt werden, bevor der Webserver die statischen html/js/css-Dateien bereitstellen kann - aber danach kann die pod/container stoppen.

Meine Idee war eine volume zwischen dem Webserver und dem Frontend pod zu teilen. Das Frontend schreibt die erzeugten Dateien in die volume und der Webserver kann sie von dort aus bedienen. Immer wenn ein Update für den Frontend-Quellcode vorliegt, müssen die Dateien neu generiert werden.

Was ist der beste Weg, um das mit Kubernetes Tools zu erreichen? Momentan benutze ich einen init-container Build - aber das führt auch zu einem Neustart des Webservers pod, was nicht nötig wäre.

Ist dies die beste/einzige Lösung für dieses Problem oder sollte ich Kubernetes 'jobs für diese Art von Aufgaben verwenden?

Antwort

1

Es gibt mehrere Möglichkeiten, dies zu tun. Hier ist, wie ich darüber denke:

Option 1: Die statischen Dateien Quellcode gebaut repräsentieren

In diesem Fall werden die statischen Dateien, die Sie bedienen wollen, sollten tatsächlich verpackt und in das Docker Bild eingebaut werden von Ihr Nginx-Webserver (im HTML-Verzeichnis sagen). Wenn Sie Ihr Frontend aktualisieren möchten, aktualisieren Sie die Version des verwendeten Images und aktualisieren den Pod.

Option 2: Die statischen Dateien repräsentieren Zustand

In diesem Fall ist der Ansatz richtig. Ihr 'Status' (wie eine Datenbank) wird in einem Ordner gespeichert. Dann führen Sie einen Init-Container/Job aus, um "Status" zu initialisieren, und dann funktioniert Ihr Webserver-Pod einwandfrei.

Ich glaube, die Option 1 aus 2 Gründen besser sein:

  1. Sie horizontal Webserver triviale durch Erhöhung der Schote Replik Zahl skaliert werden können. In Option 2 haben Sie es mit dem Status zu tun. Das ist ein Problem, wenn Sie dem zugrunde liegenden k8s-Cluster weitere Knoten hinzufügen möchten (Sie müssen Dateien/Ordner von einem Volume/Ordner in ein anderes kopieren).
  2. Die statischen Dateien sind eigentlich der Quellcode Ihrer App. Dies sind keine hochgeladenen Mediendateien oder ähnliches. In diesem Fall ist es absolut sinnvoll, sie zu einem Dockerbild zu machen. Sonst wird der Vorteil von Containerisierung und Deployment irgendwie zunichte gemacht.
+0

für Option 2: Init-Container oder Job? Was ist das bessere Werkzeug? Könnte ich einfach einen Job erstellen, wenn sich die Quelle ändert? – pkyeck

+0

init-container ist nur beim erstmaligen Erstellen einer Bereitstellung nützlich. Da ein statischer Server ausgeführt werden soll, passt ein Job, der das bestimmte Volume ändert, besser. – iamnat

1

Jobs, Init Container oder alternativ eine gitRepo Art von Volume würde für Sie arbeiten.

http://kubernetes.io/docs/user-guide/volumes/#gitrepo

Es ist in Ihrer Frage ist nicht klar, warum Sie die statische Inhalte ohne einfach neu entfalte/Aktualisieren des Pod aktualisieren möchten.

Da irgendwo, irgendwie müssen Sie das Webserver Docker Bild zu bauen, scheint es am besten, den statischen Inhalt in das Bild zu bauen: keine beweglichen Teile einmal bereitgestellt, keine Notwendigkeit für Volumes oder Speicher. Insgesamt ist es einfacher.

Wenn Sie ein beliebiges Automatisierungswerkzeug für Docker-Builds verwenden, ist es einfach. Ich benutze Jenkins persönlich, um Docker-Bilder basierend auf einem Hook von Git Repo zu erstellen, und das Image wird einfach neu erstellt und bereitgestellt, wenn sich der Code ändert.

Ausführen einen Job oder Init Container, den Sie nicht viel gewinnen: sicher, dass der Web-Server läuft weiter, aber es ist so einfach, ein Deployment mit Roll Updates zu haben, die die neuen Pod einsetzen werden vor der alte ist abgerissen und dein Server wird immer auf sein.

Halten Sie es einfach ...

+0

Ich möchte den Webserver-Container nicht jedes Mal neu erstellen, wenn sich der statische Inhalt ändert, da der Server auch andere Anforderungen an z. Die API – pkyeck

+0

K8s versucht, diese häufige Update-Stil-Bereitstellung zu erleichtern. Sie können eine Bereitstellung vom Typ 0-Ausfallzeit auf Ihrem statischen Server durchführen. Also werden der alte Server und der neue Server nebeneinander existieren. Dann wird der alte Server zurückgezogen. Nur für Ihre Informationen sollten Sie dies lesen: http://kubernetes.io/docs/user-guide/deployment/#updating-a-deployment – iamnat

Verwandte Themen