2. Argo CD 基础回顾:架构、核心组件与工作流程

在深入同步窗口治理之前,必须牢固掌握 Argo CD 的底层架构与核心组件。同步窗口本质上是对 Application Controller 行为的定时约束,理解组件间的数据流是配置正确策略的前提。

2.1 整体架构概览

Argo CD 采用 控制循环(Reconciliation Loop) 模式,由三个核心组件协作完成从 Git 仓库到 Kubernetes 集群的状态同步。下图展示了组件间的通信关系与数据流向:

Argo CD 核心架构与组件关系 Argo CD 核心架构与组件关系 Git 仓库 应用清单 Helm/Kustomize API Server REST API / gRPC 认证 & RBAC Web UI / CLI Repo Server 克隆 / 缓存 清单生成 Application Controller 同步循环 目标集群 K8s API 实际状态 拉取清单 缓存结果 应用定义 同步/比较 同步窗口作用点 Application Controller 执行同步前 检查窗口规则
架构要点:同步窗口只约束 Application Controller 的同步行为,不影响 Repo Server 的清单拉取和 API Server 的查询操作。这意味着在窗口关闭期间,用户仍可通过 UI 查看应用状态差异,但无法触发同步。

2.2 核心组件详解

三个组件各司其职,形成完整的 GitOps 闭环:

组件 职责 关键行为 与同步窗口的关系
API Server 暴露 REST/gRPC 接口,处理认证、RBAC、Web UI 和 CLI 请求 接收同步请求、存储 Application CRD、暴露指标 窗口关闭时拒绝手动同步请求(返回 403)
Repo Server 克隆 Git 仓库,生成最终 Kubernetes 清单(Helm/Kustomize 渲染) 缓存仓库内容、生成清单、返回给 API Server 不受窗口影响,始终可拉取最新清单
Application Controller 核心控制循环,比较期望状态与实际状态,执行同步操作 定期轮询、自动同步、健康检查、Prune 资源 同步窗口直接作用对象,窗口关闭时跳过自动同步

2.3 工作流程:从 Git 提交到集群同步

一个完整的同步周期包含以下步骤,同步窗口在 第 5 步 介入:

  1. 提交触发: 开发者向 Git 仓库推送应用清单变更。
  2. Repo Server 拉取: 检测到仓库变更(通过 Webhook 或轮询),克隆仓库并生成最终 Kubernetes 清单。
  3. API Server 存储: 将生成的清单与 Application CRD 关联,存入缓存。
  4. Application Controller 轮询: 每 3 分钟(默认)检查所有 Application 的期望状态与实际状态差异。
  5. 同步窗口检查: 若检测到状态漂移,Controller 检查当前时间是否在允许的同步窗口内。
    • 窗口内: 执行同步操作(Apply / Prune)。
    • 窗口外: 跳过同步,标记应用为 OutOfSync,等待下一个窗口。
  6. 同步执行: 调用目标集群 API,应用期望状态,删除多余资源(Prune)。
  7. 健康检查: 监控资源状态,更新 Application 健康状态(Healthy / Degraded / Progressing)。
Argo CD 同步流程与窗口介入点 同步流程与窗口介入点 1. Git 提交 2. 清单生成 3. 缓存存储 4. 差异比较 5. 窗口检查 ⏰ 核心介入点 6. 同步 窗口决策 ✅ 窗口内 → 同步 ❌ 窗口外 → 跳过 标记 OutOfSync

2.4 关键概念:期望状态 vs 实际状态

Argo CD 的核心价值在于持续保证两个状态一致,同步窗口则是在此基础上增加时间维度的控制:

状态类型 来源 更新方式 窗口影响
期望状态(Desired State) Git 仓库中的应用清单 Repo Server 持续拉取并缓存 不受窗口影响,始终更新
实际状态(Actual State) 目标 Kubernetes 集群实时资源 Application Controller 轮询 K8s API 不受窗口影响,始终可读
同步操作(Sync) Controller 执行 Apply/Prune 将期望状态写入集群 受窗口严格约束
实践要点:即使同步窗口关闭,Argo CD 仍然会持续比较状态并更新 OutOfSync 标记。运维人员可以通过 argocd app get <app> 随时查看差异,只是无法执行同步。这种设计保证了 可见性不中断,变更执行受控。

2.5 组件通信协议与端口

理解组件间的通信方式有助于排查同步窗口相关的网络问题:

  • API Server → Repo Server: 内部 gRPC 调用(端口 8081),请求清单生成结果。
  • Repo Server → Git 仓库: HTTPS/SSH(端口 443/22),拉取仓库内容。
  • Application Controller → K8s API: HTTPS(端口 6443),执行同步和状态查询。
  • Application Controller → API Server: 通过 Kubernetes 事件机制获取 Application CRD 变更通知。
注意:如果 Argo CD 部署在受限网络环境,确保 Repo Server 能够访问 Git 仓库,Application Controller 能够访问目标集群 API Server。同步窗口本身不涉及网络策略变更,但窗口关闭期间自动同步被跳过,可能掩盖网络连通性问题。