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 之间的核心关系:
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 时自动告警,以便及时调整资源配额。