🛡️ Argo CD 安全删除的守护者:Resources Finalizer 完整指南

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 中。

但是,请记住,删除操作务必谨慎!🛠️


Comments

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注