1. Argo CD 项目级架构概述

Argo CD 作为 Kubernetes 生态中最主流的声明式 GitOps 持续交付工具,其项目级架构设计直接决定了多团队、多环境、多应用场景下的安全边界与运维效率。本节从核心组件、项目与应用程序的关系、多租户架构基础三个维度展开,为后续准入策略评审奠定架构认知基础。

1.1 Argo CD 核心组件

Argo CD 遵循 Kubernetes 控制器模式,由以下核心组件构成,各组件通过 gRPC 和 REST API 协同工作:

组件 职责 部署形态
API Server 暴露 REST/gRPC 接口,处理 Web UI、CLI、CI/CD 系统请求;执行认证、授权、RBAC 校验 Deployment(无状态)
Repository Server 缓存 Git 仓库内容,生成 Kubernetes 清单(Manifest);支持 Helm、Kustomize、Jsonnet 等模板引擎 Deployment(无状态)
Application Controller 持续对比 Git 中期望状态与集群中实际状态,触发同步、自愈、健康检查 Deployment(有状态,需 leader election)
Redis 缓存 Git 仓库元数据、应用状态、会话信息;降低 API Server 与 Repo Server 负载 Deployment 或 StatefulSet
ApplicationSet Controller 基于生成器(Generators)批量创建/管理 Application,支持多集群、多环境自动化 Deployment(可选组件)
Notification Controller 基于应用状态变化触发 Webhook、Slack、Email 等通知 Deployment(可选组件)
架构要点:API Server 是所有外部请求的唯一入口,Repository Server 负责清单渲染,Application Controller 负责状态调和。三者之间的权限隔离是项目级准入策略的第一道防线。
Argo CD 核心组件架构图 Argo CD 核心组件架构图 用户 / CI/CD API Server Repository Server Application Controller Redis Git 仓库 Kubernetes 集群 ApplicationSet Notification 组件交互说明 • API Server 统一入口 • Repo Server 渲染清单 • Controller 状态调和 • Redis 缓存加速

1.2 项目(Project)与应用程序(Application)的关系

在 Argo CD 中,Project 是资源隔离与策略控制的一级逻辑单元,Application 是具体的交付单元。二者构成一对多的包含关系:一个 Project 可以包含多个 Application,每个 Application 必须归属于且仅归属于一个 Project。

1.2.1 核心概念对比

维度 Project(项目) Application(应用)
定位 租户/团队/环境的逻辑边界 单个 Kubernetes 工作负载的 GitOps 描述
作用域 跨集群、跨命名空间、跨应用 单个目标集群 + 单个目标命名空间
策略载体 准入规则、RBAC、同步策略、白名单 同步选项、健康检查、钩子(Hooks)
资源配额 可限制来源仓库、目标集群、资源类型 继承 Project 配额,不可超越
生命周期 长期稳定,由平台管理员管理 随业务迭代频繁创建/更新/删除

1.2.2 典型 YAML 结构示例

# Project 定义
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: team-alpha
  namespace: argocd
spec:
  description: "Alpha 团队项目"
  # 允许的来源仓库
  sourceRepos:
  - 'https://git.company.com/team-alpha/*'
  # 允许的目标集群和目标命名空间
  destinations:
  - namespace: 'team-*'
    server: 'https://kubernetes.default.svc'
  # 允许部署的资源类型
  clusterResourceWhitelist:
  - group: 'apps'
    kind: 'Deployment'
  - group: 'apps'
    kind: 'StatefulSet'
  # 同步策略
  syncWindows:
  - kind: allow
    schedule: '0 0 * * *'
    duration: 8h
---
# Application 定义
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: guestbook
  namespace: argocd
spec:
  project: team-alpha  # 必须引用已存在的 Project
  source:
    repoURL: 'https://git.company.com/team-alpha/guestbook.git'
    path: manifests
    targetRevision: main
  destination:
    server: 'https://kubernetes.default.svc'
    namespace: team-frontend
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
关键约束:Application 的 spec.project 字段一旦创建,默认不可修改(除非启用 --allow-project-update 标志)。Project 的准入策略变更会立即影响其下所有 Application 的同步行为,因此策略评审必须在 Project 层面严格把关。

1.3 多租户架构基础

Argo CD 的多租户能力建立在 Project 隔离 + RBAC 授权 + 资源配额三层模型之上。企业级部署通常采用以下架构模式:

1.3.1 三层租户隔离模型

层级 隔离粒度 实现方式 典型场景
L1:集群级 物理/虚拟集群 Argo CD 管理多个集群,每个集群对应独立环境 开发/测试/生产环境隔离
L2:项目级 Project 逻辑边界 每个团队/产品线一个 Project,配置独立准入策略 多团队共享同一集群
L3:应用级 Application + Namespace 每个微服务一个 Application,部署到独立 Namespace 服务级权限与资源管控

1.3.2 RBAC 与 Project 的绑定关系

Argo CD 的 RBAC 策略通过 argocd-rbac-cm ConfigMap 定义,支持将用户/组绑定到特定 Project 的操作权限:

# argocd-rbac-cm 示例
data:
  policy.default: role:readonly
  policy.csv: |
    # 管理员拥有所有 Project 的管理权限
    p, admin, projects, *, *, allow
    # team-alpha 的成员只能操作 team-alpha 项目
    p, role:team-alpha-admin, projects, get, team-alpha, allow
    p, role:team-alpha-admin, projects, update, team-alpha, allow
    p, role:team-alpha-admin, applications, *, team-alpha/*, allow
    g, alice, role:team-alpha-admin
    g, bob, role:team-alpha-admin
Argo CD 多租户架构分层图 Argo CD 多租户架构分层图 L1: 集群级隔离 生产集群 (prod.example.com) | 预发集群 (staging.example.com) | 开发集群 (dev.example.com) L2: 项目级隔离(Project) Project: team-alpha Project: team-beta Project: team-gamma Project: platform L3: 应用级隔离(Application + Namespace) app: frontend app: backend app: cache app: worker app: monitor app: logging 隔离原则 • 上层隔离下层继承 • 策略逐层收紧

1.4 架构设计对准入策略的影响

核心结论:Project 是 Argo CD 准入策略的锚点。所有准入规则——包括来源仓库白名单、目标集群/命名空间约束、允许的资源类型、同步窗口、以及自定义准入 Webhook——都在 Project 的 spec 中定义。Application 只能在其所属 Project 的策略边界内运作。

在后续章节中,我们将深入剖析以下准入策略评审要点:

  • 来源仓库策略:如何通过 sourceRepos 限制 Git 仓库范围,防止未授权代码注入
  • 目标集群策略:通过 destinations 控制 Application 可部署的目标集群与命名空间
  • 资源类型白名单:使用 clusterResourceWhitelist 和 namespaceResourceBlacklist 精细管控 Kubernetes 资源
  • 同步窗口策略:通过 syncWindows 定义允许自动同步的时间窗口,避免生产窗口外变更
  • 自定义准入 Webhook:结合 Argo CD 的 Pre-Sync / Post-Sync Hooks 或外部准入控制器实现扩展校验