web-dev-qa-db-de.com

Kubernetes - wie man einen Job nur einmal ausführt

Ich habe eine Jobdefinition basierend auf einem Beispiel von der kubernetes-Website.

apiVersion: batch/v1
kind: Job
metadata:
  name: pi-with-timeout-6
spec:
  activeDeadlineSeconds: 30
  completions: 1
  paralleism: 1
  template:
    metadata:
      name: pi
    spec:
      containers:
      - name: pi
        image: Perl
        command: ["exit", "1"]
      restartPolicy: Never

Ich möchte diesen Job einmal ausführen und nicht neu starten, wenn er fehlschlägt. Mit comand exit 1 versuchen kubernetes, einen neuen Pod auszuführen, um Exit-0-Code zu erhalten, bis das Zeitlimit für activeDeadlineSeconds erreicht wird. Wie kann man das vermeiden? Ich möchte Build-Befehle in kubernetes ausführen, um die Kompilierung zu überprüfen, und wenn die Kompilierung fehlschlägt, erhalte ich einen anderen Exit-Code als 0. Ich möchte keine erneute Kompilierung.

Ist es möglich? Wie?

13
esio

Wenn Sie einen One-Try-Befehl ausführen möchten, sollten Sie wahrscheinlich einen Bare-Pod erstellen, da der Job versucht, den Befehl auszuführen, bis der Befehl erfolgreich ausgeführt wird oder der aktive Termin eingehalten wird.

Erstellen Sie einfach den Pod aus Ihrer Vorlage:

apiVersion: v1
kind: Pod
metadata:
  name: pi
spec:
  containers:
  - name: pi
    image: Perl
    command: ["exit", "1"]
  restartPolicy: Never
13
Nebril

Dies ist jetzt möglich, indem Sie backoffLimit: 0 einstellen, wodurch der Controller aufgefordert wird, 0 Wiederholungen durchzuführen. Die Standardeinstellung ist 6

6
pHiL

Leider gibt es derzeit keine Möglichkeit, den Job-Controller daran zu hindern, nur neue Pods erneut zu veröffentlichen, wenn sie versagen. Die kubernetes-Community arbeitet jedoch an einer Lösung, siehe: 

"Backoff-Richtlinie und gescheitertes Pod-Limit" https://github.com/kubernetes/community/pull/583

1
ithkuil