2. 同步窗口机制
同步窗口(Sync Window)是 GitOps 中控制自动同步时间窗口的核心策略。通过定义允许或拒绝同步的时间段,可以避免在业务高峰期、维护窗口外或集群负载敏感时段触发自动同步,从而降低因同步操作引发 CrashLoop 的风险。
2.1 同步窗口定义
同步窗口是一组时间规则,用于决定 GitOps 控制器(如 ArgoCD)是否允许执行自动同步。每个窗口包含以下要素:
- 窗口类型:允许(allow)或拒绝(deny)同步。
- 时间表达式:使用 Cron 或类似语法定义生效时间。
- 时区:指定表达式所基于的时区,默认 UTC。
- 应用选择器:可选,限定窗口生效的目标应用或命名空间。
最佳实践:在生产环境中,始终为关键业务应用配置至少一个拒绝窗口,覆盖已知的维护时段或高负载时段,防止意外同步触发 CrashLoop。
2.2 窗口类型:允许 vs 拒绝
同步窗口分为两种类型,其行为对比如下:
| 窗口类型 | 语义 | 默认行为 | 典型场景 |
|---|---|---|---|
| 允许(allow) | 仅在窗口内允许自动同步 | 窗口外禁止同步 | 仅在工作时间部署;仅允许在低峰期同步 |
| 拒绝(deny) | 在窗口内禁止自动同步 | 窗口外允许同步 | 屏蔽业务高峰期;屏蔽数据库备份时段 |
注意:当同时配置多个窗口时,拒绝窗口的优先级高于允许窗口。如果某个时间点同时命中允许和拒绝窗口,则拒绝生效,同步被阻止。
2.3 窗口配置语法
以 ArgoCD 为例,同步窗口在 argocd-cm ConfigMap 中定义,使用 YAML 格式。每个窗口由 kind、schedule、timeZone 和可选的 applications 组成。
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-cm
namespace: argocd
data:
# 拒绝窗口:业务高峰期(周一至周五 09:00-18:00)
syncWindows: |
- kind: deny
schedule: "0 9 * * 1-5"
duration: 9h
timeZone: "Asia/Shanghai"
applications:
- "prod-*"
# 允许窗口:仅允许在凌晨 02:00-04:00 同步
- kind: allow
schedule: "0 2 * * *"
duration: 2h
timeZone: "UTC"
applications:
- "critical-app"
2.4 时间表达式详解
时间表达式采用 Cron 格式,支持 5 位标准字段(分、时、日、月、周),配合 duration 字段定义窗口长度。常用表达式示例:
| 表达式 | 含义 | 窗口时长示例 |
|---|---|---|
0 9 * * 1-5 |
每周一至周五 09:00 | duration: 9h → 09:00-18:00 |
0 0 * * * |
每天 00:00(午夜) | duration: 2h → 00:00-02:00 |
0 22 * * 6 |
每周六 22:00 | duration: 8h → 22:00-06:00(次日) |
0 14 1 * * |
每月 1 日 14:00 | duration: 1h → 14:00-15:00 |
关键规则:
duration支持h(小时)和m(分钟)单位,如30m、2h30m。- 窗口结束时间 = schedule 时间 + duration。如果结束时间跨天,窗口自动延续到次日。
- 多个窗口可以重叠,拒绝窗口始终优先。
2.5 同步窗口工作流程
下图展示了同步窗口在 GitOps 同步周期中的判断逻辑:
2.6 多窗口组合策略
实际生产环境中,通常组合使用多个窗口来覆盖不同场景。以下是一个典型的多窗口配置示例:
syncWindows:
# 窗口1:拒绝业务高峰期(周一至周五 09:00-18:00)
- kind: deny
schedule: "0 9 * * 1-5"
duration: 9h
timeZone: "Asia/Shanghai"
# 窗口2:拒绝数据库备份时段(每天 01:00-02:00)
- kind: deny
schedule: "0 1 * * *"
duration: 1h
timeZone: "UTC"
# 窗口3:允许紧急修复窗口(每天 22:00-23:00)
- kind: allow
schedule: "0 22 * * *"
duration: 1h
timeZone: "UTC"
applications:
- "emergency-fix"
策略效果:
- 业务高峰期(09:00-18:00)和数据库备份时段(01:00-02:00)自动同步被拒绝。
- 标记为
emergency-fix的应用在 22:00-23:00 允许同步,用于紧急修复。 - 其他时段按默认策略允许同步。
2.7 同步窗口与 CrashLoop 的关联
同步窗口是预防 CrashLoop 的第一道防线。通过合理配置窗口,可以:
- 避免高峰时段触发:拒绝窗口屏蔽业务高峰期,防止同步操作引发资源争抢导致 Pod 崩溃。
- 控制变更节奏:允许窗口将同步限制在低风险时段,便于监控和快速回滚。
- 隔离维护窗口:在已知的集群维护或备份时段拒绝同步,避免配置变更与维护操作冲突。
建议:在配置同步窗口后,使用
argocd app sync --dry-run 验证窗口是否按预期生效。同时,监控同步窗口命中率,确保窗口规则覆盖了所有需要保护的时段。