首页/新闻资讯/正文详情

Argo Workflows VolumeClaimGC 详解:Workflow 完成后自动清理 PVC 的策略配置与源码剖析

发布时间:2026/9/23 10:31:29 来源:云帆数科 栏目:资讯中心
Argo Workflows VolumeClaimGC 详解:Workflow 完成后自动清理 PVC 的策略配置与源码剖析
Argo Workflows VolumeClaimGC 详解Workflow 完成后自动清理 PVC 的策略配置与源码剖析【免费下载链接】argo-workflowsWorkflow Engine for Kubernetes项目地址: https://gitcode.com/gh_mirrors/ar/argo-workflows本篇文章以 Argo Workflows 的VolumeClaimGCAPI 类型为线索深入讲解如何在 Workflow 结束后自动回收由volumeClaimTemplates动态创建的持久卷声明PersistentVolumeClaimPVC。读完本文你将掌握volumeClaimGC.strategy两种策略OnWorkflowCompletion与OnWorkflowSuccess的语义差异、默认行为、实际 YAML 配置方式以及控制器底层删除 PVC 的实现逻辑与测试验证方法。一、为什么需要 VolumeClaimGC在 Argo Workflows 中你可以通过 Workflow 级别的volumeClaimTemplates字段为任务动态申请持久化存储。控制器会在 Workflow 运行时为每个模板创建对应的 PVC并将其挂载到 Pod 中。这些 PVC 的生命周期默认与所属 Workflow 绑定通过 ownerReference 关联。问题在于Workflow 结束后这些 PVC 并不会自动消失。如果不做清理每次运行都会遗留一批 PVC日积月累会耗尽集群存储配额、产生费用也增加运维负担。为此Argo Workflows 在WorkflowSpec中提供了volumeClaimGC字段专门描述如何从已完成的 Workflow 中删除卷PVC。从源码看该字段定义在WorkflowSpec中位于 pkg/apis/workflow/v1alpha1/workflow_types.go// VolumeClaimGC describes the strategy to use when deleting volumes from completed workflows VolumeClaimGC *VolumeClaimGC json:volumeClaimGC,omitempty protobuf:bytes,36,opt,namevolumeClaimGC,casttypeVolumeClaimGC与之对应的 CRD schema 也同步生成于 manifests/base/crds/full/argoproj.io_workflows.yamlWorkflow、WorkflowTemplate、CronWorkflow、ClusterWorkflowTemplate 四类资源的 CRD 中均有volumeClaimGC定义。二、VolumeClaimGC 结构唯一的 strategy 字段Java SDK 生成的 API 文档即本文依据的原始文档sdks/java/client/docs/IoArgoprojWorkflowV1alpha1VolumeClaimGC.md指出VolumeClaimGC类型只包含一个属性其字段结构如下名称类型描述备注strategyString回收策略取值只能是OnWorkflowCompletion或OnWorkflowSuccess默认值为OnWorkflowSuccess可选字段对应的 Go 类型定义位于 pkg/apis/workflow/v1alpha1/workflow_types.go// VolumeClaimGC describes how to delete volumes from completed Workflows type VolumeClaimGC struct { // Strategy is the strategy to use. One of OnWorkflowCompletion, OnWorkflowSuccess. Defaults to OnWorkflowSuccess Strategy VolumeClaimGCStrategy json:strategy,omitempty protobuf:bytes,1,opt,namestrategy,casttypeVolumeClaimGCStrategy }而VolumeClaimGCStrategy是一个字符串枚举类型两个合法的取值定义在同文件 workflow_types.go// VolumeClaimGCStrategy is the strategy to use when deleting volumes from completed workflows type VolumeClaimGCStrategy string const ( VolumeClaimGCOnCompletion VolumeClaimGCStrategy OnWorkflowCompletion VolumeClaimGCOnSuccess VolumeClaimGCStrategy OnWorkflowSuccess )此外VolumeClaimGC还提供了便捷方法GetStrategy()当strategy未设置时返回默认值OnWorkflowSuccess见 workflow_types.go。三、两种策略的语义与默认行为3.1OnWorkflowSuccess默认PVC 只在 Workflow成功Succeeded时被删除。如果 Workflow 失败Failed或出错ErrorPVC 会被保留下来。这样设计的核心动机是为重试复用存储失败的 Workflow 往往会被 retry/resubmit保留 PVC 可以继续使用其中已经写入的数据如中间产物、断点数据避免数据丢失。3.2OnWorkflowCompletion只要 Workflow进入终态Completed即成功、失败或出错无论结果如何都会删除 PVC。适合对数据不敏感、用完即弃的场景。3.3 未配置时的默认行为如果在 Workflow spec 中完全没有设置volumeClaimGC控制器会按OnWorkflowSuccess处理。这一点由WorkflowSpec.GetVolumeClaimGC()方法保证workflow_types.go// GetVolumeClaimGC returns the VolumeClaimGC that was defined in the workflow spec. If none was provided, a default value is returned. func (wfs WorkflowSpec) GetVolumeClaimGC() *VolumeClaimGC { // If no volumeClaimGC strategy was provided, we default to the equivalent of OnSuccess // to match the existing behavior for back-compat if wfs.VolumeClaimGC nil { return VolumeClaimGC{Strategy: VolumeClaimGCOnSuccess} } return wfs.VolumeClaimGC }注意源码注释中的back-compat也就是说在引入volumeClaimGC字段之前Argo Workflows 的既有行为就是在 Workflow 成功时清理 PVC默认值的选择是为了保持向后兼容避免破坏老用户的工作流。四、控制器底层实现deletePVCs 的执行逻辑真正执行 PVC 删除的是 workflow-controller 中wfOperationCtx.deletePVCs()方法位于 workflow/controller/operator.gofunc (woc *wfOperationCtx) deletePVCs(ctx context.Context) error { gcStrategy : woc.execWf.Spec.GetVolumeClaimGC().GetStrategy() switch gcStrategy { case wfv1.VolumeClaimGCOnSuccess: if woc.wf.Status.Phase ! wfv1.WorkflowSucceeded { // Skip deleting PVCs to reuse them for retried failed/error workflows. // PVCs are automatically deleted when corresponded owner workflows get deleted. return nil } case wfv1.VolumeClaimGCOnCompletion: default: return fmt.Errorf(unknown volume gc strategy: %s, gcStrategy) } ... }这段代码揭示了两个关键事实OnWorkflowSuccess的判定只有woc.wf.Status.Phase WorkflowSucceeded时才会继续删除流程否则直接返回。注释明确说明跳过删除是为了在重试失败/出错的 Workflow 时复用 PVC且这些 PVC 会随所属 Workflow 被删除ownerReference 机制而自动清理。OnWorkflowCompletion不做阶段判断无论最终阶段是成功、失败还是错误都会进入后续的删除逻辑未知的策略值会直接返回错误unknown volume gc strategy。继续往下看operator.go删除过程会遍历woc.wf.Status.PersistentVolumeClaims列表逐个调用 Kubernetes 客户端删除 PVC并记录第一个遇到的错误totalPVCs : len(woc.wf.Status.PersistentVolumeClaims) if totalPVCs 0 { // PVC list already empty. nothing to do return nil } pvcClient : woc.controller.kubeclientset.CoreV1().PersistentVolumeClaims(woc.wf.Namespace) newPVClist : make([]apiv1.Volume, 0) // Attempt to delete all PVCs. Record first error encountered var firstErr error for _, pvc : range woc.wf.Status.PersistentVolumeClaims { woc.log.WithField(pvcName, pvc.PersistentVolumeClaim.ClaimName).Info(ctx, deleting pvc) err : pvcClient.Delete(ctx, pvc.PersistentVolumeClaim.ClaimName, metav1.DeleteOptions{}) if err ! nil { if !apierr.IsNotFound(err) { // 删除失败保留在列表中以便后续重试并记录第一个错误 newPVClist append(newPVClist, pvc) ... } } }其中Status.PersistentVolumeClaims是控制器在 PVC 创建成功后被追加到 Workflow 状态中的卷列表见 operator.go也是 Workflow 完成后能够精确找到自己创建的 PVC 的依据。apierr.IsNotFound(err)的处理意味着如果某个 PVC 已经被删除例如被外部清理控制器不会把它当作错误而是静默跳过。此外删除前如果环境变量ARGO_REMOVE_PVC_PROTECTION_FINALIZER未设置为false控制器还会主动移除 PVC 上的kubernetes.io/pvc-protectionfinalizer以避免 PVC 因保护机制卡在 Terminating 状态无法被真正删除见 operator.go。五、实战配置YAML 示例与逐步说明下面是一个完整可运行的配置示例结构与控制器单元测试TestVolumeGCStrategy中使用的 Workflow 模板一致见 workflow/controller/operator_test.goapiVersion: argoproj.io/v1alpha1 kind: Workflow metadata: name: workflow-with-volumes spec: entrypoint: workflow-with-volumes volumeClaimGC: strategy: OnWorkflowCompletion # 或 OnWorkflowSuccess默认值 volumeClaimTemplates: - metadata: name: claim-vol spec: accessModes: [ ReadWriteOnce ] resources: requests: storage: 1Gi volumes: - name: existing-vol persistentVolumeClaim: claimName: my-existing-volume templates: - name: workflow-with-volumes script: image: python:alpine3.23 command: [python] volumeMounts: - name: claim-vol mountPath: /mnt/vol - name: existing-vol mountPath: /mnt/existing-vol source: | print(hello world)配置要点说明spec.volumeClaimGC.strategy选择回收策略合法值仅OnWorkflowCompletion与OnWorkflowSuccess省略时等价于OnWorkflowSuccess。spec.volumeClaimTemplates声明需要动态创建的 PVC 模板控制器会为每个模板创建名为workflow-name-template-name的 PVC如上述示例中的workflow-with-volumes-claim-vol并在 Workflow 状态中登记。spec.volumes可以同时挂载外部已有的 PVC如上例的my-existing-volume。需要注意VolumeClaimGC 只删除由volumeClaimTemplates动态创建、并登记在Status.PersistentVolumeClaims中的 PVC不会删除用户预先创建的外部 PVC避免误删共享存储。该字段同样适用于 WorkflowTemplate、CronWorkflow 与 ClusterWorkflowTemplate 中的 Workflow spec 部分SDK 文档 IoArgoprojWorkflowV1alpha1WorkflowSpec.md 也列出了volumeClaimGC为可选属性。在 WorkflowTemplate 与 Workflow 合并时volumeClaimGC属于被合并的字段之一见 workflow/util/merge.go因此可以在模板中预设回收策略再由具体 Workflow 覆盖。六、测试验证四种组合的行为矩阵控制器单元测试 workflow/controller/operator_test.go 的TestVolumeGCStrategy用表驱动的方式覆盖了策略 × 最终阶段的四种组合是理解 VolumeClaimGC 语义最直接的证据测试用例名称strategyWorkflow 最终阶段期望剩余 PVC 数failed / OnWorkflowCompletionOnWorkflowCompletionFailed0已删除failed / OnWorkflowSuccessOnWorkflowSuccessFailed1保留succeeded / OnWorkflowSuccessOnWorkflowSuccessSucceeded0已删除succeeded / OnWorkflowCompletionOnWorkflowCompletionSucceeded0已删除测试的核心断言是assert.Len(t, wf.Status.PersistentVolumeClaims, tt.expectedVolumesRemaining)——通过比较 Workflow 操作完成后Status.PersistentVolumeClaims列表的长度来验证 PVC 是否被清理。注意表中保留的用例其 PVC 并不会永久存在而是依赖 ownerReference当所属 Workflow 被删除时Kubernetes 会自动级联删除这些 PVC这也是源码注释中强调的兜底机制。七、与 PodGC、ArtifactGC、TTL 的定位差异volumeClaimGC与 Workflow 级别的其他回收机制同属生命周期资源清理体系但针对的对象和触发时机各不相同从 pkg/apis/workflow/v1alpha1/workflow_types.go 可以对照总结回收机制清理对象策略取值默认行为volumeClaimGC由 volumeClaimTemplates 创建的 PVCOnWorkflowCompletion/OnWorkflowSuccessOnWorkflowSuccesspodGC已完成的 PodOnPodCompletion/OnPodSuccess/OnWorkflowCompletion/OnWorkflowSuccess等不设置则不清除 PodartifactGC输出产物ArtifactsOnWorkflowCompletion/OnWorkflowSuccess/OnWorkflowDeletion/Never等策略未定义ttlStrategy整个 Workflow 资源按成功/失败后的存活秒数不设置则不过期实际使用时可根据存储成本与数据复用需求组合配置例如希望失败可重试、成功即清理保持默认OnWorkflowSuccess即可若存储昂贵、失败也不打算复用数据则显式设置OnWorkflowCompletion。八、注意事项与最佳实践默认值即最佳实践多数批处理场景下Workflow 成功后清理、失败后保留供重试正是OnWorkflowSuccess的语义因此不配置volumeClaimGC通常就已足够。失败重试依赖 PVC 保留如果为失败 Workflow 配置了OnWorkflowCompletion重试时将无法复用上次写入的卷数据请确认业务是否依赖中间结果。外部 PVC 不受影响VolumeClaimGC 只清理 Workflow 自己动态创建的 PVC共享或预置的 PVC 需要自行管理生命周期。删除是尽力而为的删除过程中会记录错误并保留未删成功的 PVC 条目以便后续重试不会阻塞 Workflow 终态推进同时控制器默认会移除 PVC 保护 finalizer可参考环境变量ARGO_REMOVE_PVC_PROTECTION_FINALIZER控制该行为设为false可关闭。Java SDK 对应类型在 Java 客户端中使用时对应模型类为IoArgoprojWorkflowV1alpha1VolumeClaimGC其唯一公开属性strategy为String类型可参考 IoArgoprojWorkflowV1alpha1VolumeClaimGC.md 的字段说明进行赋值。通过上述配置与源码印证你可以精准控制 Argo Workflows 中动态卷的生命周期在存储成本与数据复用之间找到适合自己业务的平衡点。【免费下载链接】argo-workflowsWorkflow Engine for Kubernetes项目地址: https://gitcode.com/gh_mirrors/ar/argo-workflows创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

