2. Argo CD 核心架构:组件介绍与状态同步机制
Argo CD 遵循 声明式 GitOps 模式,其核心架构由三个独立但协作的微服务组件构成:API Server、Repo Server 和 Application Controller。理解这三个组件的职责、数据流以及状态同步机制,是配置日志审计、诊断存储版本漂移的基础。
2.1 三大核心组件
| 组件 | 核心职责 | 关键特性 |
|---|---|---|
| API Server | 提供 REST/gRPC 接口,处理用户请求、Webhook 触发、RBAC 认证与审计日志记录。 | 无状态、可水平扩展;所有外部交互的唯一入口;所有变更操作均通过此组件记录审计事件。 |
| Repo Server | 负责克隆、缓存 Git 仓库,生成目标 Kubernetes 清单(Manifest),并返回给其他组件。 | 内部维护本地缓存;支持 Helm、Kustomize、Jsonnet 等配置管理工具;不直接连接 Kubernetes 集群。 |
| Application Controller | 持续监控已部署应用的实际状态与 Git 中声明的目标状态是否一致,执行同步操作。 | 每个集群对应一个 Controller 实例;负责检测漂移、触发自动/手动同步、更新应用健康状态。 |
审计关注点: API Server 是审计日志的主要来源,记录谁、在什么时间、通过什么方式(CLI/UI/API)发起了同步或配置变更。Repo Server 的缓存行为与 Application Controller 的轮询周期,直接影响漂移检测的时效性。
2.2 组件交互与数据流
下图展示了 Argo CD 核心组件之间的数据流向与交互关系:
2.3 状态同步机制详解
Argo CD 的状态同步机制围绕 目标状态(Desired State) 与 实际状态(Actual State) 的持续比对展开。同步流程分为以下关键步骤:
- 目标状态获取: Application Controller 定期(默认 3 分钟)或通过 Webhook 触发,向 Repo Server 请求最新的目标清单。
- 实际状态采集: Controller 通过 Kubernetes API 查询集群中对应资源(Deployment、Service、ConfigMap 等)的当前实际状态。
- 差异比对: Controller 将目标清单与实际状态进行深度对比,生成差异报告(Diff)。
- 同步执行: 当检测到漂移(OutOfSync)时,Controller 根据同步策略(手动/自动、同步方向)执行
kubectl apply或kubectl delete操作。 - 状态回写: 同步结果(Synced/OutOfSync/Error)及操作详情回写至 API Server,并记录审计日志。
漂移校准关键点: 存储版本漂移通常发生在第 3 步(差异比对)与第 4 步(同步执行)之间。审计日志应重点记录:
- 谁触发了同步(用户/自动策略)
- 同步前与同步后的资源版本号
- 被覆盖的字段与原始值
- 谁触发了同步(用户/自动策略)
- 同步前与同步后的资源版本号
- 被覆盖的字段与原始值
2.4 同步模式与触发方式
| 同步模式 | 触发方式 | 审计日志记录内容 |
|---|---|---|
| 手动同步 | 用户通过 CLI (argocd app sync) 或 UI 点击 |
用户身份、操作时间、同步的应用名称、同步方向(正常/回滚) |
| 自动同步 | Git Webhook 或 Controller 轮询检测到漂移 | 触发源(Webhook/轮询)、漂移详情、自动执行结果 |
| 自愈同步 | 集群内资源被手动修改后自动恢复 | 被修改的资源类型、名称、原始值、恢复后的值 |
2.5 组件间通信安全
在日志审计配置中,需要关注组件间通信的认证与加密:
- API Server ↔ Repo Server: 使用 TLS 加密,Repo Server 通过 认证。
- API Server ↔ Application Controller: 通过 gRPC 双向 TLS 通信。
- Application Controller ↔ Kubernetes API: 使用 ServiceAccount 或 kubeconfig 进行认证。
审计风险提示: 如果组件间通信未启用 TLS 或使用了弱 ,攻击者可能伪造同步请求或篡改目标清单,导致存储版本漂移无法被正确校准。审计日志应包含组件间连接状态与证书过期时间的监控记录。
2.6 组件职责与审计日志关联
下表总结了各组件在审计日志中的关键记录点:
| 组件 | 审计日志关键字段 | 典型事件示例 |
|---|---|---|
| API Server | user, action, resource, timestamp, client_ip |
admin 在 2025-03-15T10:30:00Z 通过 CLI 同步了 guestbook 应用 |
| Repo Server | repo_url, revision, cache_hit, manifest_generation_time |
从 https://github.com/example/guestbook.git 拉取 commit a1b2c3d,缓存命中 |
| Application Controller | app_name, sync_status, diff_summary, sync_result |
guestbook 状态从 Synced 变为 OutOfSync,差异:Deployment replicas 3→5 |