注意:
- 本教程需要访问 Oracle Cloud。要注册免费账户,请参阅开始使用 Oracle Cloud Infrastructure 免费套餐。
- 它使用 Oracle Cloud Infrastructure 身份证明、租户和区间的示例值。完成实验室时,请将这些值替换为特定于云环境的值。
使用 OKE 和 OCI 文件存储服务在 OCI 上运行 Nextflow 管道
简介
在许多用例中,您需要运行多步骤数据管道来处理大型文件、跟踪中间结果并支持并行执行。虽然 Oracle Cloud Infrastructure (OCI) Functions 非常适合事件驱动和无状态任务,但一些工作流需要专为跨多个步骤进行编排和数据流设计的系统。
Nextflow 可满足这一需求,内置支持容器、输入/输出处理以及 OKE 上的可伸缩执行。它支持在分布式环境中高效运行的可重现管道。
目标
- 在 Oracle Cloud Infrastructure Kubernetes Engine (OKE) 上部署最少的 Nextflow 管道,使用 Oracle Cloud Infrastructure File Storage 服务进行共享卷,并使用堡垒主机进行访问和控制。
先决条件
-
访问 OCI 租户。
-
创建和管理 OCI 计算实例、OKE 集群和网络资源的权限。
-
虚拟云网络 (Virtual Cloud Network,VCN) 中具有公共子网的现有 OKE 集群。
-
现有 OCI 文件存储服务卷。
-
在与 OKE 集群相同的 VCN 中的公共子网中充当 OCI 堡垒 jumphost 的现有 OCI 计算实例。
任务 1:准备 Worker 节点
OKE 节点必须安装网络文件系统 (Network File System,NFS) 客户端实用程序才能挂载 OCI 文件存储服务卷。
通过 SSH 连接到每个 worker 节点并运行以下命令。
sudo yum install -y nfs-utils
sudo systemctl enable --now nfs-client.target || true
注:您无需手动挂载 OCI 文件存储服务,OKE 将使用持久性卷自动处理挂载。
任务 2:设置 OCI 堡垒主机
如果要从新的堡垒主机开始,请安装以下命令:
-
Oracle Cloud Infrastructure 命令行界面 (OCI CLI)。有关更多信息,请参见 Installing the CLI 。
-
kubectl 和 Kubeconfig 设置。有关更多信息,请参见 Accessing a Cluster Using Kubectl 。
-
集群连接:按照 Access Your Cluster(访问集群)说明进行操作,您可以在 OCI 控制台集群详细信息页中找到该说明。
-
将 FSS 卷挂载到堡垒中,例如在 /mnt/nextflow-fss 下。例如,考虑到下面任务 3 中的图片中装载目标的专用 IP、OCI FSS 的导出路径和堡垒上的现有 /mnt/nextflow-fss 目录,该命令将为:
sudo mount -t nfs 10.0.10.163:/nextflow /mnt/nextflow-fss
确保在此处也安装了适用于 worker 节点的 nfs-utils (如上)。
安全建议:
-
使用 NSG 或安全列表限制对堡垒的 SSH 访问。确保端口 2049 为 FSS 访问打开。
-
确保安全地存储私有 SSH 密钥和 kubeconfig。
任务 3:配置堡垒中的下一流
运行堡垒 VM 中的所有步骤。
-
Create a Namespace(创建名称空间)。
运行以下命令以创建专用名称空间。
kubectl create namespace nextflow-ns
-
Configure Persistent Volume and Persistent Volume Claim (PVC) 。
-
创建一个名为
nextflow-fss.yaml
的文件,并从此处下载内容:nextflow-fss.yaml
。 -
确保将
<MOUNT_TARGET_IP>
替换为 OCI 控制台中 OCI 文件存储服务装载目标详细信息中的实际装载目标 IP(例如10.0.10.163
)。 -
同时记下导出路径并将其替换为同一文件。
-
运行以下命令以应用该文件。
kubectl apply -f nextflow-fss.yaml
-
-
创建服务账户和基于角色的访问控制 (Role-based Access Control,RBAC) 。
这些将创建,以确保在 OKE 集群中运行的 Nextflow 作业具有在管道执行期间与 OKE 资源进行交互所需的权限。
在 OKE 上运行时,下一个流需要:
- 为每个流程步骤启动 pod。
- 监视其状态。
- 访问日志。
- 绑定到 PVC。
但是,默认情况下,Kubernetes 作业没有执行这些操作的权限,除非通过具有正确 RBAC 绑定的服务帐户显式授予。
运行以下命令以创建服务帐户。
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
-
(可选)为 Nextflow 管道创建测试数据文件。
运行以下命令以创建一些文件,供以后在 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
-
创建管道文件。
本节定义 Nextflow 管道逻辑 (
main.nf
) 及其特定于 Kubernetes 的配置 (nextflow.config
),指定工作流应如何运行、要使用的容器以及如何在集群中挂载共享存储。从此处在堡垒 VM 上创建和下载这些文件:
-
创建 Kubernetes ConfigMap 。
创建 Kubernetes ConfigMap 以打包
main.nf
和nextflow.config
文件,以便在运行时将其注入到 Nextflow pod 中。kubectl create configmap nextflow-code \ --from-file=main.nf \ --from-file=nextflow.config \ -n nextflow-ns \ --dry-run=client -o yaml | kubectl apply -f -
-
创建并运行下一流作业 YAML 。
本节定义在容器内运行 Nextflow 工作流的 Kubernetes 作业。它使用以前创建的服务帐户获取权限,挂载共享卷和 ConfigMap,并设置 Kubernetes 执行所需的工作目录和环境变量。
-
创建名为
nextflow-job.yaml
的文件并从此处下载: nextflow-job.yaml 。 -
运行以下命令以应用该文件。
kubectl apply -f nextflow-job.yaml
通过运行“application(应用)”,您将创建该作业。该作业运行 Nextflow 运行命令并包含已挂载的管道代码和配置,以 Kubernetes 云池的形式启动管道进程,并通过已挂载的 OCI 文件存储服务卷处理输入/输出。
-
-
监视云池执行。
您可以使用以下命令监视已启动的云池和作业日志。
kubectl get pods -n nextflow-ns -w kubectl logs -n nextflow-ns -l job-name=nextflow-job --tail=100
-
查找输出文件。
您应使用以下命令查找
.count
输出文件。ls /mnt/nextflow-fss/data/*.count
-
重新测试的清除。
# 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。
故障排除提示:
- 确保所有云池上的 Kubernetes 正确挂载了卷。
- 确保在所有 OKE worker 节点上安装了
nfs-utils
。 - 确保 OCI 文件存储服务导出允许从 OKE 节点子网进行访问。
-
如果需要,请使用以下命令描述失败的云池。
kubectl describe pod <pod-name> -n nextflow-ns
任务 4:评估 CPU 调度和云池并行度
Nextflow 通过为每个任务启动一个单独的 pod 来并行化进程。如果 OKE 节点的 CPU 资源有限(例如只有 1 个 vCPU),则当每个云池请求一个完整的 CPU 时,Kubernetes 一次只能调度一个云池。
在执行期间,您可能会在作业日志中看到以下警告。
WARN: K8s pod cannot be scheduled -- 0/1 nodes are available: 1 Insufficient cpu.
发生这种情况的原因:
- 默认情况下,Nextflow 并行提交所有任务。
- 如果您有 1 个 CPU worker 节点,并且该节点已在运行使用 1 个 CPU 的 pod,则在资源可用之前,其他 pod 将排队。
- 这会导致执行速度变慢,但最终所有作业都将完成。
解决方案:
-
选项 1:减少每个进程的 CPU 请求。
您可以在
nextflow.config
文件中限制每个任务的 CPU 占用率。process { cpus = 0.5
在提供的
nextflow.config
中,您将看到此行已经存在,并设置为 0.1,这足以支持我们非常简单的演示数据。可以包括该值,也可以根据需要修改该值。 -
选项 2:使用更大的节点。
将节点配置升级为 2 个以上 vCPUs 的配置,以允许多个云池并行运行。
相关链接
确认
- 作者 — Adina Nicolescu(高级云工程师)
更多学习资源
通过 docs.oracle.com/learn 浏览其他实验室,或者通过 Oracle Learning YouTube 频道访问更多免费学习内容。此外,请访问 education.oracle.com/learning-explorer 以成为 Oracle Learning Explorer。
有关产品文档,请访问 Oracle 帮助中心。
Run Nextflow Pipelines on OCI using OKE and OCI File Storage Service
G34278-01
Copyright ©2025, Oracle and/or its affiliates.