C语言计算几何实战:从浮点误差到凸包实现
C语言计算几何实战:从浮点误差到凸包实现

1. 这不是数学课,是写代码时绕不开的“空间直觉”训练场计算几何学,这名字听起来像大学数学系的期末考题,但如果你正在用C语言写一个CAD插件、开发一个GIS地图渲染模块、做机器人路径规划,或者只是想让自己的游戏里碰撞检测不穿模… · 2026/9/23 10:31:29

Python+pygame制作小游戏--俄罗斯方块(双打)
Python+pygame制作小游戏--俄罗斯方块(双打)

前面讲解了Python+pygame制作小游戏--俄罗斯方块的完整过程和源码。 见Python+pygame制作小游戏--俄罗斯方块 Python+pygame制作小游戏--俄罗斯方块 源码 python+pygame制作小游戏--俄罗斯方块(双打)源码 那如果要实现在一台电脑上双打怎么实现呢?其实很容易。只要注意以… · 2026/9/23 10:31:23

输电线路缺陷检测YOLO实战:从数据整理到模型上线
输电线路缺陷检测YOLO实战:从数据整理到模型上线

简介:面向电力巡检与计算机视觉场景的YOLO输电线路数据集,提供3334张图像对应的标注信息,适合需要训练输电线路目标检测模型的算法工程师与研究者使用,可帮助识别电线、绝缘子、铁塔等关键部件。压缩包内共2000个XML标注文件&… · 2026/9/23 10:31:23

