运用 Argo Workflows 协调 CI/CD 流水线

Argo Workflows 是一个开源的容器原生工作流引擎,用于协调 CI/CD 在 Kubernetes 中的运作。它以 Kubernetes 自定义资源(CRD)的形式实现,使开发人员能够创建自定义 API 对象,以兼容的方式扩展 Kubernetes 的功能。

选择 Argo Workflows 的原因

Argo Workflows 旨在运行于 Kubernetes 之上,而非虚拟机或云服务等其他平台。让我们用一分钟时间来强调一下使用 Kubernetes 作为 Argo Workflows 运行平台的优点和缺点。

Argo Workflows 是以 Kubernetes 自定义资源定义(CRD)的形式实现的,它使你能够:

  • 为工作流中的每个步骤使用单独的容器来定义 Kubernetes 工作流。
  • 使用有向无环图 (DAG) 建立工作流模型,捕捉多个步骤之间的依赖关系
  • 快速轻松地运行计算密集型数据处理或机器学习任务。
  • 无需配置复杂的应用程序开发解决方案,即可在 Kubernetes 上以本地方式运行 CI/CD 流水线。

使用 Argo Workflows 进行 CI/CD

如果您有以下需求,Argo Workflows 将满足您的需求:

  • 灵活处理容器崩溃和故障
  • 同时管理大量工作流的自动扩展选项。
  • 全面的企业功能,如基于角色的访问控制(RBAC)和单点登录(SSO)。

但若出现以下情况,您则可能需要避免使用 Argo Workflows:

  • 随着工作流数量和基础设施需求的增长,YAML 文件维护的复杂性可能会增加,尽管 Argo 提供了管理这方面的技巧和模板功能。
  • 您的团队没有容器和 Kubernetes 方面的经验。
  • 您需要维护完整的企业设置,这涉及到管理大量的配置选项。

了解 Argo Workflows 的关键组成部分

Argo Workflows 的核心概念包括定义和存储实时的 Kubernetes CRD 对象,这些对象将指定在适当状态下执行工作流。

例如 workflow.spec,它包含一个模板列表和一个作为主要功能或第一个要执行的模板的 entrypoint

模板被定义为函数,可以有多种类型,如 containers, scriptresource templates

容器模板是最常用的模板。脚本模板允许定义脚本,然后执行脚本。资源模板可处理请求,而暂停模板可在规定时间内暂停工作流程的执行,并可使用 Argo UI 恢复执行。模板本身使用嵌套列表依次或并行运行,可根据不同设置进行自定义。

安装

为了开始安装,我们需要在机器上下载 Argo Workflows 二进制文件并保存:

ruby 复制代码
$ curl -sLO https://github.com/argoproj/argo-workflows/releases/download/v3.4.5/argo-darwin-amd64.gz

接下来,我们需要解压从上述命令下载的文件:

ruby 复制代码
$ gunzip argo-darwin-amd64.gz

完成所有步骤后,我们需要修改该文件的权限,使其可以作为程序运行。这样就可以直接从命令行执行 argo 命令:

shell 复制代码
$ chmod +x argo-darwin-amd64

完成上述操作后,我们需要将该文件从当前目录移至/usr/local/bin 目录:

bash 复制代码
mv ./argo-darwin-amd64 /usr/local/bin/argo

这样就可以在终端的任意位置执行 argo 命令。若要验证 Argo Workflows 是否安装成功,请运行以下命令:

ruby 复制代码
$ argo version

输出结果将显示已安装的版本号,表明一切正常。

运行示例应用程序

在本节中,我们将使用 Argo Workflows 部署一个带有简单 Python 应用程序的工作流。我们将首先定义构建步骤,然后创建一个工作流来部署和测试应用程序。我们将在本地 minikube 集群上完成所有这些工作,在本地计算机上运行以下命令即可:

ruby 复制代码
$ minikube start

我们现在应该可以应用下面的 Kubernetes 清单文件,该文件将创建 Argo Workflows 所需的各种 Kubernetes 资源:

ruby 复制代码
$ kubectl apply -n argo -f https://github.com/argoproj/argo-workflows/releases/download/v3.4.5/install.yaml

我们已经拥有了开始工作所需的一切,我们的集群现在已经拥有了:

  • 创建和运行工作流所需的(CRD) 。
  • 用于安全、受控地访问 Kubernetes 资源的 RBAC
  • 负责执行工作流的 ConfigMap
  • 我们还设置了一个优先级类别 PriorityClass,以确保 Argo Workflow 控制器具有更高的优先级,并拥有在集群中运行所需的资源。

需要注意的是,Argo Workflows 将使用 YAML 文件定义 CI/CD 工作流程,并指定以下内容:

  • 步骤:您可以添加各种构建步骤,可以是一个,也可以是多个。
  • 依赖项:可以添加运行工作流程所需的任何依赖项。
  • 参数:使您能够自定义工作流程的行为,您可以使用输入参数并将其传入以触发工作流程。为您提供所需的灵活性,并使其可重复使用。

既然已经了解了 Argo Workflows 的功能,我们就可以开始以代码的形式创建和管理我们的工作流了。让我们用三个步骤(deployingteasing,and building)创建一个 Python 3 应用程序工作流。首先,在 app 目录下创建名为 python-app.yaml 的文件,并添加工作流定义:

