ArgoCD开启prune/selfheal删除Helm App后资源未清理
问题根因与解决方法
1. 配置prune自动同步但资源未随应用删除的原因,以及自动清理配置方式
syncPolicy.automated.prune: true 只在Application资源本身存在、执行同步操作时生效,作用是同步过程中自动清理Git清单里已经移除的资源,和删除ArgoCD Application时的级联清理逻辑完全无关。
资源残留的直接原因:
- 你的Application没配置ArgoCD的资源清理finalizer。默认情况下删除ArgoCD Application CR时,只会删掉ArgoCD系统里的应用记录,不会碰这个应用下发到集群的业务资源。只有在Application的
metadata.finalizers里加上resources-finalizer.argocd.argoproj.io,ArgoCD才会在删Application CR之前,先把它管理的所有集群资源清干净。 - App of Apps模式下删根应用时,默认级联规则只会删掉子Application的CR,不会触发子应用的资源清理,除非子应用本身配了上面说的finalizer。另外你之前遇到PVC绑定失败,子应用一直处于
Degraded异常状态,ArgoCD没跑完过一次全量成功同步,本地缓存没记全已经下发的资源,也会导致删的时候漏资源。
实现自动清理的配置方法: - 给根应用、所有子应用的Application清单统一加上finalizer配置,示例:
metadata: finalizers: - resources-finalizer.argocd.argoproj.io
- 删应用时确保级联传播策略设为
Foreground,不要用Orphan:用CLI删就加--cascade参数,用UI删就勾上弹窗里的级联删除选项。 - 如果用ApplicationSet生成子应用,直接在ApplicationSet的模板里统一注入这个finalizer就行,不用每个子应用单独配。
2. helm list无结果、未生成Helm Release的原因
这是ArgoCD部署Helm应用的默认行为,不是故障:
ArgoCD对接Helm Chart默认走 模板渲染模式:它只在自己的控制面拉取Chart、配好values执行helm template把所有K8s资源yaml渲出来,然后直接把这些yaml apply到目标集群,全程不会调用Helm原生的install/upgrade接口,也不会在集群里存Helm Release对应的Secret记录,所以helm list当然查不到任何Release。
如果需要让ArgoCD走原生Helm部署流程,生成能被helm list查到的Release,要在Application的Helm源配置里开useReleaseManager: true(ArgoCD v2.6及以上版本支持),开了之后ArgoCD会用Helm原生SDK管应用生命周期,删的时候也会走Helm的卸载逻辑。但要注意,就算开了这个配置,不配置前面说的资源finalizer,删Application的时候还是会残留资源。
内容的提问来源于stack exchange,提问作者Alex K
相关产品推荐
相关产品推荐

