3、Argo CD 项目架构概览:核心组件与项目级配置模型

在深入 Secrets 轮换策略之前,必须理解 Argo CD 的架构骨架。Argo CD 遵循 声明式 GitOps 模式,由三个核心控制组件和一套项目级配置模型构成。本章将拆解这些组件如何协作,以及项目模型如何为 Secrets 轮换提供隔离边界。

3.1 三大核心组件

Argo CD 的控制平面由 API Server、Repo Server 和 Application Controller 组成。它们各自承担不同职责,并通过 gRPC/REST 通信。

组件 职责 与 Secrets 轮换的关联
API Server 暴露 REST/gRPC 接口;处理认证、RBAC、Webhook;管理 Application/Project CRD 接收轮换触发信号(Webhook);校验用户对 Secret 资源的操作权限
Repo Server 克隆 Git 仓库;生成 Kubernetes 清单(Helm/Kustomize/Jsonnet);缓存清单 读取包含加密 Secrets 的清单;执行 sops 或 sealed-secrets 解密
Application Controller 对比期望状态(Git)与实际状态(集群);执行同步;自动修复偏差 检测 Secret 版本差异;触发自动同步以应用轮换后的新值
关键点: Repo Server 是 Secrets 解密的关键节点。如果轮换策略涉及加密文件(如 .sops.yaml),Repo Server 必须能访问解密密钥(通过环境变量或挂载卷),但 绝不能 将明文密钥写入 Git。

3.2 组件协作流程

下图展示了 Argo CD 核心组件如何协作完成一次标准的同步循环,其中包含了 Secrets 轮换场景下的数据流。

Argo CD 核心组件协作流程(含 Secrets 轮换路径) 外部触发(Webhook/手动) API Server 认证 · RBAC · 事件分发 Repo Server Git 克隆 · 清单生成 · 解密 Application Controller 差异对比 · 同步 · 健康检查 目标 Kubernetes 集群 Secret 资源更新 请求最新清单 触发同步 传递期望清单(含解密后 Secret) 应用变更 💡 Secrets 轮换路径: 外部触发 → API Server 校验权限 → Repo Server 从 Git 拉取加密 Secret 并解密 → Application Controller 对比新旧版本 → 同步到集群。

3.3 项目级配置模型

Argo CD 的 Project(项目) 是资源隔离和策略控制的核心单元。每个 Application 必须属于一个 Project。项目模型为 Secrets 轮换提供了以下关键约束:

  • 源仓库限制: 指定允许哪些 Git 仓库作为 Secrets 的来源。
  • 目标集群限制: 限定 Secrets 可以被部署到哪些集群或命名空间。
  • 资源白名单/黑名单: 控制 Project 内允许创建或修改的 Kubernetes 资源类型(如只允许 Secret 和 ConfigMap)。
  • 同步策略: 定义自动同步、自愈、修剪等行为,影响轮换后 Secrets 的生效速度。
最佳实践: 为每个敏感度级别(如“高安全”、“常规”)创建独立的 Project。高安全 Project 应启用 禁止手动覆盖 和 强制自动同步,确保轮换后的 Secret 立即生效且无法被人工篡改。

3.4 项目 CRD 示例

以下是一个典型的 Argo CD Project 定义,展示了如何通过项目模型限制 Secrets 的源和目标:

apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: secure-secrets-project
  namespace: argocd
spec:
  description: "Project for high-security Secrets rotation"
  # 允许的源仓库
  sourceRepos:
  - 'https://git.internal.company.com/team-a/secrets-repo.git'
  # 允许的目标集群和命名空间
  destinations:
  - namespace: prod-secure
    server: https://kubernetes.default.svc
  - namespace: staging-secure
    server: https://kubernetes.default.svc
  # 只允许操作 Secret 资源
  clusterResourceWhitelist:
  - group: ''
    kind: Secret
  # 禁止手动同步,强制 Git 驱动
  syncWindows:
  - kind: deny
    schedule: '* * * * *'
    duration: 1m
    applications:
    - '*'
    manualSync: true
  # 角色绑定
  roles:
  - name: rotation-admin
    description: "Can trigger sync for Secrets rotation"
    policies:
    - p, proj:secure-secrets-project:rotation-admin, applications, sync, secure-secrets-project/*, allow
    groups:
    - team-a-rotation

3.5 项目模型与 Secrets 轮换的映射关系

下表总结了项目配置项如何直接服务于 Secrets 轮换策略:

项目配置项 轮换策略用途 推荐值
sourceRepos 限定轮换脚本和加密 Secret 文件的唯一来源 只包含经过审计的专用 Secrets 仓库
destinations 防止轮换后的 Secret 被错误部署到非目标环境 按环境(prod/staging)分别配置
clusterResourceWhitelist 限制轮换操作只影响 Secret 资源,避免误改其他资源 group: '' + kind: Secret
syncWindows 控制轮换的生效窗口,避免在业务高峰期触发 禁止手动同步,强制自动同步
roles/policies 精细控制谁可以触发轮换同步 创建专用 rotation-admin 角色
注意: 项目模型中的 namespaceResourceBlacklist 和 namespaceResourceWhitelist 是互斥的。如果同时配置,Argo CD 会优先使用黑名单。在 Secrets 轮换场景中,建议使用白名单模式,明确只允许 Secret 资源,避免遗漏。