文章目录
- 拉取 Git 仓库并读取文件
- 使用 Kubernetes Persistent Volumes(通过 volumeClaimTemplates)以及任务之间如何共享数据
拉取 Git 仓库并读取文件
在 Argo Workflows 中,如果你想要一个任务拉取 Git 仓库中的文件,另一个任务读取该文件,你可以按照以下方式构建工作流:
第一个任务(拉取 Git 仓库):这个任务将使用 git 命令克隆指定的 Git 仓库。
第二个任务(读取 Git 文件):这个任务会读取第一个任务拉取的 Git 仓库中的文件。
我们将使用 Argo Workflows 中的 Artifact
机制来传递 Git 仓库中的文件,gitclone.yaml
。
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:generateName: git-file-processing-
spec:entrypoint: git-file-exampletemplates:- name: git-file-exampledag:tasks:- name: clone-git-repotemplate: clone-repo- name: read-git-filetemplate: print-filedepends: "clone-git-repo"arguments:artifacts:- name: git-filesfrom: "{{tasks.clone-git-repo.outputs.artifacts.repo-artifact}}"- name: clone-repocontainer:image: alpine:latestcommand: [sh, -c]args:- |apk add --no-cache gitgit clone https://gitee.com/qfxcoffee/shield.git /tmp/repooutputs:artifacts:- name: repo-artifactpath: /tmp/repo- name: print-fileinputs:artifacts:- name: git-filespath: /tmp/git-filescontainer:image: alpine:latestcommand: [sh, -c]args:- |cat /tmp/git-files/pom.xml
正确读取到文件
解释:
- 工作流结构 (git-file-example)
这个工作流包含两个任务:
clone-git-repo:拉取 Git 仓库并保存到 /tmp/repo 路径。
read-git-file:读取 clone-git-repo 任务拉取的 Git 仓库中的文件。 - clone-repo 任务
这个任务使用 alpine 镜像,首先安装 git,然后通过 git clone 命令将 Git 仓库克隆到容器的 /tmp/repo 路径下。
它将 /tmp/repo 目录作为 artifact 输出,名为 repo-artifact。 - print-file 任务
这个任务从 clone-repo 任务中获取名为 repo-artifact 的 artifact。
它将 Git 仓库中的文件读取并通过 cat 命令输出。你可以根据需要修改路径和文件名(例如 cat /tmp/git-files/.txt)。 - depends 和 arguments
read-git-file 任务依赖于 clone-git-repo 任务,因此设置了 depends: “clone-git-repo”。
通过 arguments 传递 artifact,from: “{{tasks.clone-git-repo.outputs.artifacts.repo-artifact}}” 表示 read-git-file 任务将从 clone-git-repo 任务的输出中获取文件。
使用 Kubernetes Persistent Volumes(通过 volumeClaimTemplates)以及任务之间如何共享数据
在 Argo Workflows 中,使用 Persistent Volume Claim (PVC) 来共享文件是一个常见的场景。PVC 允许不同的任务或 Pod 之间共享持久存储,因此可以实现文件共享。下面是如何通过 PVC 在 Argo Workflows 中共享文件的步骤和示例。
-
创建 PVC(Persistent Volume Claim)
你可以通过 volumeClaimTemplates 来在 Argo Workflow 中动态创建 PVC。这个 PVC 会被多个任务或容器共享。 -
配置 Argo Workflow 使用 PVC
在 Argo Workflow 中,volumeClaimTemplates 用于定义和创建 PVC。然后,通过 volumeMounts 将 PVC 挂载到容器中,使得任务可以访问共享的存储。 -
示例:通过 PVC 共享文件
假设我们有两个任务:一个任务负责将文件克隆到 PVC 中,另一个任务从 PVC 中读取这些文件并处理。创建文件volume.yaml
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:generateName: pvs-demo-
spec:entrypoint: mainvolumeClaimTemplates:- metadata:name: shared-workdir # 共享的 PVC 名称spec:accessModes: ["ReadWriteMany"] # 多个 Pod 可以同时读取和写入resources:requests:storage: 1Gitemplates:- name: maindag:tasks:- name: git-clonetemplate: git-clone- name: process-filestemplate: process-filesdependencies: [git-clone] # 依赖 git-clone 任务- name: git-clonecontainer:image: alpinecommand: [sh, -c]args:- |echo 'Cloning repository...'apk add --no-cache gitgit clone https://gitee.com/qfxcoffee/shield.git /srcls -la /srccp -r /src/. /mnt/ # 将文件复制到挂载的 PVC 中volumeMounts:- name: shared-workdir # 挂载 PVCmountPath: /mnt # 挂载到容器的 /mnt 目录- name: process-filescontainer:image: alpinecommand: [sh, -c]args:- |echo 'Processing files...'ls -la /mnt # 查看挂载的目录内容# 可以在这里对文件进行处理,例如文本替换、文件处理等volumeMounts:- name: shared-workdir # 挂载相同的 PVCmountPath: /mnt # 挂载到容器的 /mnt 目录
解释:
volumeClaimTemplates:
这里定义了一个名为 shared-workdir 的 PVC,使用了 accessModes: [“ReadWriteMany”],这意味着多个 Pod 可以同时读写该 PVC。
它会在 Workflow 运行时自动创建 PVC。
PVC 的存储请求为 1Gi,表示需要 1GB 的存储空间。
git-clone 任务:
该任务使用 git clone 命令从 Git 仓库克隆文件,并将其复制到挂载的 PVC (/mnt) 中。
使用 volumeMounts 将 PVC 挂载到容器的 /mnt 目录,这样文件就可以存储在 PVC 中并供其他任务访问。
process-files 任务:
该任务使用 ls 查看挂载到 /mnt 目录中的文件,并可以对其进行进一步的处理(例如分析或转换文件内容)。
同样通过 volumeMounts 将 PVC 挂载到 /mnt 目录,以便访问文件。
-
共享文件的工作原理
同一个 PVC:通过 volumeClaimTemplates 创建的 PVC 在 Workflow 中的多个任务之间共享。
不同任务共享同一个 PVC:多个任务可以通过 volumeMounts 将该 PVC 挂载到容器中,提供一个共享的文件存储区域。
ReadWriteMany 模式:accessModes 设置为 ReadWriteMany,这允许多个 Pod 同时访问和写入该 PVC(通常要求支持该模式的存储后端,如 NFS 或某些云存储)。 -
注意事项
存储后端支持:确保你使用的存储后端(如 NFS、GlusterFS、Ceph 等)支持 ReadWriteMany 模式。如果使用 ReadWriteOnce,则只能有一个 Pod 进行写入。
PVC 清理:通过 volumeClaimTemplates 创建的 PVC 会在 Workflow 完成后被自动清理。如果你希望保留 PVC,可以通过手动创建 PVC 或修改 persistentVolumeReclaimPolicy 来实现。