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-sync是argocd 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 的名称,例如default、my-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/config | Argo CD 配置文件路径 |
--controller-name string | argocd-application-controller | Application 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 string | json | 日志格式,取值为json或text |
--loglevel string | info | 日志级别,取值为debug、info、warn、error |
--plaintext | 禁用 TLS | |
--port-forward | 通过端口转发连接到一个随机的 argocd-server 端口 | |
--port-forward-namespace string | 端口转发使用的命名空间 | |
--prompts-enabled | 强制启用/禁用可选交互提示,覆盖本地配置(本地默认 false) | |
--redis-compress string | gzip | 当 Application Controller 启用了 Redis 压缩时设置(可选值:gzip、none) |
--redis-haproxy-name string | argocd-redis-ha-haproxy | Redis HA Proxy 名称;可通过ARGOCD_REDIS_HAPROXY_NAME环境变量覆盖 |
--redis-name string | argocd-redis | Redis deployment 名称;可通过ARGOCD_REDIS_NAME环境变量覆盖 |
--repo-server-name string | argocd-repo-server | Repo Server 名称;可通过ARGOCD_REPO_SERVER_NAME环境变量覆盖 |
--server string | Argo CD Server 地址 | |
--server-crt string | 服务器证书文件 | |
--server-name string | argocd-server | Argo CD API Server 名称;可通过 Helm Chart 安装且名称不同时设置 |
前置知识:同步窗口与manualSync字段
要正确理解"启用手动同步"的含义,需要先了解同步窗口的模型。同步窗口定义了一段可配置的时间区间,在此期间同步会被阻止或允许,核心定义见 pkg/apis/application/v1alpha1/types.go:
kind:窗口类型,只能是allow(允许同步)或deny(阻止同步);schedule:窗口开始时间,使用 cron 格式(分钟/小时/日/月/周几);duration:窗口持续时间,使用 Go 的time.ParseDuration格式(如1h、30m);applications/namespaces/clusters:窗口作用的资源选择器,均支持通配符(*),多个选择器默认按 OR 逻辑组合,可通过andOperator切换为 AND 逻辑(匹配逻辑见 Matches 实现);manualSync:允许在窗口阻止同步期间执行手动同步;syncOverrun:允许已开始的同步跨越窗口边界继续运行;timeZone、description、useAndOperator等辅助字段。
同步窗口的作用规则(完整行为见 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:先list再enable
命令要求传入窗口 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/Disabled;list还支持-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-sync与disable-manual-sync、enable-sync-overrun、disable-sync-overrun四个命令共享同一个 toggle 模板函数newProjectWindowsToggleCommand(projectwindows.go),其执行流程为:
- 校验参数:严格要求恰好两个位置参数,否则打印帮助并退出;
- 解析 ID:
id, err := strconv.Atoi(args[1]),ID 必须是整数; - 获取项目:通过 Project gRPC 客户端调用
projIf.Get拉取完整AppProject; - 定位窗口并修改:遍历
proj.Spec.SyncWindows,以id == i(切片下标)匹配窗口,命中后调用更新回调——enable-manual-sync的回调为window.ManualSync = true;若未命中则报错window with id '%d' not found; - 写回项目:调用
projIf.Update将修改后的AppProject提交到集群。
之所以"ID 即下标",正是因为该实现用切片索引定位窗口——这也解释了为何必须先list获取准确 ID:一旦窗口被增删,ID 就会随顺序变化。
在AppProject清单中,manualSync是InlineSyncWindow的一个布尔字段(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——
InlineSyncWindow、Matches、CanSync与配套辅助函数 - 运行时拦截: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),仅供参考