3. Argo CD Application 资源定义:Application CRD 结构、Source 与 Destination 配置、Sync Policy 详解

在 Argo CD 中,Application 是核心的声明式资源,它定义了“从哪个仓库拉取(Source)”、“部署到哪个目标集群/命名空间(Destination)”以及“如何同步(Sync Policy)”。理解 Application CRD 的结构是进行滚动升级资源配额校准的前提。

3.1 Application CRD 顶层结构

一个标准的 Application 资源包含以下四个主要部分:

字段路径 类型 说明
spec.source Source 定义应用清单的来源(Git、Helm、OCI)
spec.destination Destination 定义部署的目标集群和命名空间
spec.syncPolicy SyncPolicy 定义自动/手动同步策略及自愈行为
spec.ignoreDifferences []ResourceIgnoreDifferences 定义忽略差异的字段(如资源配额自动伸缩)
关键点: 在滚动升级资源配额校准场景中,ignoreDifferences 常用于忽略 spec.containers[*].resources 的自动调整,避免 Argo CD 将资源配额回滚到旧值。

3.2 Source 配置详解

spec.source 定义了应用清单的获取方式。Argo CD 支持三种 Source 类型:

  • Git 仓库:最常用,指向一个 Git 仓库的特定路径和分支。
  • Helm Chart:支持从 Helm 仓库或 Git 仓库中的 Helm Chart 目录拉取。
  • OCI 仓库:从 OCI 兼容的容器镜像仓库拉取 Helm Chart。

3.2.1 Git Source 核心字段

字段 示例值 说明
repoURL https://github.com/example/app.git Git 仓库地址
path deploy/production 仓库内清单文件所在目录
targetRevision main 或 v1.2.3 分支、标签或 commit SHA
directory.recurse true 是否递归扫描子目录

3.2.2 Helm Source 核心字段

字段 示例值 说明
chart nginx-ingress Helm Chart 名称
repoURL https://charts.bitnami.com/bitnami Helm 仓库地址
targetRevision 9.0.0 Chart 版本
helm.values 内联 YAML 覆盖 values 文件
helm.parameters 键值对列表 单个参数覆盖
实践建议: 在滚动升级场景中,建议将资源配额(requests/limits)作为 Helm values 参数暴露,通过 helm.parameters 或 helm.values 动态注入,避免硬编码在 YAML 中。

3.3 Destination 配置详解

spec.destination 定义了应用部署的目标位置。它包含两个核心字段:

字段 示例值 说明
server https://kubernetes.default.svc 目标集群 API Server 地址(in-cluster 表示当前集群)
namespace production 目标命名空间
name prod-cluster 集群名称(替代 server,需在 Argo CD 中注册)
注意: 当使用 name 字段时,必须确保该集群已在 Argo CD 的 argocd cluster add 中注册。对于多集群部署,建议使用 name 提高可读性。

3.4 Sync Policy 详解

spec.syncPolicy 控制 Argo CD 如何将 Source 中的清单同步到 Destination。它包含三个子策略:

3.4.1 自动同步策略(automated)

字段 类型 说明
prune bool 是否删除目标集群中 Source 不存在的资源
selfHeal bool 是否自动修复手动修改的资源(回滚到 Git 状态)
allowEmpty bool 是否允许 Source 为空时删除所有资源

3.4.2 同步选项(syncOptions)

用于微调同步行为,常用选项包括:

  • Validate=false:跳过 Kubernetes 验证(用于快速部署)
  • CreateNamespace=true:自动创建目标命名空间
  • PruneLast=true:先同步新资源,再删除旧资源(滚动升级推荐)
  • ApplyOutOfSyncOnly=true:仅应用不同步的资源
  • RespectIgnoreDifferences=true:尊重 ignoreDifferences 配置

3.4.3 重试策略(retry)

字段 示例值 说明
limit 5 最大重试次数
backoff.duration 5s 初始重试间隔
backoff.factor 2 间隔倍增因子
backoff.maxDuration 3m 最大重试间隔

3.5 Application CRD 完整示例

