4. 第一个应用部署:创建 Application、定义 Source 与 Destination、同步策略(Manual / Auto)

在 Argo CD 中,Application 是部署管理的核心资源对象。它定义了“从哪个仓库拉取配置”(Source)、“部署到哪个目标集群/命名空间”(Destination)以及“如何执行同步”(Sync Policy)。本章将带领你完成第一个 Application 的创建,并深入理解这三个关键配置项。

课前准备:确保已安装 Argo CD CLI 并登录到 Argo CD 服务端,同时准备好一个包含 Kubernetes 清单(Deployment、Service 等)的 Git 仓库。

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: {}
关键概念:Source 与 Destination 共同构成了 Application 的“从哪来到哪去”映射关系。Argo CD 会持续对比 Source 中的期望状态与 Destination 中的实际状态,差异即为“漂移”。

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 清单的额外配置,如递归扫描或排除模式。
避坑提示:如果使用 Helm Chart 作为 Source,需在 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 从创建到持续校准的完整流程:

Application 创建与漂移校准流程 Application 创建与漂移校准流程 用户创建 Application Argo CD 解析 Source 配置 拉取 Git 仓库期望状态 对比 Destination 实际状态 执行同步策略(Manual/Auto) Manual:等待用户确认 Auto:自动执行同步

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 从创建到持续校准的完整流程。