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 仓库或集群状态发生偏离,自动触发同步。这是实现“自愈”和“事件驱动”的基础。
- prune: false:仅创建或更新资源,不删除集群中已存在的多余资源。
- prune: true:同步时会删除集群中不在 Git 仓库定义的资源,确保集群状态与 Git 完全一致。
- 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),一旦发现偏离,立即触发同步操作。
3.6 核心概念在故障恢复中的协同
在 Knative 服务故障恢复场景中,这些概念形成一个闭环:
- Project 定义了恢复操作的边界和权限。
- Application 将 Knative Service 的 YAML 配置(存储在 Git 中)与生产集群绑定。
- 自动同步策略 确保一旦 Git 中的配置被更新(例如回滚到上一个稳定版本),集群立即执行同步。
- 健康检查 持续监控 Knative Service 的 Ready 状态,如果同步后服务仍不健康,Argo CD 会标记为
Degraded并触发告警。
- 自动同步 + selfHeal 误用: 如果 Knative 服务因自身 Bug 频繁 CrashLoopBackOff,而 Git 配置未变,selfHeal 会不断尝试重新部署,导致“抖动”。此时应结合
syncWindow或手动暂停同步。 - 健康检查不完善: 仅依赖 Pod 的 Running 状态是不够的。必须为 Knative Service 编写自定义健康检查,确保其 Ready 条件为 True。