ノート:

OKEおよびOCI File Storageサービスを使用したOCIでのNextflow Pipelinesの実行

イントロダクション

大きなファイルを処理し、中間結果を追跡し、パラレル実行をサポートするマルチステップ・データ・パイプラインを実行する必要があるユースケースが多数あります。Oracle Cloud Infrastructure (OCI) Functionsはイベントドリブンでステートレスなタスクに適していますが、一部のワークフローでは、複数のステップにわたるオーケストレーションおよびデータフロー用に設計されたシステムが必要です。

Nextflowは、コンテナ、入出力処理、OKEでのスケーラブルな実行の組込みサポートにより、このニーズに対応します。これにより、分散環境で効率的に実行される再現可能なパイプラインが可能になります。

目的

前提条件

タスク1: ワーカー・ノードの準備

OKEノードには、OCI File Storageサービス・ボリュームをマウントするためのネットワーク・ファイル・システム(NFS)クライアント・ユーティリティがインストールされている必要があります。

各ワーカー・ノードにSSHで接続し、次のコマンドを実行します。

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

ノート: OCI File Storageサービスを手動でマウントする必要はありません。OKEでは、永続ボリュームを使用してマウントが自動的に処理されます。

タスク2: OCI要塞ホストの設定

新しい要塞ホストで開始する場合は、次をインストールします:

セキュリティ推奨:

タスク3: 要塞からのネクストフローの構成

要塞VMからすべてのステップを実行します。

  1. 名前空間の作成

    次のコマンドを実行して、専用ネームスペースを作成します。

    kubectl create namespace nextflow-ns
    
  2. Configure Persistent Volume and Persistent Volume Claim (PVC)

    1. nextflow-fss.yamlという名前のファイルを作成し、nextflow-fss.yamlからコンテンツをダウンロードします。

    2. <MOUNT_TARGET_IP>を、OCIコンソールのOCIファイル・ストレージ・サービスのマウント・ターゲットの詳細にある実際のマウント・ターゲットIP (10.0.10.163など)に置き換えてください。

      マウント・ターゲットIP

    3. エクスポート・パスもメモして、この同じファイルで置き換えます。

    4. 次のコマンドを実行して、ファイルを適用します。

      kubectl apply -f nextflow-fss.yaml
      
  3. サービス・アカウントおよびロールベースのアクセス制御(RBAC)を作成します

    これらは、OKEクラスタで実行されているネクストフロー・ジョブが、パイプラインの実行中にOKEリソースと対話するために必要な権限を持っていることを確認するために作成されます。

    Nextflowは、OKE上で実行する場合、次のことを行う必要があります。

    • 各プロセス ステップのポッドを起動します。
    • ステータスを監視します。
    • アクセス・ログ
    • PVCにバインドします。

    ただし、デフォルトでは、適切なRBACバインディングを持つサービス・アカウントを介して明示的に付与されないかぎり、Kubernetesジョブにはこれらのアクションを実行する権限がありません。

    サービス・アカウントを作成するには、次のコマンドを実行します。

    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. (オプション)ネクストフロー・パイプラインのテスト・データ・ファイルの作成

    次のコマンドを実行して、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. パイプライン・ファイルの作成

    この項では、ネクストフロー・パイプライン・ロジック(main.nf)とそのKubernetes固有の構成(nextflow.config)を定義し、ワークフローの実行方法、使用するコンテナ、およびクラスタ内の共有記憶域のマウント方法を指定します。

    次のファイルから、要塞VMでこれらのファイルを作成してダウンロードします:

  6. Kubernetes ConfigMapを作成します

    Kubernetes ConfigMapを作成して、実行時にNextflowポッドに注入できるようにmain.nfおよびnextflow.configファイルをパッケージ化します。

    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. ネクストフロー・ジョブYAMLの作成および実行

    この項では、コンテナ内でNextflowワークフローを実行するKubernetesジョブを定義します。以前に作成したサービス・アカウントを使用して権限を取得し、共有ボリュームおよびConfigMapをマウントし、Kubernetesの実行に必要な作業ディレクトリおよび環境変数を設定します。

    1. nextflow-job.yamlという名前のファイルを作成し、nextflow-job.yamlからダウンロードします。

    2. 次のコマンドを実行して、ファイルを適用します。

      kubectl apply -f nextflow-job.yaml
      

    適用を実行すると、ジョブが作成されます。このジョブは、マウントされたパイプライン・コードおよび構成を使用してNextflow runコマンドを実行し、Kubernetesポッドとしてパイプライン・プロセスを起動し、マウントされたOCI File Storageサービス・ボリュームを介して入出力を処理します。

  8. ポッド実行をモニターします

    次のコマンドを使用して、起動されたポッドおよびジョブ・ログを監視できます。

    kubectl get pods -n nextflow-ns -w
    kubectl logs -n nextflow-ns -l job-name=nextflow-job --tail=100
    
  9. 出力ファイルを検索します。

    次のコマンドを使用して、.count出力ファイルを見つけます。

    ls /mnt/nextflow-fss/data/*.count
    
  10. 再テストのクリーンアップ

    # 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
    

ノート: main.nfまたはnextflow.configファイルを変更した場合は、ConfigMapも再作成します。

トラブルシューティングのヒント:

タスク4: CPUスケジューリングとポッド並列性の評価

Nextflowでは、タスクごとに個別のポッドを起動して、プロセスをパラレル化します。OKEノードに1つのvCPUのみなどのCPUリソースが制限されている場合、Kubernetesは、各ポッドがフルCPUを要求する場合、一度に1つのポッドのみをスケジュールできます。

実行中に、ジョブ・ログに次の警告が表示される場合があります。

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

なぜこれが起こるのか:

解決策:

確認

その他の学習リソース

docs.oracle.com/learnで他のラボを確認するか、Oracle Learning YouTubeチャネルで無料のラーニング・コンテンツにアクセスしてください。また、education.oracle.com/learning-explorerにアクセスして、Oracle Learning Explorerになります。

製品ドキュメントについては、Oracle Help Centerを参照してください。