4. 第一个应用部署:创建 Application、定义 Source 与 Destination、同步策略(Manual / Auto)
在 Argo CD 中,Application 是部署管理的核心资源对象。它定义了“从哪个仓库拉取配置”(Source)、“部署到哪个目标集群/命名空间”(Destination)以及“如何执行同步”(Sync Policy)。本章将带领你完成第一个 Application 的创建,并深入理解这三个关键配置项。
4.1 Application 资源结构总览
一个完整的 Application 定义包含以下核心字段:
| 字段路径 | 说明 | 示例值 |
|---|---|---|
spec.source |
定义配置来源(Git 仓库、Helm Chart 或 OCI 制品) | https://github.com/example/my-app.git |
spec.source.path |
仓库内清单文件所在目录路径 | ./k8s/overlays/production |
spec.source.targetRevision |
分支、标签或 commit SHA | main 或 v1.2.3 |
spec.destination.server |
目标集群 API Server 地址 | https://kubernetes.default.svc |
spec.destination.namespace |
目标命名空间 | production |
spec.syncPolicy |
同步触发方式(Manual / Auto) | automated: {} |
4.2 定义 Source:配置来源
Source 支持三种类型,最常用的是 Git 仓库。以下是一个完整的 Source 定义示例:
spec:
source:
repoURL: 'https://github.com/argocd-examples/guestbook.git'
path: 'guestbook'
targetRevision: 'HEAD'
directory:
recurse: true
exclude: '{{ .Values.excludePattern }}'
- repoURL:仓库地址,支持 HTTPS、SSH 或私有仓库凭证引用。
- path:仓库内子目录,Argo CD 只读取该目录下的 YAML 文件。
- targetRevision:指定分支(
main)、标签(v1.0.0)或 commit(abc123)。 - directory:对普通 YAML 清单的额外配置,如递归扫描或排除模式。
source 下添加 chart: 字段而非 path:,并指定 helm: 参数块。不要将 Helm Chart 路径与普通 YAML 路径混淆。
4.3 定义 Destination:目标集群与命名空间
Destination 指定资源要部署到哪个 Kubernetes 集群的哪个命名空间。Argo CD 支持多集群管理,通过 server 或 name 标识目标集群。
spec:
destination:
server: 'https://kubernetes.default.svc'
namespace: 'production'
- server:集群 API Server 的完整 URL。对于当前集群,使用
https://kubernetes.default.svc。 - name:集群在 Argo CD 中注册的名称(如
in-cluster),与server二选一。 - namespace:目标命名空间,必须提前存在或由 Argo CD 自动创建(需启用
autoCreateNamespace)。
name 字段引用集群,避免硬编码 URL。集群注册信息存储在 Argo CD 的 Secret 中,便于轮换凭证。
4.4 同步策略:Manual 与 Auto
同步策略决定了 Argo CD 如何响应 Source 与 Destination 之间的差异。两种模式对比如下:
| 特性 | Manual(手动) | Auto(自动) |
|---|---|---|
| 触发方式 | 用户通过 UI / CLI 手动点击 Sync | 检测到差异后自动执行同步 |
| 适用场景 | 生产环境变更审批、金丝雀发布前验证 | 开发/测试环境持续部署、配置漂移自动修复 |
| 回滚控制 | 手动选择历史版本回滚 | 可配合 selfHeal 自动回滚至期望状态 |
| 风险等级 | 低(需人工确认) | 中(需配合 prune 和 allowEmpty 谨慎使用) |
Auto 策略的典型配置:
spec:
syncPolicy:
automated:
prune: true
selfHeal: true
allowEmpty: false
syncOptions:
- CreateNamespace=true
- ApplyOutOfSyncOnly=true
- prune:自动删除目标集群中 Source 不存在的资源。
- selfHeal:当集群内资源被手动修改后,自动恢复为 Source 定义的状态。
- allowEmpty:允许 Source 目录为空时清空目标命名空间。
- syncOptions:附加同步行为,如自动创建命名空间、仅同步差异资源。
prune: true 和 selfHeal: true 前,务必确认 Source 配置的完整性。错误的 Source 定义可能导致整个命名空间被清空。建议先在 Manual 模式下验证 Application 行为。
4.5 创建第一个 Application(CLI 方式)
使用 Argo CD CLI 创建 Application 是最直接的方式。以下命令创建一个名为 guestbook 的 Application:
argocd app create guestbook \
--repo https://github.com/argocd-examples/guestbook.git \
--path guestbook \
--dest-server https://kubernetes.default.svc \
--dest-namespace default \
--sync-policy automated \
--auto-prune \
--self-heal
命令执行后,Argo CD 会立即拉取 Source 仓库,对比目标集群状态,并执行首次同步(如果策略为 Auto)。
4.6 创建第一个 Application(YAML 方式)
对于 GitOps 实践,推荐将 Application 定义本身也存储在 Git 仓库中。以下是一个完整的 Application YAML 示例:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: guestbook
namespace: argocd
spec:
project: default
source:
repoURL: 'https://github.com/argocd-examples/guestbook.git'
path: guestbook
targetRevision: HEAD
destination:
server: 'https://kubernetes.default.svc'
namespace: default
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
将上述 YAML 保存为 guestbook-app.yaml,然后执行:
kubectl apply -f guestbook-app.yaml
Argo CD 会监听 argocd 命名空间下的 Application 资源,自动创建并开始同步。
4.7 Source 与 Destination 的漂移校准流程
下图展示了 Application 从创建到持续校准的完整流程:
4.8 验证 Application 状态
创建完成后,使用以下命令查看 Application 的同步状态:
argocd app get guestbook
# 输出示例:
# Name: guestbook
# Project: default
# Server: https://kubernetes.default.svc
# Namespace: default
# URL: https://argocd.example.com/applications/guestbook
# Repo: https://github.com/argocd-examples/guestbook.git
# Target: HEAD
# Path: guestbook
# Sync Policy: Automated
# Sync Status: Synced
# Health Status: Healthy
关键状态字段:
- Sync Status:
Synced(已同步)、OutOfSync(存在漂移)、Failed(同步失败)。 - Health Status:
Healthy(健康)、Degraded(降级)、Progressing(进行中)。
OutOfSync 状态的出现频率、漂移资源类型以及同步操作的审计日志。建议从第一个 Application 开始就启用 syncPolicy 的详细日志记录。
4.9 本章小结
通过创建第一个 Application,你已掌握:
- 如何定义 Source(仓库、路径、分支)与 Destination(集群、命名空间)。
- Manual 与 Auto 同步策略的差异及适用场景。
- 使用 CLI 和 YAML 两种方式创建 Application。
- Application 从创建到持续校准的完整流程。