yaml 复制代码
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  name: python-app
spec:
  entrypoint: python-app
  templates:
  - name: python-app
    steps:
    - - name: build
        template: build
    - - name: test
        template: test
    - - name: deploy
        template: deploy
  - name: build
    container:
      image: python:3.11
      command: [python]
      args: ["-c", "print('build')"]
  - name: test
    container:
      image: python:3.11
      command: [python]
      args: ["-m", "unittest", "discover", "-s", "/app/tests"]
      volumeMounts:
      - name: test-volume
        mountPath: /app/tests
    volumes:
    - name: test-volume
      hostPath:
        path: /path/to/tests
  - name: deploy
    container:
      image: python:3.11
      command: [python]
      args: ["-c", "print('deploy')"]

在这个例子中,Workflow CRD 定义了 CI/CD 流水线,模板中的每个步骤都有特定的目的:

  • 构建步骤使用最新更改构建镜像,本演示使用的是 Python 3.11 镜像。
  • 测试步骤挂载包含测试文件的卷,并使用 Python unittest 库运行单元测试。
  • 部署步骤运行 Python 容器并打印部署。通常,这一步需要将测试代码推送到容器注册中心,如 AWS ECR 或 Harbor,然后部署到生产环境。

要应用该文件,可以使用 kubectl apply 命令,并在 -f 标志后加上 YAML 文件的路径。下面是一个命令示范:

ruby 复制代码
$ kubectl apply -f python-app.yaml

这将创建一个名称为 python-app 的 Argo Workflows,以及相应的模板和步骤。

现在,让我们执行 argo get 命令来获取有关工作流的信息,包括其状态和日志:

vbnet 复制代码
$ argo get python-app
Name:                python-app
Namespace:           default
ServiceAccount:      unset (will run with the default ServiceAccount)
Status:              Succeeded
Conditions:          
 PodRunning          False
 Completed           True
Created:             Mon Mar 20 16:23:06 -0500 (37 seconds ago)
Started:             Mon Mar 20 16:23:06 -0500 (37 seconds ago)
Finished:            Mon Mar 20 16:23:36 -0500 (7 seconds ago)
Duration:            30 seconds
Progress:            3/3
ResourcesDuration:   10s*(1 cpu),10s*(100Mi memory)

STEP           TEMPLATE    PODNAME                      DURATION  MESSAGE
 ✔ python-app  python-app                                           
 ├───✔ build   build       python-app-build-3831382643  4s          
 ├───✔ test    test        python-app-test-461837862    4s          
 └───✔ deploy  deploy      python-app-deploy-988129288  4s

Argo Workflows 的优势

Argo Workflows 是一款功能强大的工具,用于在容器化部署环境中管理和自动化复杂的工作流程。它具有多种优势,包括:

  • 轻松进行版本控制,并以代码形式修改工作流程。
  • 与 Argo Events 集成,可根据事件触发工作流程。
  • 自动重试和错误处理,实现可靠、稳健的工作流执行。
  • 与 Kubernetes 和其他容器协调平台无缝集成。
  • 支持并行和顺序工作流,从而实现更快、更高效的执行。
  • 广泛的监控和日志功能,包括与 Prometheus 和 Grafana 的集成。

结论

总之,如果您的 DevOps 团队希望简化复杂的容器化工作流程的管理和自动化,那么 Argo Workflows 是一款必不可少的工具。不过,在考虑是否使用它时,您应该先评估好团队的云端和 Kubernetes 经验、规模及增长目标。如果您正在 Kubernetes 上构建平台,Argo Workflows 也可以成为平台工程师构建抽象的好工具,从而缓解开发团队在维护 YAML 文件上的痛苦。

作为一款基于平台工程理念构建的应用部署管理平台,Walrus 已在最新版本中集成 Argo Workflows 作为工作流引擎,借助 Argo Workflows 自动化特性,用户可以在 Walrus 上实现一站式应用编排发布。另外,Walrus 中单一配置、多态运行的应用模型,可以让研发人员无需关注底层基础设施具体实现方式,实现了研发与运维关注点分离和自动化协作,进而屏蔽各类环境中基础设施的复杂度,降低研发人员的认知负担,进一步落地平台工程理念。

更多 Walrus 项目信息请参考:github.com/seal-io/wal...

相关推荐
一个处女座的程序猿1 小时前
AI之Agent之VibeCoding:《Vibe Coding Kills Open Source》翻译与解读
人工智能·开源·vibecoding·氛围编程
一只大侠的侠2 小时前
React Native开源鸿蒙跨平台训练营 Day16自定义 useForm 高性能验证
flutter·开源·harmonyos
IvorySQL3 小时前
PostgreSQL 分区表的 ALTER TABLE 语句执行机制解析
数据库·postgresql·开源
一只大侠的侠4 小时前
Flutter开源鸿蒙跨平台训练营 Day11从零开发商品详情页面
flutter·开源·harmonyos
一只大侠的侠4 小时前
React Native开源鸿蒙跨平台训练营 Day18自定义useForm表单管理实战实现
flutter·开源·harmonyos
一只大侠的侠4 小时前
React Native开源鸿蒙跨平台训练营 Day20自定义 useValidator 实现高性能表单验证
flutter·开源·harmonyos
晚霞的不甘4 小时前
Flutter for OpenHarmony 可视化教学:A* 寻路算法的交互式演示
人工智能·算法·flutter·架构·开源·音视频
广州中轴线5 小时前
OpenStack on Kubernetes 生产部署实战(十三)
容器·kubernetes·openstack
晚霞的不甘6 小时前
Flutter for OpenHarmony 实现计算几何:Graham Scan 凸包算法的可视化演示
人工智能·算法·flutter·架构·开源·音视频
猫头虎6 小时前
OpenClaw-VSCode:在 VS Code 里玩转 OpenClaw,远程管理+SSH 双剑合璧
ide·vscode·开源·ssh·github·aigc·ai编程