Argo CD 同步窗口手动同步开关实战:`argocd proj windows enable-manual-sync` 命令全解析
2026/9/14 22:26:45 网站建设 项目流程

Argo CD 同步窗口手动同步开关实战:argocd proj windows enable-manual-sync命令全解析

【免费下载链接】argo-cdDeclarative Continuous Deployment for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/ar/argo-cd

本篇围绕 Argo CD 的argocd proj windows enable-manual-sync命令展开,讲解如何在项目(AppProject)的同步窗口(Sync Window)上启用手动同步(Manual Sync)能力。读者将掌握该命令的完整语法、参数、典型使用场景,以及manualSync字段在allow/deny窗口中的底层判定逻辑与源码实现,从而在维护窗口期间灵活、安全地放行人工触发的同步操作。

命令概览:为同步窗口开启手动同步

argocd proj windows enable-manual-syncargocd proj windows命令族(argocd_proj_windows.md)下的一个子命令,用于为一个已存在的同步窗口启用手动同步。同步窗口默认同时约束自动同步与手动同步;启用manualSync后,人工发起的同步可以在窗口禁止自动同步期间仍然执行,常用于"只挡自动化、放行人工操作"或"临时绕过维护窗口"的场景。

命令的正式说明(Synopsis)为:

Enable manual sync for a sync window. Requires ID which can be found by running "argocd proj windows list PROJECT"

语法如下:

argocd proj windows enable-manual-sync PROJECT ID [flags]

其中两个位置参数含义为:

参数说明
PROJECT目标 AppProject 的名称,例如defaultmy-app-project
ID目标同步窗口的 ID,可通过argocd proj windows list PROJECT查询得到(见下文"窗口 ID 的语义")

该命令的完整定义位于 cmd/argocd/commands/projectwindows.go,由NewProjectWindowsEnableManualSyncCommand函数构建。

使用示例

原文档提供了三个典型示例,全部继承如下:

# 通用场景:为指定项目的指定窗口启用手动同步 argocd proj windows enable-manual-sync PROJECT ID # 为 default 项目中 ID 为 2 的窗口启用手动同步 argocd proj windows enable-manual-sync default 2 # 为 my-app-project 项目启用手动同步(文档示例附带了自定义消息参数) argocd proj windows enable-manual-sync my-app-project --message "Manual sync initiated by admin"

注意事项:第三个示例中出现的--message参数在文档中展示为"附带自定义消息"的写法,但对照当前仓库源码,enable-manual-sync子命令由统一的 toggle 实现(newProjectWindowsToggleCommand)生成,并未定义--messageflag——该命令实际仅支持-h, --help。复制示例时若报"unknown flag"错误,请移除--message部分;消息说明可通过argocd proj windows update PROJECT ID --description "..."写入窗口的description字段(update 命令实现)。

命令选项

本命令专属选项

-h, --help help for enable-manual-sync

从父命令继承的选项

以下选项继承自argocd根命令,用于配置连接 Argo CD Server / Kubernetes 的方式,同样适用于本命令:

选项默认值说明
--argocd-context string要使用的 Argo CD Server context 名称
--auth-token string认证令牌;也可设置ARGOCD_AUTH_TOKEN环境变量
--client-crt string客户端证书文件
--client-crt-key string客户端证书私钥文件
--config string/home/user/.config/argocd/configArgo CD 配置文件路径
--controller-name stringargocd-application-controllerApplication Controller 名称;通过 Helm Chart 安装且名称标签不同时需设置,或使用ARGOCD_APPLICATION_CONTROLLER_NAME环境变量
--core若为 true,CLI 直接与 Kubernetes 通信,而不经过 Argo CD API Server
--grpc-web启用 gRPC-web 协议,适用于 Argo CD Server 位于不支持 HTTP2 的代理之后的情况
--grpc-web-root-path string启用 gRPC-web 协议并指定 web 根路径
-H, --header strings为所有 CLI 请求附加额外 header(可重复使用,也支持逗号分隔多个值)
--http-retry-max int与 Argo CD Server 建立 HTTP 连接的最大重试次数
--insecure跳过服务器证书与域名校验
--kube-context string指定使用的 kube-context
--logformat stringjson日志格式,取值为jsontext
--loglevel stringinfo日志级别,取值为debuginfowarnerror
--plaintext禁用 TLS
--port-forward通过端口转发连接到一个随机的 argocd-server 端口
--port-forward-namespace string端口转发使用的命名空间
--prompts-enabled强制启用/禁用可选交互提示,覆盖本地配置(本地默认 false)
--redis-compress stringgzip当 Application Controller 启用了 Redis 压缩时设置(可选值:gzipnone
--redis-haproxy-name stringargocd-redis-ha-haproxyRedis HA Proxy 名称;可通过ARGOCD_REDIS_HAPROXY_NAME环境变量覆盖
--redis-name stringargocd-redisRedis deployment 名称;可通过ARGOCD_REDIS_NAME环境变量覆盖
--repo-server-name stringargocd-repo-serverRepo Server 名称;可通过ARGOCD_REPO_SERVER_NAME环境变量覆盖
--server stringArgo CD Server 地址
--server-crt string服务器证书文件
--server-name stringargocd-serverArgo CD API Server 名称;可通过 Helm Chart 安装且名称不同时设置

前置知识:同步窗口与manualSync字段

要正确理解"启用手动同步"的含义,需要先了解同步窗口的模型。同步窗口定义了一段可配置的时间区间,在此期间同步会被阻止允许,核心定义见 pkg/apis/application/v1alpha1/types.go:

  • kind:窗口类型,只能是allow(允许同步)或deny(阻止同步);
  • schedule:窗口开始时间,使用 cron 格式(分钟/小时/日/月/周几);
  • duration:窗口持续时间,使用 Go 的time.ParseDuration格式(如1h30m);
  • applications/namespaces/clusters:窗口作用的资源选择器,均支持通配符(*),多个选择器默认按 OR 逻辑组合,可通过andOperator切换为 AND 逻辑(匹配逻辑见 Matches 实现);
  • manualSync允许在窗口阻止同步期间执行手动同步
  • syncOverrun:允许已开始的同步跨越窗口边界继续运行;
  • timeZonedescriptionuseAndOperator等辅助字段。

同步窗口的作用规则(完整行为见 docs/user-guide/sync_windows.md):

  • 没有窗口匹配某应用时,所有同步均被允许;
  • 存在匹配的allow窗口时,仅在allow窗口处于激活状态时允许同步;
  • 存在匹配的deny窗口时,deny窗口激活期间拒绝所有同步;
  • deny窗口与allow窗口同时激活时,以deny为准(deny 优先于 allow)。

manualSync的作用场景:同步窗口同时影响自动同步与手动同步。启用manualSync后:

  • deny窗口激活期间,人工发起的同步可以被放行(前提见下文"CanSync 判定逻辑");
  • 在没有allow窗口激活时,人工发起的同步也可以被放行。

UI 与 CLI 会以不同颜色/状态呈现同步状态:Red(同步被拒绝)、Orange(允许手动同步)、Green(允许同步)。CLI 中可通过argocd app get APP查看应用当前的同步窗口状态与匹配的窗口列表。

如何找到窗口 ID:先listenable

命令要求传入窗口 ID,官方推荐通过argocd proj windows list PROJECT获取。该命令输出一张表格,其中ID 一列即窗口在项目spec.syncWindows列表中的下标(从 0 开始)

argocd proj windows list PROJECT

输出示例(列包括ID STATUS KIND SCHEDULE DURATION APPLICATIONS NAMESPACES CLUSTERS MANUALSYNC SYNCOVERRUN TIMEZONE USEANDOPERATOR):

ID STATUS KIND SCHEDULE DURATION APPLICATIONS NAMESPACES CLUSTERS MANUALSYNC SYNCOVERRUN TIMEZONE USEANDOPERATOR 0 Active allow * * * * * 1h - - prod1 Disabled Disabled UTC Disabled 1 Inactive deny * * * * 1 3h - default - Disabled Enabled UTC Disabled 2 Inactive allow 1 2 * * * 1h prod-* - - Enabled Disabled UTC Disabled

列表实现见 printSyncWindows:状态列由window.Active()判定,MANUALSYNC/SYNCOVERRUN列通过formatBoolEnabledOutput输出Enabled/Disabledlist还支持-o yaml|json|wide输出格式(默认wide)。该表格的列头与内容在 projectwindows_test.go 中有完整断言测试。

拿到 ID 后执行:

argocd proj windows enable-manual-sync default 2

对应禁用操作使用反向命令argocd proj windows disable-manual-sync PROJECT ID(同样实现于 projectwindows.go)。

底层实现解析:ID 即下标,读-改-写三步完成

从源码结构看,enable-manual-syncdisable-manual-syncenable-sync-overrundisable-sync-overrun四个命令共享同一个 toggle 模板函数newProjectWindowsToggleCommand(projectwindows.go),其执行流程为:

  1. 校验参数:严格要求恰好两个位置参数,否则打印帮助并退出;
  2. 解析 IDid, err := strconv.Atoi(args[1]),ID 必须是整数;
  3. 获取项目:通过 Project gRPC 客户端调用projIf.Get拉取完整AppProject
  4. 定位窗口并修改:遍历proj.Spec.SyncWindowsid == i(切片下标)匹配窗口,命中后调用更新回调——enable-manual-sync的回调为window.ManualSync = true;若未命中则报错window with id '%d' not found
  5. 写回项目:调用projIf.Update将修改后的AppProject提交到集群。

之所以"ID 即下标",正是因为该实现用切片索引定位窗口——这也解释了为何必须先list获取准确 ID:一旦窗口被增删,ID 就会随顺序变化。

AppProject清单中,manualSyncInlineSyncWindow的一个布尔字段(json:"manualSync,omitempty",见 types.go),因此也可以绕过 CLI 直接在 YAML 中声明:

apiVersion: argoproj.io/v1alpha1 kind: AppProject metadata: name: default spec: syncWindows: - kind: deny schedule: '0 22 * * *' duration: 1h applications: - '*-prod' manualSync: true # 允许人工同步,阻止自动同步

手动同步的判定逻辑:全量窗口须同时放行

启用manualSync后是否真的能手动同步,由CanSync(isManual, operationStartTime)决定(types.go)。关键规则如下:

  • 激活的 deny 窗口:当存在激活的deny窗口时,hasDeny()会返回两个值——是否找到 deny 窗口,以及是否所有激活 deny 窗口都启用了manualSync(hasDeny 实现)。只有isManual && manualEnabled全部成立时,手动同步才被放行;只要有一个激活 deny 窗口未启用manualSync,手动同步同样被拒绝。
  • 无激活 allow 窗口:若存在非激活的 allow 窗口InactiveAllows()),manualEnabled()同样要求所有非激活 allow 窗口都启用manualSync才放行手动同步(manualEnabled 实现)。
  • 自动同步不受manualSync影响manualSync只放行人工触发的同步,自动同步(isManual=false)依旧被窗口拦截。

