Skip to main content

Command Palette

Search for a command to run...

在 Argo workflow 中使用 OBS 进行制品传递

Updated
3 min read

在所有的通用工作流中,都会有文件传递的需求,Argo workflow 中,可以通过对接外部存储来支持这一需求。下面就以华为云为例,展示一下对接对象存储的过程。

OBS 侧配置

首先在 OBS 服务中创建一个存储桶,并在控制台的用户->我的凭证->访问密钥模块中,创建一个访问密钥,并下载凭据文件,凭据文件格式大致如下所示:

User Name,Access Key Id,Secret Access Key
"myusername",Y9C3WCABCDEFG,6bHX5eHIJKLMN

Argo workflow 配置

使用文件中的 Access Key 和 Secret Access Key ,在Workflow 所在的 Namespace 中创建 Kubernetes Secret。例如:

$ kubectl create secret generic s3-secret \
    --from-literal accessKey=Y9C3WCABCDEFG \
    --from-literal secretKey=6bHX5eHIJKLMN
...

接下来需要修改 Argo workflow 的配置文件,加入对制品的支持内容:

  artifactRepository: |
    archiveLogs: true
    s3:
      endpoint: obs.[Region ID].myhuaweicloud.com
      bucket: [Bucket Name]
      region: cn-north-4
      insecure: false
      keyFormat: "my-artifacts\
        /{{workflow.creationTimestamp.Y}}\
        /{{workflow.creationTimestamp.m}}\
        /{{workflow.creationTimestamp.d}}\
        /{{workflow.name}}\
        /{{pod.name}}"

      accessKeySecret:
        name: s3-secret
        key: accessKey
      secretKeySecret:
        name: s3-secret
        key: secretKey
      useSDKCreds: false

上面的配置大致解释一下:

  1. 在 OBS 中存储 Pod 日志

  2. 使用了华为云北京四 Region 的 OBS 端点。

  3. 需要引用前面创建的存储桶名称

  4. 使用加密方式进行访问

  5. 制品的存储路径模板为:my-artifacts/实例创建时间(年/月/日)/实例名称/步骤所在 Pod 名称/

  6. Access Key 引用 Kubernetes Secret 中名为 s3-secretaccessKey 字段

  7. Secret Key 引用 Kubernetes Secret 中名为 s3-secretsecretKey 字段

将上述内容加入 Argo workflow 所在命名空间的 workflow-controller-configmap

启动工作流

尝试启动一个使用制品能力的工作流,清单内容来自https://argo-workflows.readthedocs.io/en/latest/walk-through/artifacts/

这个流程模板中定义了两个工步:

生成制品

...
outputs:
  artifacts:
  # generate hello-art artifact from /tmp/hello_world.txt
  # artifacts can be directories as well as files
  - name: hello-art
    path: /tmp/hello_world.txt

上述代码中,将 /tmp/hello_world.txt 内容作为制品,并命名为 hello-art

读取制品

inputs:
  artifacts:
  # unpack the message input artifact
  # and put it at /tmp/message
  - name: message
    path: /tmp/message

这段代码则是获取输入中名为 message 的制品,并解压到 /tmp/message 路径下。

执行时候,用 {{steps.generate-artifact.outputs.artifacts.hello-art}} 方式引用生成的制品。

执行

使用 Argo CLI 启动流程后,会看到类似如下的输出:

Name:                artifact-passing-mkn57
Namespace:           default
ServiceAccount:      argo-executor
Status:              Succeeded
...
STEP                       TEMPLATE                 PODNAME                                                    DURATION  MESSAGE
 ✔ artifact-passing-mkn57  artifact-example
 ├───✔ generate-artifact   hello-world-to-file      artifact-passing-mkn57-hello-world-to-file-551171166       8s
 └───✔ consume-artifact    print-message-from-file  artifact-passing-mkn57-print-message-from-file-1735545326  8s

这时如果返回 OBS 面板,会看到存储桶中,按照前面的路径规则存储了文件以及相关的日志(*.log)。

其他制品相关功能

覆盖仓库配置