Pelican 多语言博客实践:从 `another_super_article-fr.rst` 解析 reST 翻译文章的元数据与语言路由
Pelican 多语言博客实践:从 `another_super_article-fr.rst` 解析 reST 翻译文章的元数据与语言路由

Pelican 多语言博客实践:从 another_super_article-fr.rst 解析 reST 翻译文章的元数据与语言路由 【免费下载链接】pelican Static site generator that supports Markdown and reST syntax. Powered by Python. 项目地址: https://gitcode.com/gh_mirrors/pe/pe… · 2026/9/23 14:10:30

WebRTC网页远程桌面监控实战:从采集到控制回传
WebRTC网页远程桌面监控实战:从采集到控制回传

简介:这是一套面向开发者与IT运维人员的WebRTC网页远程桌面监控方案,解决传统远程桌面软件需安装插件、兼容性差、延迟高等问题,适用于企业远程协助、教学观察与家庭电脑管理等场景。资源包共12个文件,约8.4MB,包含3个… · 2026/9/23 14:10:30

智能问答项目代码从入门到改造:模块拆解与避坑实战
智能问答项目代码从入门到改造:模块拆解与避坑实战

简介:这是一份面向智能问答系统开发与学习的项目代码与文档资源包,适合自然语言处理初学者、算法工程师以及希望搭建问答应用的开发者。压缩包大小约82MB,内含可直接运行的代码和体系化的说明文档。文档部分从整体架构讲到算法原理&#xff0… · 2026/9/23 14:10:30

