Argo CD 同步窗口手动同步开关实战:`argocd proj windows enable-manual-sync` 命令全解析 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-projectID目标同步窗口的 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若为 trueCLI 直接与 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日志格式取值为json或text--loglevel stringinfo日志级别取值为debug、info、warn、error--plaintext禁用 TLS--port-forward通过端口转发连接到一个随机的 argocd-server 端口--port-forward-namespace string端口转发使用的命名空间--prompts-enabled强制启用/禁用可选交互提示覆盖本地配置本地默认 false--redis-compress stringgzip当 Application Controller 启用了 Redis 压缩时设置可选值gzip、none--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.gokind窗口类型只能是allow允许同步或deny阻止同步schedule窗口开始时间使用 cron 格式分钟/小时/日/月/周几duration窗口持续时间使用 Go 的time.ParseDuration格式如1h、30mapplications/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 USEANDOPERATORID 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-sync与disable-manual-sync、enable-sync-overrun、disable-sync-overrun四个命令共享同一个 toggle 模板函数newProjectWindowsToggleCommandprojectwindows.go其执行流程为校验参数严格要求恰好两个位置参数否则打印帮助并退出解析 IDid, 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 窗口都启用了manualSynchasDeny 实现。只有isManual manualEnabled全部成立时手动同步才被放行只要有一个激活 deny 窗口未启用manualSync手动同步同样被拒绝。无激活 allow 窗口若存在非激活的 allow 窗口InactiveAllows()manualEnabled()同样要求所有非激活 allow 窗口都启用manualSync才放行手动同步manualEnabled 实现。自动同步不受manualSync影响manualSync只放行人工触发的同步自动同步isManualfalse依旧被窗口拦截。这一全量放行语义在 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.goproject.Spec.SyncWindows.Matches(app).CanSync(false, nil)其中isManualfalse表示这是自动同步因此manualSync不会放行自动同步。手动同步入口位于 controller/sync.go 的syncWindowPreventsSync它通过app.Status.OperationState.Operation.InitiatedBy.Automated判断是否人工触发isManual !Automated并读取OperationState.StartedAt作为operationStartTime参与CanSync判定。也就是说你通过enable-manual-sync设置的ManualSynctrue最终作用于 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),仅供参考