web-dev-qa-db-fra.com

Comment exécuter des conteneurs de manière séquentielle en tant que tâche Kubernetes?

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.

11
k-kawa

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
13
Bloodysock

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.

3
iamnat

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.

1
Jay Paddy

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. 

0
GJSissons