如何在删除或损坏ApplicationSet时保留Application及资源?
解决ApplicationSet删除/损坏时保留Application的方案
首先纠正你当前的配置误区:你把preserveResourcesOnDeletion放在了ApplicationSet的syncPolicy.syncOptions里,但这个参数是Application级的同步选项,作用是让Application删除时保留其管理的K8s底层资源,而非控制ApplicationSet对Application的删除行为。
要实现你的需求,分两种核心场景处理:
一、删除ApplicationSet时保留生成的Application
在ApplicationSet的spec根层级添加preserveResourcesOnDeletion: true,这才是控制ApplicationSet删除时是否保留其生成的Application资源的关键配置。示例完整配置片段:
apiVersion: argoproj.io/v1alpha1 kind: ApplicationSet metadata: name: your-appset spec: preserveResourcesOnDeletion: true # 核心配置:放在spec根节点下 generators: # 你的生成器配置(如List、Cluster等) template: spec: syncPolicy: automated: selfHeal: true syncOptions: - Validate=true - CreateNamespace=true - preserveResourcesOnDeletion=true # 此配置作用于Application,保留其管理的底层资源
添加后,当ApplicationSet被删除时,所有由它生成的Application资源会被保留,不会被自动清理。
二、ApplicationSet损坏时避免Application被销毁
这里的“损坏”通常指ApplicationSet定义变更、控制器异常等导致其试图删除/修改已生成的Application,可通过以下方式防护:
- 关闭Application的自动修复:如果业务允许,将ApplicationSet模板中Application的
selfHeal设为false。这样即使ApplicationSet定义出现问题,控制器不会自动修改或删除已存在的Application,但代价是后续无法通过ApplicationSet自动同步Application的配置变更。 - 给Application添加保护注解与Finalizer:在ApplicationSet的模板中,为生成的Application添加防护注解和Finalizer,阻止意外删除:
template: metadata: annotations: argocd.argoproj.io/preserve-resources-on-deletion: "true" finalizers: - resources-finalizer.argocd.argoproj.io
- 解除Application与ApplicationSet的关联:如果需要长期保留某个Application,可以手动删除该Application上的
app.kubernetes.io/instance标签(标签值对应ApplicationSet的名称),之后ApplicationSet控制器会停止对该Application的管理,即使ApplicationSet损坏或删除,该Application也不受影响。
关键区分
- ApplicationSet层级的
preserveResourcesOnDeletion:控制ApplicationSet删除时是否保留其生成的Application资源。 - Application层级的
preserveResourcesOnDeletion:控制Application删除时是否保留其管理的Pod、Deployment等底层K8s资源。
内容的提问来源于stack exchange,提问作者Keet Sugathadasa
相关产品推荐
相关产品推荐

