Argo CD 如何执行部分资源的选择性同步(Selective Sync)
【免费下载链接】argo-cdDeclarative Continuous Deployment for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/ar/argo-cd
当一次同步只想作用于 Application 中的部分资源时——例如只部署某个 Service、排除某个 Deployment,或者在排障时先单独验证个别资源——可以执行selective sync(选择性同步):只同步你选定的那些资源。Argo CD 支持从 UI 或 CLI 两种方式选择要同步的资源。使用前必须先了解两条硬限制,它们决定了这个功能适合什么场景:
- 选择性同步不会记录到同步历史中,因此无法通过 history 回滚;
- 选择性同步过程中Hooks 不会执行(来自 Sync Phases and Waves 文档的明确说明)。
如果需要"只处理部分资源"但同时要求保留历史记录、让 Hooks 正常执行,可以考虑后文提到的ApplyOutOfSyncOnly同步选项作为替代路径。
UI 中针对 Application 的部分资源发起同步,来源:selective_sync.md
用 CLI 的 --resource 参数执行选择性同步
主路径是argocd app sync命令的--resource参数。其官方定义为(摘自 argocd app sync 命令参考):
--resource stringArray Sync only specific resources as GROUP:KIND:NAME or !GROUP:KIND:NAME. Fields may be blank and '*' can be used. This option may be specified repeatedly要点:
- 资源格式为
GROUP:KIND:NAME,三个字段都允许留空,也允许使用*通配符; - 加
!前缀表示排除匹配到的资源,而不是只同步它们; - 该参数可重复指定,用于同时匹配多个资源或叠加排除规则。
下面示例中的my-app是文档使用的示例应用名,执行时替换为你自己的 Application 名称;资源名替换为集群中实际存在的对象。
指定单个或某个 Kind 的资源
# GROUP 留空,表示 core 组(如 Service) argocd app sync my-app --resource :Service:my-service # 指定 GROUP:KIND:NAME argocd app sync my-app --resource argoproj.io:Rollout:my-rollout排除某个资源或某类资源
# 排除指定 Deployment argocd app sync my-app --resource '!apps:Deployment:my-service' # 排除所有 Service(任意 group、任意名字) argocd app sync my-app --resource '!*:Service:*'!前缀的语义是排除:命令会同步 Application 中除被排除项以外的全部资源。'*:Service:*'这种写法利用"字段可留空且支持*"的规则,匹配任意 group 下的所有 Service。
一次同步多个目标资源
argocd app sync my-app --resource apps:Deployment:my-service --resource :Service:my-serviceApplication 内多个 namespace 存在同名资源时
# 在 NAME 前加上 namespace 前缀以精确定位 argocd app sync my-app --resource argoproj.io:Rollout:my-namespace/my-rollout当 Application 在不同 namespace 中有同名资源时,GROUP:KIND:NAME无法区分它们,需要用my-namespace/my-rollout这种namespace/NAME写法指定 namespace。
执行前先预览:--dry-run
argocd app sync提供--dry-run选项,官方说明为 "Preview apply without affecting cluster"(预览 apply 但不影响集群)。在首次对生产 Application 使用--resource筛选条件时,建议先加--dry-run确认筛选结果符合预期,再去掉该参数执行真正的同步:
argocd app sync my-app --resource :Service:my-service --dry-run此外,--timeout参数(单位:秒)用于控制同步等待超时,可按需附加;完整参数列表见 argocd app sync 命令参考。
在 UI 中选择资源
Selecting Sync 文档 指出资源选择可以 "from the UI or the CLI"。在 Argo CD UI 的 Application 视图中,可以对 Application 的资源列表进行筛选/勾选后再发起同步,效果与 CLI 的--resource等价。UI 适合交互式挑选资源;需要脚本化、可复现的操作时优先用 CLI。
验证同步结果
同步完成后,argocd app sync命令自身的输出(默认--output wide)会展示各资源的同步状态,据此判断被选中的资源是否达到预期。若资源长时间处于Progressing,可结合--timeout控制等待上限,避免命令无限挂起。
同时记住选择性同步的记录特性:由于该操作不写入同步历史,argocd app history中不会看到这条记录,事后也无法用argocd app rollback回到这次操作之前的状态。这是选择该方式执行前必须接受的代价。
与 ApplyOutOfSyncOnly 同步选项的区别
如果你的目标只是"不重新应用已经同步的资源",而不是"精确挑选特定资源",Sync Options 文档 给出了更合适的选项ApplyOutOfSyncOnly:
apiVersion: argoproj.io/v1alpha1 kind: Application spec: syncPolicy: syncOptions: - ApplyOutOfSyncOnly=true也可以通过 CLI 设置:
argocd app set guestbook --sync-option ApplyOutOfSyncOnly=true文档明确了两者的行为差异:开启ApplyOutOfSyncOnly时,Sync Hooks 仍然会执行,且同步会记录在历史中;而选择性同步这两点都不满足。因此:
- 需要精确选择"哪些资源同步 / 哪些不同步",且能接受不留历史、不跑 Hooks → 用
--resource选择性同步; - 只需要跳过已同步的资源、保留完整的 Hooks 与历史记录 → 用
ApplyOutOfSyncOnly=true。
限制与注意事项
- 无历史、不可回滚:选择性同步不出现在 Application 历史中,出错后无法通过 Argo CD 的 rollback 机制回退,只能重新执行一次完整的普通同步。
- Hooks 不执行:如果你的部署依赖
PreSync/PostSyncHook(数据库迁移、校验任务等),这些 Hook 在选择性同步中会被跳过,sync-waves.md 原文为 "Hooks do not run during a selective sync operation"。 - 筛选条件是本次命令级的:
--resource只作用于当次argocd app sync命令,不会持久化到 Application 上;后续的自动同步(auto sync)仍会按 Application 全量资源进行。
更多同步相关行为(sync wave、hook 生命周期、各同步选项)可继续阅读 Sync Phases and Waves 与 Sync Options。
【免费下载链接】argo-cdDeclarative Continuous Deployment for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/ar/argo-cd
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考