resources-finalizer.argocd.argoproj.io是Argo CD Application 资源中最重要的功能之一。
我将以博客形式详细解释此功能是否是Application资源本身的特性,以及为什么在生产环境中理解它至关重要。🚀
在使用Argo CD时,您是否曾遇到过删除应用程序后,其中的Pod或Service却依然存在的情况,让您感到困惑?或者,相反地,您是否曾有过删除应用程序后,整个集群的资源瞬间消失,让您不寒而栗的经历?
所有这些行为的核心设置就是 resources-finalizer.argoproj.io。今天,让我们掌握这个功能的本质和正确的使用方法!

1. 什么是 Finalizer? 🤔
在 Kubernetes 中,Finalizer 就像一个“删除前检查清单”。如果一个资源附加了 Finalizer,即使用户发出删除命令,它也不会立即消失,而是会等待(Pending)直到特定条件(清理工作)完成。
当您将此 Finalizer 注册到 Argo CD 的 Application 资源时,就如同向 Argo CD 控制器发出以下命令:
删除此 Application 时,请负责将所有受管理的子资源一并删除!
2. 为什么需要此功能? (级联删除) 🌊
默认情况下,当您在 Argo CD 中删除 Application 资源时,只会删除 Application 配置文件本身。部署在集群中的实际资源将变为“孤儿(Orphan)”状态并保留。
但是,使用 resources-finalizer 会激活
级联删除(Cascade Deletion)
。
- 没有 Finalizer 时: Application 删除 → 仅删除 Argo CD 配置 → 实际基础设施资源残留 (凌乱 🧹)
- 有 Finalizer 时: Application 删除 → Argo CD 开始删除实际资源 → 确认所有资源删除 → Application 最终删除 (整洁 ✨)
3. 实战代码:如何应用? 💻
只需将其添加到 Application 清单的 finalizers 字段中即可。
📝 Application YAML 示例
YAML
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: my-safe-app
namespace: argocd
finalizers:
# 这一行是关键!
# 指示在删除 Application 时一并删除子资源。
- resources-finalizer.argocd.argoproj.io
spec:
project: default
source:
repoURL: https://github.com/my-repo/manifests.git
targetRevision: HEAD
path: app-folder
destination:
server: https://kubernetes.default.svc
namespace: my-app-ns
4. 运维注意事项和技巧 (最佳实践) 🚨
① 资源删除顺序和依赖性
当 Finalizer 生效时,Argo CD 会考虑资源间的依赖关系来尝试删除。但有时特定资源(例如:Namespace)可能无法删除并陷入 Terminating 状态,此时 Application 资源也可能因此停滞而无法删除。
② 手动删除时的注意事项
如果您希望保留基础设施资源而仅删除 Argo CD 配置,则在发出删除命令之前,必须首先从 metadata.finalizers 列表中移除相应条目。否则,实际资源可能会意外消失。
③ 后台删除 vs 前台删除
默认情况下,Argo CD 尝试进行后台删除,但您也可以通过 Kubernetes 的 propagationPolicy 设置进行更精细的控制。
5. 总结表格 📊
| 特点 | 说明 |
| — | — |
| 适用对象 | Argo CD Application 自定义资源 |
| 核心作用 | 删除应用程序时同时删除子资源(Deployment, SVC 等) |
| 工作方式 | 利用 Kubernetes Finalizer 机制进行删除延迟和清理 |
| 推荐使用 | 测试环境或任何需要干净资源清理的场景 |
—
🏁 总结
resources-finalizer.argocd.argoproj.io 是一个非常强大的功能,负责 Argo CD Application 资源的生命周期管理。为了保持基础设施的整洁并防止资源泄漏,建议将其默认包含在几乎所有 Application 中。
但是,请记住,删除操作务必谨慎!🛠️
发表回复