企业架构落地实战:从业务能力到架构治理的实操指南
企业架构落地实战:从业务能力到架构治理的实操指南

企业架构这个词,我在不同场合听到过至少五种理解。做技术的人觉得它是画系统拓扑图的升级版,做管理的人觉得它是IT规划报告的另一种叫法,刚入行的朋友干脆把它等同于“企业里所有系统的清单”。这些理解都不算错,但都只摸到了象腿… · 2026/9/23 14:10:30

INA226功率检测实战:STM32驱动、I2C通信与精度优化
INA226功率检测实战:STM32驱动、I2C通信与精度优化

1. 为什么INA226在功率检测里这么能打功率检测这件事,说穿了就是同时抓住电压和电流两条线,再把它们乘起来。听起来简单,但真要做到精度够、漂移小、还能实时读出数据,选对芯片就成功了一半。INA226这颗料在圈子里口碑一直很稳&am… · 2026/9/23 14:10:29

超声肾脏图像分割实战:Unet++跨模态泛化与调优指南
超声肾脏图像分割实战:Unet++跨模态泛化与调优指南

简介:本资源面向医学图像处理方向的开发者与研究者,提供一套基于Unet的超声图像跨模态肾脏语义分割完整方案,可用于论文复现、课程设计或算法对比实验。压缩包共约2000个文件,以1993张png图像及对应标签为主体,另含5个… · 2026/9/23 14:10:22

3招搞定手机怎么下载微信面试难题实战项目解析
3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧
Win7无线热点配置工具源码解析:解决API失效的3个实战技巧

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧 Win7无线热点配置工具在Win10/11上跑不动?不是你的问题,是版本升级后 API 全变了。很多老项目里的 netsh wlan… · 2026/9/23 0:00:36

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码