前面我们在 Workflow Controller 配置文件中的配置,适用于单租户场景;多租户场景下,还可以通过 artifactRepositoryRef 方式,让每个流程可以使用自己的制品配置(https://argo-workflows.readthedocs.io/en/latest/artifact-repository-ref/)。

首先使用 Configmap 定义多个存储对接的参数,例如:

apiVersion: v1
kind: ConfigMap
metadata:
  # If you want to use this config map by default, name it "artifact-repositories". Otherwise, you can provide a reference to a
  # different config map in `artifactRepositoryRef.configMap`.
  name: my-artifact-repository
  annotations:
    # v3.0 and after - if you want to use a specific key, put that key into this annotation.
    workflows.argoproj.io/default-artifact-repository: default-v1-s3-artifact-repository
data:
  default-v1-s3-artifact-repository: |
    s3:
...
  v2-s3-artifact-repository: |
...

这段 YAML 中,提供了几个信息:

  1. 如果想要默认使用这个 Configmap 定义制品仓库,可以将其名称设置为 artifact-repositories

  2. 如果不是默认,就需要在 artifactRepositoryRef.configMap 中显示定义 Configmap 名称。

  3. v3.0 以后,可以用 workflows.argoproj.io/default-artifact-repository 注解定义这个 Configmap 中的默认仓库定义

  4. data 字段定义了两个制品仓库。

然后可以在 Workflow 中引用:

spec:
  artifactRepositoryRef:
    configMap: my-artifact-repository
    key: v2-s3-artifact-repository

垃圾回收

在 Workflow 的 spec.artifactGC 中,可以定义 Garbage Collection 的策略。可选策略包括 OnWorkflowCompletionOnWorkflowDeletion

存储驱动能力列表

除了 S3 之外,目前 Argo Workflow 支持的存储驱动能力如下:

(https://argo-workflows.readthedocs.io/en/latest/configure-artifact-repository/)

NameInputsOutputsGarbage CollectionUsage (Feb 2020)
ArtifactoryYesYesNo11%
Azure BlobYesYesYes-
GCSYesYesYes-
GitYesNoNo-
HDFSYesYesNo3%
HTTPYesYesNo2%
OSSYesYesNo-
RawYesNoNo5%
S3YesYesYes86%

More from this blog

龙虾恐慌:AIOps 又要改名了?

ChatGPT 开始,把 AI 拉近到普罗大众的面前,让无数人感受到 AI 的亲民魅力。而龙虾,则把大模型驱动的自动化能力,突然间变得水灵灵、活泼泼地走进千家万户。它不只是“风口上的猪”,而是风口本身。热度高到让 Mac mini 一度断货,不知道这在不在库克的预料之内。 每代人都有每代人的鸡蛋,春节期间,我就领了我的鸡蛋。翻出古老的 MacBook Air M1,充值各种大模型。当然了,这个工具

Mar 9, 20261 min read

再见 2025

我猜不少人以为这个号废了吧?并没有,只是今年变化有点大,一直有种抄起键盘,无从说起的感觉,所以一直偷懒到今天,2025 的最后一天。 今年是我的第四个本命年,去年末一期播客里,大内说本命年不是灾年,是变化年,有危也有机。可是讲真啊,只看到危,没看到机。 各种因缘际会,从鹅厂跳槽到前东家,已经接近四年,第一个合同期已经进入尾声。除了前两年还在云原生领域嗷嗷叫,后两年基本都是些鸡零狗碎的东西了,用老东家的术语说是——偏离主航道,可谓是前景暗淡了。 一旦确定要滚蛋,反倒心思轻松起来,每天骑着我的小红车...

Jan 5, 20261 min read

辅助编程?dora 说:我知道你很急可是请你别急

从 OpenGPT 把大模型的火烧旺了之后,这三年来,相信很多组织或摩拳擦掌、或躬身入局,希望借助聪明能干的大模型,或想偿还技术宅,或想降本增效,或想弯道超车。一时间,沉寂许久的 AIxx 又活过来了,LLM Ops、Vibe Coding、中医大模型、GPT 算命等等,全都老树发新芽,焕发了勃勃生机。那么视角拉回从业者最关注的饭碗相关的领域之一——AI 辅助开发,产生了什么触动,应该如何拥抱呢? DORA 的年度报告中给出了很有意思的结论——强者恒强。 执行摘要部分总结了几个有趣的点: 问题...

Oct 6, 20251 min read

[译]dora:ai 辅助软件开发状态报告

执行摘要 在 2025 年,科技领导者面临的核心问题已不再是“是否要采用 AI”,而是“如何实现其价值”。 DORA 的研究基于超过 100 小时的定性访谈和来自全球近 5,000 名技术专业人士的问卷调查。研究揭示了一个关键事实:AI 在软件开发中的主要角色是“放大器”。它会放大高效能组织的优势,也会凸显组织的缺陷。 关键结论:AI 是放大器 AI 投资的最大回报并非来自工具本身,而是来自组织底层系统的战略性建设: 高质量的内部平台 清晰的工作流 团队的协同能力 缺少这些基础,AI ...

Oct 2, 202514 min read

僭越了,有人在用 Rust 写 Kubernetes

一个新语言问世,最爱做的事情之一,就是重写存量软件了。 云原生喝酒 SIG 重点扶持项目——rk8s(https://github.com/rk8s-dev/rk8s) 也可以归在这个范畴里,只不过这个项目重写的东西比较大,是 Kubernetes。 从 2025 年 1 月第一个 Commit 开始,到现在有了 200 多次 Commit,十几万行代码。当然距离 Kubernetes 的几百万行代码还差得远——老马就是喜欢整这种大无畏项目。 另外该项目也是国内第一个脱离 Cargo 转向使用 ...

Sep 27, 20253 min read

【伪】架构师

342 posts