在上一篇文章的快速体验中我曾提到,SYNC POLICY(同步策略)是ArgoCD中一个非常重要的配置选项。
SYNC POLICY的配置至关重要,它包含三个可多选的选项:
- ENABLE AUTO-SYNC(启用自动同步):即当Git仓库有新的提交时,自动触发并更新Kubernetes集群中的资源部署。
- PRUNE RESOURCES(清理资源):自动删除资源。例如,如果我将Git仓库中的Service配置文件删除,且勾选此选项,ArgoCD会自动删除Kubernetes中对应的Service资源。
- SELF HEAL(自我修复):强制以Git仓库中的配置为准。如果勾选,任何在Kubernetes集群中手动修改的配置都会被ArgoCD还原为Git仓库中定义的配置。
下面,我们将通过一系列实际操作来验证这三个选项在不同组合下的行为。
ENABLE AUTO-SYNC
关闭自动同步的验证
首先,我们测试关闭ENABLE AUTO-SYNC的情况。我将Git仓库中Deployment的副本数(replicas)修改为2,并提交了代码。

提交后,在ArgoCD的界面中可以看到,应用状态显示为“OutOfSync from HEAD”,表示ArgoCD已经检测到了仓库最新的提交(commit 74d9a63),但并未自动同步。

应用概览页也明确提示“Auto sync is not enabled”(自动同步未启用)。

那么,如何手动同步呢?我们点击“SYNC”按钮进行手动同步。

手动同步成功后,应用状态变为“Synced to HEAD”,并且副本数已按Git配置更新为2,可以看到两个Pod实例在运行。
PRUNE RESOURCES
开启PRUNE RESOURCES的验证
此选项的验证分为两种情况:是否同时开启了ENABLE AUTO-SYNC。
情况一:同时开启 ENABLE AUTO-SYNC
在ArgoCD的SYNC POLICY中,同时勾选“ENABLE AUTO-SYNC”和“PRUNE RESOURCES”。

此时,我直接从Git仓库中删除svc.yaml(Service配置文件)并提交。

提交后,由于自动同步已启用,ArgoCD立即执行了同步操作。从界面可以看到,同步成功,并且流程图中的svc节点已经消失,这意味着Kubernetes集群中对应的Service资源已被自动删除。
情况二:未开启 ENABLE AUTO-SYNC
如果只勾选“PRUNE RESOURCES”,但没有勾选“ENABLE AUTO-SYNC”。

同样删除svc.yaml并提交后,ArgoCD界面会检测到状态为“OutOfSync”,但不会自动执行同步,因此Kubernetes中的Service资源也不会被删除。

SELF HEAL
开启SELF HEAL的验证
同样,我们分两种情况验证。
情况一:同时开启 ENABLE AUTO-SYNC
策略配置为同时启用ENABLE AUTO-SYNC和SELF HEAL。此时,Git仓库中定义的Deployment副本数是2。
我通过kubectl命令手动将运行在Kubernetes集群中的myapp Deployment的副本数修改为3:
kubectl -n yunsheng edit deploy myapp
# 在编辑器中修改 spec.replicas 为 3
执行kubectl get deploy查看,副本数确实已变为3。但很快,ArgoCD的Operator会检测到集群状态与Git声明不符,并强制将其改回Git中定义的2。通过查看Deployment的YAML,可以看到replicas字段被恢复为2。

情况二:未开启 ENABLE AUTO-SYNC
策略配置为仅启用SELF HEAL,但不启用ENABLE AUTO-SYNC。

我再次使用kubectl手动将副本数改为3:
kubectl -n yunsheng edit deploy myapp
执行命令后查看:
kubectl -n yunsheng get deploy
输出显示副本数已生效为3。

此时,在ArgoCD界面上,应用状态会显示为“OutOfSync”,告知我们集群状态与Git配置不同步。

关闭SELF HEAL的验证
前提是开启ENABLE AUTO-SYNC。策略配置为:开启ENABLE AUTO-SYNC和PRUNE RESOURCES,但关闭SELF HEAL。

我手动使用kubectl将Deployment副本数修改为3。
kubectl -n yunsheng edit deploy myapp
修改后查看:
kubectl -n yunsheng get deploy
确认副本数已变为3。

在ArgoCD界面上,应用状态显示为“OutOfSync”,但ArgoCD不会主动将其改回。因为SELF HEAL已关闭,ArgoCD允许集群状态暂时偏离Git声明,仅在下一次Git变更触发自动同步时,才会将副本数同步回Git定义的值(2)。

总结
通过以上详细的实战验证,我们可以清晰地得出以下核心结论:
ENABLE AUTO-SYNC 是自动化同步的“总开关”。关闭它,所有同步(包括应用更新和资源清理)都需要手动触发。
PRUNE RESOURCES 和 SELF HEAL 是两个高级自动化功能,但它们生效的前提都是必须打开 ENABLE AUTO-SYNC。
PRUNE RESOURCES 负责清理Git中已删除的资源。
SELF HEAL 负责纠正对集群的直接操作,确保状态始终与Git声明一致。
理解并正确配置这些同步策略,是构建稳定、可靠的 GitOps 工作流的关键。它们共同保障了基础设施即代码(IaC)在 云原生 环境中的严肃性。希望本文的验证能帮助你更好地掌握ArgoCD的核心机制。如果你想了解更多关于 运维 自动化或CI/CD的实战内容,欢迎访问 云栈社区 进行交流和探讨。