You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何仅修改Deployment模板元数据时ArgoCD会回收所有资源?

问题解决思路

核心原因

你遇到的问题根源在于ArgoCD的selfHeal: true全局自动修复配置,结合prune: true的修剪策略:当你手动修改Deployment的哈希注解后,ArgoCD会强制将所有关联资源的集群状态与Git期望状态对齐——哪怕Ingress、Service这类资源本身没有Git变更,只要集群中存在Git未定义的字段(比如ALB控制器自动添加的注解),ArgoCD就会判定这些资源为OutOfSync,进而触发更新甚至修剪;而kubectl apply仅处理你指定的资源,不会主动覆盖或删除未提及的资源字段,因此不会影响其他资源。

调整ArgoCD配置的解决方案

1. 给无关资源添加同步豁免注解

针对Ingress、Service等无需随Deployment变动的资源,添加ArgoCD专属注解,避免不必要的同步操作:

  • 保留集群自动生成的字段(如ALB控制器注解),防止ArgoCD覆盖:
    metadata:
      annotations:
        argocd.argoproj.io/sync-options: PreserveUnknownFields=true
    
  • 完全跳过自动同步(仅在初始部署时创建,后续不干预):
    metadata:
      annotations:
        argocd.argoproj.io/hook: skip
    

2. 优化全局同步策略

修改syncPolicy配置,缩小同步范围:

  • 添加ApplyOutOfSyncOnly=true选项,让ArgoCD仅同步与Git状态不一致的资源,而非遍历所有应用资源:
    syncOptions:
        - Validate=false
        - PrunePropagationPolicy=foreground
        - PruneLast=true
        - ApplyOutOfSyncOnly=true
    
  • 若无需全局自动修复所有资源差异,可暂时关闭selfHeal: true(但需注意这会影响其他资源的自动自愈能力,建议优先用资源注解豁免的方式)。

3. 修正资源关联逻辑

检查应用的资源选择器与所有关联资源的标签是否匹配,确保Ingress、Service等资源被正确识别为当前应用的一部分,避免ArgoCD误判为“无关资源”而修剪。

替代方案:替换手动哈希注解方式

无需第三方控制器,用Kustomize自动注入ConfigMap哈希,彻底避免手动修改Deployment的操作:
在Kustomization.yaml中配置自动哈希生成:

configMapGenerator:
  - name: your-configmap-name
    files:
      - config-file.yaml
generatorOptions:
  annotations:
    app.dev/configmapHash: $(hash)

Kustomize会自动计算ConfigMap的哈希并更新注解,ArgoCD同步时仅会变更Deployment资源,不会触发其他资源的异动。


内容的提问来源于stack exchange,提问作者jlim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 19:19:57