3. Argo CD 核心概念:Application、Project、Sync策略、健康检查、自动同步机制

在深入事件驱动与 Knative 故障恢复场景之前,必须牢固掌握 Argo CD 的五大核心概念。它们是定义、管理和自动化 Kubernetes 应用交付的基石。本章将逐一拆解这些概念,并揭示它们如何在故障恢复流程中协同工作。

3.1 Application:部署的原子单元

Application(应用)是 Argo CD 中管理的最小粒度单元。它将一个 Git 仓库中的 Kubernetes 资源定义(YAML/Helm/Kustomize)与一个目标集群和命名空间绑定。一个 Application 实例代表了一个完整的部署逻辑。

核心字段:
  • Source(源): 定义 Git 仓库 URL、目标路径、分支以及配置管理工具(Helm/Kustomize)。
  • Destination(目标): 指定目标 Kubernetes 集群的 API Server URL 和命名空间。
  • Sync Policy(同步策略): 控制如何将源状态应用到目标集群。
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: knative-service-app
  namespace: argocd
spec:
  project: default
  source:
    repoURL: 'https://github.com/example/knative-configs.git'
    targetRevision: HEAD
    path: 'services/review-svc'
  destination:
    server: 'https://kubernetes.default.svc'
    namespace: production
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
      - CreateNamespace=true

3.2 Project:多租户与安全边界

Project(项目)是 Application 的逻辑分组和权限隔离单元。它定义了哪些源仓库、目标集群和资源可以被其内部的 Application 使用。在故障恢复场景中,Project 可以限制恢复操作的范围,防止误操作影响其他业务。

Project 配置项 作用 故障恢复场景示例
sourceRepos 允许引用的 Git 仓库白名单 只允许从可信的故障恢复专用仓库拉取配置
destinations 允许部署的目标集群和命名空间 限制恢复操作只能在 production 命名空间执行
clusterResourceWhitelist 允许创建的集群级别资源 允许创建 Namespace 和 ClusterRole,但禁止创建 PersistentVolume
roles RBAC 角色绑定,控制用户/组的操作权限 仅 SRE 团队拥有触发故障恢复 Application 的 sync 权限

3.3 Sync 策略:从 Git 到集群的桥梁

Sync 策略决定了 Argo CD 如何将 Git 仓库中的期望状态应用到目标集群。它分为手动和自动两种模式,是事件驱动恢复的核心执行引擎。

  • 手动同步: 需要人工在 UI 或 CLI 点击“Sync”按钮。适用于变更审批流程严格的场景。
  • 自动同步: 一旦检测到 Git 仓库或集群状态发生偏离,自动触发同步。这是实现“自愈”和“事件驱动”的基础。
自动同步的三种模式:
  1. prune: false:仅创建或更新资源,不删除集群中已存在的多余资源。
  2. prune: true:同步时会删除集群中不在 Git 仓库定义的资源,确保集群状态与 Git 完全一致。
  3. selfHeal: true:当集群状态被人为修改(如 kubectl edit)而偏离 Git 状态时,Argo CD 会自动将其恢复。

3.4 健康检查:应用状态的生命体征

健康检查(Health Check)用于评估 Application 中的资源是否处于健康运行状态。Argo CD 内置了针对常见 Kubernetes 资源(Deployment、Service、Pod)的健康检查逻辑,并支持通过 Lua 脚本自定义。

健康状态分为:Healthy、Degraded、Progressing、Suspended、Missing。在 Knative 故障恢复中,健康检查是判断服务是否成功恢复的关键指标。

# 自定义健康检查示例:检查 Knative Service 是否 Ready
resourceCustomizations: |
  serving.knative.dev/Service:
    health.lua: |
      hs = {}
      if obj.status ~= nil and obj.status.conditions ~= nil then
        for i, condition in ipairs(obj.status.conditions) do
          if condition.type == "Ready" and condition.status == "True" then
            hs.status = "Healthy"
            hs.message = "Knative Service is Ready"
            return hs
          end
        end
      end
      hs.status = "Progressing"
      hs.message = "Waiting for Knative Service to become Ready"
      return hs

3.5 自动同步机制:自愈与事件驱动的引擎

自动同步机制是 Argo CD 实现 GitOps 自愈和事件驱动部署的核心。它通过持续对比 Git 仓库中的期望状态(Desired State)和集群中的实际状态(Actual State),一旦发现偏离,立即触发同步操作。

Argo CD 自动同步机制流程图 Git 仓库 期望状态 K8s 集群 实际状态 Argo CD 状态对比引擎 拉取 监控 状态 偏离? 触发自动同步 是 等待下一轮检测 否 说明:自动同步依赖 Git 仓库的 Webhook 或 Argo CD 的轮询机制(默认 3 分钟)来触发状态对比。

3.6 核心概念在故障恢复中的协同

在 Knative 服务故障恢复场景中,这些概念形成一个闭环:

  1. Project 定义了恢复操作的边界和权限。
  2. Application 将 Knative Service 的 YAML 配置(存储在 Git 中)与生产集群绑定。
  3. 自动同步策略 确保一旦 Git 中的配置被更新(例如回滚到上一个稳定版本),集群立即执行同步。
  4. 健康检查 持续监控 Knative Service 的 Ready 状态,如果同步后服务仍不健康,Argo CD 会标记为 Degraded 并触发告警。
常见陷阱:
  • 自动同步 + selfHeal 误用: 如果 Knative 服务因自身 Bug 频繁 CrashLoopBackOff,而 Git 配置未变,selfHeal 会不断尝试重新部署,导致“抖动”。此时应结合 syncWindow 或手动暂停同步。
  • 健康检查不完善: 仅依赖 Pod 的 Running 状态是不够的。必须为 Knative Service 编写自定义健康检查,确保其 Ready 条件为 True。
Argo CD 核心概念在 Knative 故障恢复中的协同 Project: knative-recovery Application knative-review-svc Source: Git Repo Dest: K8s Cluster Sync Policy: Automated (prune, selfHeal) Health Check: Knative Ready Condition 目标集群 (production) Knative Service: review-svc Revision: v2 (故障版本) Status: Degraded (CrashLoopBackOff) 同步 当健康检查检测到 Degraded 状态,Argo CD 不会自动回滚,但会触发告警;结合事件驱动机制(后续章节)可自动更新 Git 配置触发恢复。