这一"全量放行"语义在 types_test.go 中有大量回归用例印证,例如:

  • will allow manual sync with active-deny with ManualSync enabled——激活 deny 且启用手动同步时放行;
  • will deny manual sync with many active-deny having one with ManualSync disabled——多个激活 deny 中只要有一个未启用手动同步即拒绝;
  • will allow manual sync inactive-allow with ManualSync enabled/will deny auto sync inactive-allow with ManualSync enabled——非激活 allow 窗口仅放行手动同步,自动同步仍被拒绝;
  • will allow manual sync with active-deny and active-allow windows with ManualSync enabled——deny 与 allow 同时激活时,只有全部启用手动同步才放行。

运行时调用链:控制器如何消费ManualSync

在运行层面,Application Controller 在触发同步前会做窗口拦截检查。自动同步入口位于 controller/appcontroller.go:project.Spec.SyncWindows.Matches(app).CanSync(false, nil),其中isManual=false表示这是自动同步,因此manualSync不会放行自动同步。手动同步入口位于 controller/sync.go 的syncWindowPreventsSync:它通过app.Status.OperationState.Operation.InitiatedBy.Automated判断是否人工触发(isManual = !Automated),并读取OperationState.StartedAt作为operationStartTime参与CanSync判定。也就是说:你通过enable-manual-sync设置的ManualSync=true最终作用于 controller 的这次CanSync判定,从而在 UI 或argocd app sync触发人工同步时放行。

与 Sync Overrun 的协作

enable-manual-sync仅控制"人工触发同步",与syncOverrun(允许已开始的同步跨窗口继续运行)是两个正交开关,二者常配合使用:

  • manualSync:放行"窗口激活期间新发起的人工同步";
  • syncOverrun:放行"窗口切换时已在运行中的同步"(deny 窗口允许先于其开始的同步完成;allow 窗口允许在其期间开始的同步于窗口结束后继续)。

对已有窗口可用argocd proj windows enable-sync-overrun PROJECT ID/disable-sync-overrun PROJECT ID调整,或在AppProject清单中直接声明syncOverrun: true。详细行为与过渡场景见 sync_windows.md。

相关命令与参考资料

  • 父命令:argocd proj windows——管理项目同步窗口的命令族
  • 反向操作:argocd proj windows disable-manual-sync——禁用手动同步
  • 同步窗口完整文档:Sync Windows——窗口模型、匹配规则、overrun 场景、UI 状态颜色
  • 命令实现:cmd/argocd/commands/projectwindows.go——toggle 模板与 enable/disable 命令定义
  • 窗口类型与判定逻辑:pkg/apis/application/v1alpha1/types.go——InlineSyncWindowMatchesCanSync与配套辅助函数
  • 运行时拦截:controller/sync.go——syncWindowPreventsSync手动/自动同步判定
  • 行为验证:pkg/apis/application/v1alpha1/types_test.go、cmd/argocd/commands/projectwindows_test.go——窗口匹配、手动同步放行、表格输出等回归测试

【免费下载链接】argo-cdDeclarative Continuous Deployment for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/ar/argo-cd

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询