J'essaie de remplacer mon ordonnanceur existant par un travail Kubernetes et je me demande comment écrire des travaux séquentiels en tant que travail Kubernetes.
Tout d'abord, j'ai écrit le script suivant pour exécuter job1
et job2
dans l'ordre écrit, mais cela n'a pas fonctionné comme prévu.
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
Le travail décrit ci-dessus semble exécuter job1
et job2
en parallèle. Existe-t-il un bon moyen d'exécuter job1
et job2
dans l'ordre écrit?
En annexe.
J'ai récemment trouvé https://github.com/argoproj/argo très bon pour mon cas d'utilisation.
Après quelques tentatives, j'ai fait ceci et cela a résolu le problème de base (similaire à ce que le PO a publié). Cette configuration garantit que job-1
se termine avant le début de job-2
. Si job-1
échoue, le conteneur job-2
n'est pas démarré. Je dois encore travailler sur les tentatives et la gestion des échecs, mais les bases fonctionnent. Espérons que cela aidera les autres:
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
Mettre à jour
La même configuration que ci-dessus fonctionne également à l'intérieur d'une spécification de travail:
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
D'une manière générale, il n'y a aucune notion de séquence et de capture des dépendances entre les conteneurs/pods dans une configuration Kubernetes.
Dans votre cas, si vous avez 2 conteneurs dans une spécification de travail (ou même une spécification de pod), il n'y a pas de séquence pour ces 2 conteneurs. De même, si vous déclenchez deux tâches l'une après l'autre, il n'y a pas non plus de notion de séquencement pour ces tâches.
Idéalement, si quelque chose nécessite un séquençage, vous devez le capturer au sein de une seule unité (conteneur).
Légèrement tangent à votre question, un autre schéma courant que j'ai observé Lorsqu'un travail dépend d'un autre service (par exemple, un déploiement avec un service k8s):
Le conteneur du travail envoie une demande au service k8s et échoue si le service ne répond pas comme prévu. Ainsi, le travail continue de redémarrer et, une fois le service activé, il s'exécute et se termine avec succès.
Avez-vous regardé Brigade - https://brigade.sh . Script de flux de travail simples et complexes en utilisant JavaScript. Chaînez les conteneurs ensemble, en les exécutant en parallèle ou en série. Déclenchez des scripts en fonction de l'heure, des événements GitHub, des envois Docker ou de tout autre déclencheur. Brigade est l'outil de création de pipelines pour Kubernetes.
Je viens de découvrir cela. Comme indiqué ci-dessus, pour autant que je sache, la notion de dépendance à l'emploi dans Kubernetes n'existe pas, mais je travaille avec une entité commerciale (Univa) dotée d'un module complémentaire fournissant cette fonctionnalité (et d'autres).
L'offre s'appelle Navops Command et vous permet d'annoter les travaux Kubernetes avec une simple notation de dépendance. Il existe un blog avec une brève explication et un exemple ici - http://blogs.univa.com/2017/06/navops-command-1-2-delivers-new-advanced-capabilities-for-managing-resources- on-kubernetes/ . Fondamentalement, Navops s’installe comme un ensemble de conteneurs sur Kubernetes, expose sa propre interface utilisateur et sa propre interface de commande et complète les fonctions supplémentaires du planificateur Kubernetes. Vous pouvez le télécharger sur http://navops.io .
La technologie provient du planificateur Grid Engine utilisé dans HPC, où les processus complexes, les tâches de groupe et autres sont communs.