运用 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
, script
或 resource templates
。
容器模板是最常用的模板。脚本模板允许定义脚本,然后执行脚本。资源模板可处理请求,而暂停模板可在规定时间内暂停工作流程的执行,并可使用 Argo UI 恢复执行。模板本身使用嵌套列表依次或并行运行,可根据不同设置进行自定义。
安装
为了开始安装,我们需要在机器上下载 Argo Workflows 二进制文件并保存:
$ curl -sLO https://github.com/argoproj/argo-workflows/releases/download/v3.4.5/argo-darwin-amd64.gz
接下来,我们需要解压从上述命令下载的文件:
$ gunzip argo-darwin-amd64.gz
完成所有步骤后,我们需要修改该文件的权限,使其可以作为程序运行。这样就可以直接从命令行执行 argo 命令:
$ chmod +x argo-darwin-amd64
完成上述操作后,我们需要将该文件从当前目录移至/usr/local/bin 目录:
mv ./argo-darwin-amd64 /usr/local/bin/argo
这样就可以在终端的任意位置执行 argo 命令。若要验证 Argo Workflows 是否安装成功,请运行以下命令:
$ argo version
输出结果将显示已安装的版本号,表明一切正常。
运行示例应用程序
在本节中,我们将使用 Argo Workflows 部署一个带有简单 Python 应用程序的工作流。我们将首先定义构建步骤,然后创建一个工作流来部署和测试应用程序。我们将在本地 minikube 集群上完成所有这些工作,在本地计算机上运行以下命令即可:
$ minikube start
我们现在应该可以应用下面的 Kubernetes 清单文件,该文件将创建 Argo Workflows 所需的各种 Kubernetes 资源:
$ 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
的功能,我们就可以开始以代码的形式创建和管理我们的工作流了。让我们用三个步骤(deploying
,teasing
,and building
)创建一个 Python 3 应用程序工作流。首先,在 app 目录下创建名为 python-app.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 文件的路径。下面是一个命令示范:
$ kubectl apply -f python-app.yaml
这将创建一个名称为 python-app
的 Argo Workflows,以及相应的模板和步骤。
现在,让我们执行 argo get
命令来获取有关工作流的信息,包括其状态和日志:
$ 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 项目信息请参考:https://github.com/seal-io/walrus
运用 Argo Workflows 协调 CI/CD 流水线的更多相关文章
- 如何在 Jenkins CI/CD 流水线中保护密钥?
CI/CD 流水线是 DevOps 团队软件交付过程的基本组成部分.该流水线利用自动化和持续监控来实现软件的无缝交付.通过持续自动化,确保 CI/CD 流水线每一步的安全性非常重要.在流水线的各个阶段 ...
- devops-5:从0开始构建一条完成的CI CD流水线
从0开始构建一条完成的CI CD流水线 前文中已经讲述了静态.动态增加agent节点,以动态的k8s cloud为例,下面就以Maven构建Java程序为例,开始构建出一条完整的CI CD流水线. 实 ...
- Docker: Jenkins与Docker的自动化CI/CD流水线实战
什么是CI/CD 持续集成(Continuous Integration,CI):代码合并.构建.部署.测试都在一起,不断地执行这个过程,并对结果反馈.持续部署(Continuous Deployme ...
- Jenkins自动化CI CD流水线之1--介绍与安装
第1章 大纲 CI/CD, DevOps介绍 Git安装与使用 Jenkins安装与使用 权限管理 参数化构建 Master-Slave 流水线(Pipeline) 邮件通知 应用案例 自动发布PHP ...
- Jenkins自动化CI&CD流水线
1 环境说明 主机名称 IP cpu核数/内存/硬盘 安装软件 用途 controlnode 172.16.1.120 2/2/60 git 代码仓库 slavenode1 172.16.1.121 ...
- 使用 jenkins 搭建CI/CD流水线 (MAC)
如何搭建持续集成/持续交付平台?? 如何使用jenkins搭建持续交付流水线,以及和其他工具(如artifactory)集成?如何使用元数据,记录软件发布过程的构建信息,测试结果,并用rest Api ...
- Jenkins自动化CI CD流水线之8--流水线自动化发布Java项目
一.前提 插件:Maven Integration plugin 环境: maven.tomcat 用的博客系统代码: git clone https://github.com/b3log/solo. ...
- Jenkins自动化CI CD流水线之5--pipeline
一.概览 二.安装 在对jenkins进行初始化安装时,默认已经安装了jenkins的相关插件,如下图所示: 三.实操 新建任务: 编写pipeline脚本: 我们可以借助流水线语法去做. test流 ...
- jenkins自动化pipline的ci/cd流水线
pipeline { agent any tools { //工具必须预先在jenkins中预配置 maven 'mvn' jdk 'jdk' } stages { stage('Env') { st ...
- 容器平台自动化CI/CD流水线实践之一:环境概述
一.架构图
随机推荐
- [转帖]Kubernetes部署Minio集群存储的选择,使用DirectPV CSI作为分布式存储的最佳实践
Kubernetes部署Minio集群存储的选择,使用DirectPV CSI作为分布式存储的最佳实践 个人理解浅谈 1. 关于在kubernetes上部署分布式存储服务,K8s存储的选择 非云环境部 ...
- [转帖]Kafka需要知道的一些基础知识点
https://blog.csdn.net/daima_caigou/article/details/109101405 前言 kafka是常用MQ的一种,站在使用者的角度来看待,kafka以及所有的 ...
- [转帖]IO多路复用的三种机制Select,Poll,Epoll
I/O多路复用(multiplexing)的本质是通过一种机制(系统内核缓冲I/O数据),让单个进程可以监视多个文件描述符,一旦某个描述符就绪(一般是读就绪或写就绪),能够通知程序进行相应的读写操作 ...
- MySQL备份恢复简单处理方法
客户备份恢复的脚本处理简要如下: 首先登陆mysql服务器 方法如下: mysql -uroot -p 输入密码即可登陆 然后需要创建一个数据库, 个人感觉同名恢复最容易出问题 create data ...
- 范德蒙德矩阵行列式 & 循环矩阵行列式的证明
范德蒙德矩阵的行列式 \[\begin{vmatrix} 1 & 1 & 1 & \dots & 1 \\ x_1 & x_2 & x_3 & ...
- canvas操作图片像素点保证你看的明明白白
开场白 今天遇到一个场景:就是更改一个图片的颜色: 当听到这个.我直呼好家伙:这个是要上天了呀. 但是仔细一思考:借助canvas好像也能实现: 于是下来研究了一下,并不难: 我们下面来看看怎么实现的 ...
- vue3自定义指令(防抖指令)与vue3与vue2指令的对比
定义指令的变化 根据vue3文档的描述 https://v3.cn.vuejs.org/guide/migration/introduction.html#%E6%B8%B2%E6%9F%93%E5% ...
- vue结合elementUI折叠展开效果动画
组件 <template> <div class="hide-page-com"> <ul class="tab-tilte"&g ...
- 学到了,原来 gzip 是种`连续分块`的压缩算法
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 我想要表述的是:假设有 10 mb的数据使用 gzip 算 ...
- 英伟达系列显卡大解析B100、H200、L40S、A100、A800、H100、H800、V100如何选择,含架构技术和性能对比带你解决疑惑
英伟达系列显卡大解析B100.H200.L40S.A100.A800.H100.H800.V100如何选择,含架构技术和性能对比带你解决疑惑 近期,AIGC领域呈现出一片繁荣景象,其背后离不开强大算力 ...