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 集群。在多租户场景中,每个租户的故障域通常对应一个独立的集群或命名空间集合。
3.5 核心概念关系总结
以下关系图展示了 Application、Project、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 限制与故障域边界一致。这是追踪路径正确性的第一道关卡。