以下是一个适用于滚动升级资源配额校准场景的完整 Application 定义:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-app-production
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/example/my-app.git
    targetRevision: main
    path: deploy/production
    helm:
      values: |
        replicaCount: 3
        resources:
          requests:
            cpu: "500m"
            memory: "512Mi"
          limits:
            cpu: "1000m"
            memory: "1Gi"
  destination:
    server: https://kubernetes.default.svc
    namespace: production
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
      allowEmpty: false
    syncOptions:
      - CreateNamespace=true
      - PruneLast=true
      - RespectIgnoreDifferences=true
      - ApplyOutOfSyncOnly=true
    retry:
      limit: 5
      backoff:
        duration: 5s
        factor: 2
        maxDuration: 3m
  ignoreDifferences:
    - group: apps
      kind: Deployment
      jsonPointers:
        - /spec/template/spec/containers/0/resources
    - group: autoscaling
      kind: HorizontalPodAutoscaler
      jsonPointers:
        - /spec/metrics
校准要点: 上述示例中的 ignoreDifferences 配置了忽略 Deployment 的 resources 字段和 HPA 的 metrics 字段。这样,当滚动升级过程中资源配额被临时调整时,Argo CD 不会将其回滚,确保校准测试顺利进行。

3.6 Source 与 Destination 关系图

下图展示了 Source、Destination 与 Sync Policy 之间的核心关系:

Argo CD Application 核心组件关系图 Application CRD 核心组件关系 Source(来源) Git 仓库 Helm Chart OCI 仓库 路径: deploy/prod 分支: main Helm Values 包含资源配额定义 Sync Policy(同步策略) 自动同步 Prune: true SelfHeal: true Sync Options PruneLast=true RespectIgnoreDiff 重试策略: 5次 Destination(目标) 集群 https://k8s-api:6443 命名空间 production 部署资源 Deployment Service, HPA Source 定义“拉什么”,Destination 定义“放哪里”,Sync Policy 定义“怎么同步”

3.7 滚动升级场景下的 Sync Policy 配置建议

针对滚动升级资源配额校准测试,推荐以下 Sync Policy 配置组合:

配置项 推荐值 原因
automated.prune true 确保旧版本资源被清理
automated.selfHeal true 防止手动修改干扰校准结果
syncOptions.PruneLast true 先创建新资源再删除旧资源,保障滚动升级连续性
syncOptions.RespectIgnoreDifferences true 允许资源配额临时调整不被回滚
retry.limit 3-5 网络抖动或资源争抢时自动重试
校准测试技巧: 在测试阶段,可以将 automated.selfHeal 临时设为 false,手动调整资源配额后观察应用行为。确认校准值后,再开启 selfHeal 让 Argo CD 接管。

3.8 多 Source 与多 Destination 扩展

Argo CD 2.6+ 支持 多 Source 和 多 Destination 配置:

  • 多 Source:通过 spec.sources(复数)字段,可以同时从多个仓库拉取清单并合并部署。
  • 多 Destination:通过 spec.destinations(复数)字段,可以将同一应用部署到多个集群或命名空间。
注意: 多 Source 和多 Destination 是高级特性,在滚动升级资源配额校准场景中,建议先使用单 Source 单 Destination 简化问题排查。确认校准流程稳定后,再扩展到多环境。

3.9 资源配额校准的 ignoreDifferences 配置

在滚动升级过程中,资源配额(requests/limits)可能会被 HPA 或 VPA 自动调整。为避免 Argo CD 将这些调整视为“漂移”并回滚,需要配置 ignoreDifferences:

ignoreDifferences:
  - group: apps
    kind: Deployment
    jsonPointers:
      - /spec/template/spec/containers/0/resources/requests
      - /spec/template/spec/containers/0/resources/limits
  - group: apps
    kind: StatefulSet
    jsonPointers:
      - /spec/template/spec/containers/0/resources
  - group: ""
    kind: Pod
    jsonPointers:
      - /spec/containers/0/resources
校准核心: 通过 ignoreDifferences 将资源配额字段排除在同步范围之外,使得 Argo CD 只关注应用逻辑(镜像版本、副本数等),而资源配额的动态调整由校准测试独立控制。

3.10 Application 状态与健康检查

Argo CD 为每个 Application 维护两个关键状态:

状态 可能值 说明
Sync Status Synced / OutOfSync / Unknown 表示 Source 与 Destination 是否一致
Health Status Healthy / Degraded / Progressing / Missing / Unknown 表示部署的资源是否正常运行

在滚动升级资源配额校准过程中,重点关注 Progressing 和 Degraded 状态:

  • Progressing:表示滚动升级正在进行,资源配额正在调整。
  • Degraded:表示资源配额不足导致 Pod 无法启动,需要立即校准。
监控建议: 配置 Argo CD Webhook 或 Prometheus Alert,当 Application 状态变为 Degraded 时自动告警,以便及时调整资源配额。