Note :

Exécuter les pipelines Nextflow sur OCI à l'aide du service de stockage de fichiers OKE et OCI

Présentation

Il existe de nombreux cas d'utilisation où vous devez exécuter des pipelines de données à plusieurs étapes qui traitent des fichiers volumineux, assurent le suivi des résultats intermédiaires et prennent en charge l'exécution en parallèle. Bien qu'Oracle Cloud Infrastructure (OCI) Functions soit bien adapté aux tâches sans état et axées sur les événements, certains flux de travail nécessitent un système conçu pour l'orchestration et le flux de données en plusieurs étapes.

Nextflow répond à ce besoin grâce à la prise en charge intégrée des conteneurs, de la gestion des entrées/sorties et de l'exécution évolutive sur OKE. Il permet des pipelines reproductibles qui fonctionnent efficacement dans des environnements distribués.

Objectifs

Préalables

Tâche 1 : Préparer les noeuds de travail

Les utilitaires client NFS (Network File System) doivent être installés pour les noeuds OKE afin de monter le volume du service de stockage de fichiers OCI.

Accédez par SSH à chaque noeud de travail et exécutez la commande suivante.

sudo yum install -y nfs-utils
sudo systemctl enable --now nfs-client.target || true

Note : Vous n'avez pas besoin de monter manuellement le service de stockage de fichiers OCI. OKE traitera le montage automatiquement à l'aide du volume persistant.

Tâche 2 : Configurer l'hôte bastion OCI

Si vous commencez avec un nouvel hôte bastion, installez les éléments suivants :

Recommandations de sécurité :

Tâche 3 : Configurer Nextflow à partir de l'hôte bastion

