3、Argo CD 核心概念回顾:Application、Project、Sync Policy、Health Check、多集群管理

在深入多租户故障域隔离演练之前,必须对齐 Argo CD 的核心概念。这些概念是后续追踪与抽检的基石,理解它们的层级关系与配置方式,能帮助 SRE 在演练中快速定位问题根因。

3.1 核心资源模型:Application 与 Project

Argo CD 使用两级资源模型来管理应用部署:Application 是部署单元,AppProject 是租户隔离与策略边界。

概念 作用域 核心职责 多租户关联
Application 命名空间级 定义 Git 源、目标集群/命名空间、同步策略、健康检查 每个租户的每个微服务对应一个 Application
AppProject 集群级 限制可部署的源仓库、目标集群、目标命名空间、资源类型 每个租户对应一个 Project,实现故障域隔离
关键原则:Application 必须归属于一个 AppProject。Project 的 sourceRepos、destinations、clusterResourceWhitelist 等字段共同构成租户的“安全围栏”。

3.2 Sync Policy:同步策略与故障恢复

Sync Policy 决定了 Argo CD 如何将 Git 中的期望状态应用到目标集群。在故障演练中,策略的选择直接影响回滚速度与数据一致性。

  • 自动同步(Auto Sync):Git 状态变化后自动触发同步,适合标准发布流程。演练中需注意自动同步可能覆盖手动注入的故障。
  • 手动同步(Manual Sync):由 SRE 控制同步时机,适合演练期间暂停自动修复,观察故障影响。
  • 自愈(Self-Heal):自动纠正集群中的漂移状态。演练中若开启自愈,Argo CD 会主动恢复被破坏的 Pod,干扰故障持续时间测量。
  • Prune(修剪):删除 Git 中已移除的资源。演练中需谨慎使用,避免误删关键资源。
演练建议:在故障注入阶段,将 Sync Policy 切换为 Manual Sync + 关闭 Self-Heal,确保故障状态被稳定观测。恢复阶段再开启 Auto Sync 验证 Git 驱动修复。

3.3 Health Check:健康状态与故障判定

Argo CD 内置了针对 Kubernetes 资源的健康检查逻辑,用于判断 Application 是否处于 Healthy、Degraded、Progressing 或 Missing 状态。这是追踪故障路径的关键信号。

健康状态 含义 演练中的典型触发场景
Healthy 所有资源运行正常 基线状态
Progressing 正在滚动更新或扩缩容 故障注入后,Argo CD 尝试修复但未完成
Degraded 部分资源失败或不可用 Pod 被删除、配置错误、镜像拉取失败
Missing Application 定义的目标资源在集群中不存在 命名空间被删除、CRD 被移除
注意:自定义资源(CRD)的健康检查需要额外配置 resource.customizations,否则 Argo CD 可能无法正确判断其健康状态,导致故障误报或漏报。

3.4 多集群管理:控制平面与故障域

Argo CD 支持通过一个控制平面管理多个 Kubernetes 集群。在多租户场景中,每个租户的故障域通常对应一个独立的集群或命名空间集合。

Argo CD 多集群管理架构 Argo CD 控制平面 API Server / Controller / Repo Server 集群 A(租户1) 故障域:生产-zone1 命名空间:tenant1-* 集群 B(租户2) 故障域:生产-zone2 命名空间:tenant2-* 集群 C(租户3) 故障域:DR-zone3 命名空间:tenant3-* 多集群故障域隔离要点 每个集群承载独立租户,控制平面通过 cluster credentials 管理 故障域隔离在集群层面实现,一个集群的故障不影响其他集群

3.5 核心概念关系总结

以下关系图展示了 Application、Project、Sync Policy、Health Check 与多集群之间的协作流程:

Argo CD 核心概念协作流程 Git 仓库 期望状态(Manifests) AppProject 租户策略边界 Application 部署单元 Sync Policy 自动/手动/自愈/修剪 Health Check 健康状态判定 目标集群 Kubernetes 资源 流程说明 Git → AppProject 校验 → Application 定义 → Sync Policy 驱动 → 目标集群部署 → Health Check 反馈

3.6 多租户场景下的配置示例

以下是一个典型的多租户 AppProject 配置片段,展示了如何通过 Project 限制租户的故障域范围:

apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: tenant-1-production
spec:
  sourceRepos:
  - 'https://git.company.com/tenant-1/*'   # 只允许租户1的仓库
  destinations:
  - namespace: 'tenant-1-*'                # 只允许 tenant-1- 前缀的命名空间
    server: 'https://kubernetes.default.svc' # 只允许本集群
  clusterResourceWhitelist:
  - group: ''
    kind: 'Namespace'
  - group: 'rbac.authorization.k8s.io'
    kind: 'RoleBinding'
  - group: 'networking.k8s.io'
    kind: 'NetworkPolicy'                   # 租户可创建网络策略隔离流量
  namespaceResourceBlacklist:
  - group: 'rbac.authorization.k8s.io'
    kind: 'ClusterRole'                     # 禁止租户创建集群角色
演练验证点:在故障注入前,确认每个租户的 Application 都正确关联到对应的 AppProject,且 Project 的 destinations 限制与故障域边界一致。这是追踪路径正确性的第一道关卡。