2016-11-21 1 views
2

Ich versuche, meinen alten Job-Scheduler durch einen Kubernetes-Job zu ersetzen und mich zu wundern, wie man sequenzielle Jobs als Kubernetes-Job schreibt.Wie schreibe ich sequentielle Jobs als Kubernetes-Job?

Zuerst schrieb ich das folgende Skript, um job1 und job2 in der geschriebenen Reihenfolge auszuführen, aber es funktionierte nicht wie erwartet.

apiVersion: batch/v1 
kind: Job 
metadata: 
    name: sequential 
spec: 
    activeDeadlineSeconds: 100 
    template: 
    metadata: 
     name: sequential_jobs 
    spec: 
     containers: 
     - name: job1 
     image: image1 
     - name: job2 
     image: image2 
     restartPolicy: Never 

Der Auftrag oben beschrieben scheint job1 und job2 parallel laufen zu lassen. Gibt es eine gute Möglichkeit, job1 und job2 in der schriftlichen Reihenfolge auszuführen?

angehängt.

Ich habe vor kurzem https://github.com/argoproj/argo sehr gut für meinen Anwendungsfall gefunden.

Antwort

2

Im Allgemeinen gibt es keine Vorstellung von Sequenz und Abhängigkeiten zwischen Containern/Pods in einem Kubernetes-Setup.

In Ihrem Fall, wenn Sie 2 Container in einer Jobspezifikation (oder einer Pod-Spezifikation) haben, gibt es für diese 2 Container keine Sequenzierung. Ähnliches gilt, wenn Sie nacheinander zwei Jobs auslösen, gibt es auch keine Vorstellung von Sequenzierung für diese Jobs.

Im Idealfall, wenn etwas Sequenzierung erfordert, sollten Sie es innerhalb eine einzelne Einheit (Container) erfassen.


leicht tangential zu Ihrer Frage, ein weiteres gemeinsames Muster, das ich , wenn ein Job auf einem anderen Dienst bestehenden abhängt gesehen haben (sagen wir ein von einem K8S Service konfrontierte Deployment):

Der Behälter in der Job stellt eine Anfrage an den k8s-Dienst und schlägt fehl, wenn der Dienst nicht wie erwartet reagiert. Auf diese Weise wird der Job neu gestartet, und wenn der Service verfügbar ist, wird der Job ausgeführt und erfolgreich abgeschlossen.

+1

Pods können "Init-Container" haben, die vor dem Start des Hauptcontainers ausgeführt werden. Aber ich weiß nicht, ob das auch für Jobs funktioniert. Wenn dies der Fall ist, könnte job1 als init-Container und job2 als Hauptcontainer ausgeführt werden. Siehe http://kubernetes.io/docs/user-guide/production-pods/#handling-initialization –

+0

Ich habe es noch nicht ausprobiert, aber es scheint eine gute Alternative zu sein. Danke @MarcSluiter –

+0

Init-Container funktioniert auch für Jobs – baloo

0

Ich bin gerade auf dieses Problem gestoßen. Wie oben erwähnt, gibt es in Kubernetes, soweit ich weiß, keine Ahnung von Jobabhängigkeiten, aber ich habe mit einer kommerziellen Entität (Univa) gearbeitet, die ein Add-on hat, das diese (und andere) Fähigkeiten bietet.

Das Angebot heißt Navops-Befehl und ermöglicht es Ihnen, Kubernetes-Jobs mit einer einfachen Abhängigkeitsnotation zu kommentieren. Es gibt einen Blog mit einer kurzen Erklärung und einem Beispiel hier - http://blogs.univa.com/2017/06/navops-command-1-2-delivers-new-advanced-capabilities-for-managing-resources-on-kubernetes/. Grundsätzlich installiert Navops als eine Reihe von Containern auf Kubernetes, stellt seine eigene Benutzeroberfläche und CLI zur Verfügung und ergänzt den Kubernetes-Scheduler um zusätzliche Funktionen. Sie können es unter http://navops.io herunterladen.

Die Technologie stammt vom Grid Engine-Scheduler, der in HPC verwendet wird, wo komplexe Arbeitsabläufe, Array-Jobs und Ähnliches üblich sind.

2

Nach ein paar Versuchen habe ich das getan und das Grundproblem gelöst (ähnlich dem, was das OP gepostet hat). Diese Konfiguration stellt sicher, dass job-1 abgeschlossen wird, bevor job-2 beginnt. Wenn job-1 fehlschlägt, wird der Container job-2 nicht gestartet. Ich muss immer noch an den Wiederholungen und Fehlerbehandlung arbeiten, aber die Grundlagen funktionieren.Hoffentlich wird diese andere helfen:

apiVersion: v1 
kind: Pod 
metadata: 
    name: sequential-job 
spec: 
    initContainers: 
    - name: job-1 
    image: busybox 
    # runs for 15 seconds; echoes job name and timestamp 
    command: ['sh', '-c', 'for i in 1 2 3; do echo "job-1 `date`" && sleep 5s; done;'] 
    - name: job-2 
    image: busybox 
    # runs for 15 seconds; echoes job name and timestamp 
    command: ['sh', '-c', 'for i in 1 2 3; do echo "job-2 `date`" && sleep 5s; done;'] 
    # I don't really need the 'containers', but syntax requires 
    # it so, I'm using it as a place where I can report the 
    # completion status 
    containers: 
    - name: job-done 
    image: busybox 
    command: ['sh', '-c', 'echo "job-1 and job-2 completed"'] 
    restartPolicy: Never 

aktualisiert

Die gleiche Konfiguration wie oben auch in einem Job spec funktioniert:

apiVersion: batch/v1 
kind: Job 
metadata: 
    name: sequential-jobs 
spec: 
    template: 
    metadata: 
     name: sequential-job 
    spec: 
     initContainers: 
     - name: job-1 
     image: busybox 
     command: ['sh', '-c', 'for i in 1 2 3; do echo "job-1 `date`" && sleep 5s; done;'] 
     - name: job-2 
     image: busybox 
     command: ['sh', '-c', 'for i in 1 2 3; do echo "job-2 `date`" && sleep 5s; done;'] 
     containers: 
     - name: job-done 
     image: busybox 
     command: ['sh', '-c', 'echo "job-1 and job-2 completed"'] 
     restartPolicy: Never 
0

Hast Du bei der Brigade siehst - https://brigade.sh. Skript einfache und komplexe Workflows mit JavaScript. Verketten Sie Container, indem Sie sie parallel oder seriell ausführen. Feuere Skripts basierend auf Zeiten, GitHub-Ereignissen, Docker-Pushs oder anderen Triggern. Brigade ist das Werkzeug zum Erstellen von Pipelines für Kubernetes.

Verwandte Themen