Exécutez toutes les étapes à partir de votre machine virtuelle d'hôte bastion.

  1. Créer un espace de noms.

    Exécutez la commande suivante pour créer un espace de noms dédié.

    kubectl create namespace nextflow-ns
    
  2. Configurer une revendication de volume persistant et de volume persistant.

    1. Créez un fichier nommé nextflow-fss.yaml et téléchargez le contenu à partir d'ici : nextflow-fss.yaml.

    2. Veillez à remplacer <MOUNT_TARGET_IP> par l'adresse IP réelle de la cible de montage (par exemple, 10.0.10.163), trouvée dans les détails de la cible de montage du service de stockage de fichiers pour OCI dans la console OCI.

      Adresse IP de la cible de montage

    3. Notez également le chemin d'exportation et remplacez-le dans ce même fichier.

    4. Exécutez la commande suivante pour appliquer le fichier.

      kubectl apply -f nextflow-fss.yaml
      
  3. Créez un compte de service et un contrôle d'accès basé sur les rôles.

    Ceux-ci seront créés pour garantir que la tâche Nextflow exécutée dans votre grappe OKE dispose des autorisations nécessaires pour interagir avec les ressources OKE lors de l'exécution du pipeline.

    Nextflow, lors de l'exécution sur OKE, doit :

    • Lancez des pods pour chaque étape du processus.
    • Surveillez leur statut.
    • Journaux d'accès.
    • Liez-vous au PVC.

    Toutefois, par défaut, les tâches Kubernetes ne sont pas autorisées à effectuer ces actions, sauf si elles sont accordées explicitement au moyen d'un compte de service avec des liaisons RBAC appropriées.

    Exécutez la commande suivante pour créer un compte de service.

    kubectl create serviceaccount nextflow-sa -n nextflow-ns
    
    kubectl apply -f - <<EOF
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
    name: nextflow-pod-role
    namespace: nextflow-ns
    rules:
    - apiGroups: [""]
    resources: ["pods", "pods/log", "pods/status", "persistentvolumeclaims"]
    verbs: ["create", "get", "watch", "list", "delete"]
    EOF
    
    kubectl apply -f - <<EOF
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
    name: nextflow-pod-binding
    namespace: nextflow-ns
    subjects:
    - kind: ServiceAccount
    name: nextflow-sa
    namespace: nextflow-ns
    roleRef:
    kind: Role
    name: nextflow-pod-role
    apiGroup: rbac.authorization.k8s.io
    EOF
    
  4. (Facultatif) Créer des fichiers de données de test pour le pipeline Nextflow.

    Exécutez la commande suivante pour créer des fichiers pour une utilisation ultérieure dans Nextflow.

    mkdir -p /mnt/nextflow-fss/data
    echo -e "line1\nline2\nline3" > /mnt/nextflow-fss/data/test1.txt
    echo -e "nextflow\nrocks"     > /mnt/nextflow-fss/data/test2.txt
    
  5. Créer les fichiers de pipeline.

    Cette section définit la logique de pipeline Nextflow (main.nf) et sa configuration propre à Kubernetes (nextflow.config), en spécifiant comment le flux de travail doit s'exécuter, quel conteneur utiliser et comment monter le stockage partagé dans la grappe.

    Créez et téléchargez ces fichiers sur votre machine virtuelle bastion à partir d'ici :

  6. Créez un Kubernetes ConfigMap.

    Créez un fichier ConfigMap Kubernetes pour emballer les fichiers main.nf et nextflow.config afin qu'ils puissent être injectés dans le pod Nextflow lors de l'exécution.

    kubectl create configmap nextflow-code \
    --from-file=main.nf \
    --from-file=nextflow.config \
    -n nextflow-ns \
    --dry-run=client -o yaml | kubectl apply -f -
    
  7. Créer et exécuter la tâche Nextflow YAML.

    Cette section définit la tâche Kubernetes qui exécute le flux de travail Nextflow dans un conteneur. Il utilise le compte de service créé précédemment pour les autorisations, monte le volume partagé et ConfigMap, et définit le répertoire de travail et les variables d'environnement nécessaires à l'exécution de Kubernetes.

    1. Créez les fichiers nommés nextflow-job.yaml et téléchargez-les à partir d'ici : nextflow-job.yaml.

    2. Exécutez la commande suivante pour appliquer le fichier.

      kubectl apply -f nextflow-job.yaml
      

    En exécutant l'application, vous créez la tâche, qui exécute la commande d'exécution Nextflow avec le code et la configuration de pipeline montés, lancez les processus de pipeline en tant que pods Kubernetes et gérez l'entrée/sortie au moyen du volume du service de stockage de fichiers OCI monté.

  8. Surveillez l'exécution des pods.

    Vous pouvez surveiller les pods lancés et le journal des travaux à l'aide de la commande suivante.

    kubectl get pods -n nextflow-ns -w
    kubectl logs -n nextflow-ns -l job-name=nextflow-job --tail=100
    
  9. Recherchez le fichier de sortie.

    Vous devez trouver les fichiers de sortie .count à l'aide de la commande suivante.

    ls /mnt/nextflow-fss/data/*.count
    
  10. Nettoyer pour un nouveau test.

    # Remove old job and pods
    kubectl delete job --all -n nextflow-ns
    kubectl delete pod --all -n nextflow-ns
    
    # Delete only count files to rerun
    sudo find /mnt/nextflow-fss -name "*.count" -type f -delete
    

Note : Si vous apportez des modifications aux fichiers main.nf ou nextflow.config, recréez également ConfigMap.

Conseils de dépannage :

Tâche 4 : Évaluer la programmation d'UC et le parallélisme des pods

Nextflow met en parallèle les processus en lançant un pod distinct pour chaque tâche. Si votre noeud OKE a des ressources d'UC limitées, telles que seulement 1 unité centrale virtuelle, Kubernetes ne peut programmer qu'un seul pod à la fois si chaque pod demande une unité centrale complète.

Au cours de l'exécution, vous pouvez voir l'avertissement suivant dans le journal des travaux.

WARN: K8s pod cannot be scheduled -- 0/1 nodes are available: 1 Insufficient cpu.

Pourquoi cela se produit :

Solutions :

Remerciements

Autres ressources d'apprentissage

Explorez d'autres laboratoires sur le site docs.oracle.com/learn ou accédez à plus de contenu d'apprentissage gratuit sur le canal Oracle Learning YouTube. De plus, visitez education.oracle.com/learning-explorer pour devenir un explorateur Oracle Learning.

Pour obtenir la documentation sur le produit, visitez Oracle Help Center.