生产环境 DevOps 实战 | 第 5 天:Argo CD 核心概念入门——Application、Project、Sync 策略详解

第 5/60 天

引言

在 GitOps 的浪潮中,Argo CD 已经成为 Kubernetes 生态中最受欢迎的持续交付工具。无论是初创公司还是大型企业,Argo CD 都在生产环境中承载着关键业务的部署任务。

然而,很多初学者在第一次接触 Argo CD 时,常常被 Application、Project、Sync 策略这些核心概念搞晕:Argo CD Application 和 Kubernetes 的 Deployment 有什么关系?Project 到底在隔离什么?Sync 策略中的自动同步和自愈有什么不同?

本文将深入浅出地介绍 Argo CD 的三大核心概念——Application(应用)Project(项目)Sync(同步)策略,配合完整的 YAML 示例和实战命令,帮助你快速掌握 Argo CD 的使用精髓。无论你是刚刚接触 GitOps 的运维工程师,还是正在评估 Argo CD 的架构师,这篇文章都能为你提供清晰的认知框架。

核心概念

什么是 Argo CD?

Argo CD 是一个基于 Kubernetes 的声明式 GitOps 持续交付工具。它的核心理念是:Git 仓库中保存的 Kubernetes 清单文件是集群状态的「唯一事实来源」,Argo CD 负责确保集群中的实际状态与 Git 中声明的状态保持一致。

三大核心概念关系图

┌─────────────────────────────────────────────────────────┐
│                    Argo CD 架构                          │
│                                                         │
│  ┌──────────────┐    ┌────────────────┐                 │
│  │  Git 仓库     │    │  Kubernetes    │                 │
│  │  (声明状态)   │◄───│  集群          │                 │
│  └──────────────┘    │  (实际状态)     │                 │
│        ▲             └────────────────┘                 │
│        │  Argo CD 持续比较 & 同步                        │
│        │                                                │
│  ┌─────────────────────────────────────┐                │
│  │  Argo CD 内部资源                    │                │
│  │                                     │                │
│  │  ┌──────────┐    ┌───────────────┐  │                │
│  │  │ Project  │───►│ Application   │  │                │
│  │  │ (项目)   │    │ (应用)        │  │                │
│  │  └──────────┘    └───────┬───────┘  │                │
│  │                           │          │                │
│  │                    ┌──────▼───────┐  │                │
│  │                    │ Sync 策略    │  │                │
│  │                    │ (同步策略)   │  │                │
│  │                    └──────────────┘  │                │
│  └─────────────────────────────────────┘                │
└─────────────────────────────────────────────────────────┘

1. Application(应用)

Application 是 Argo CD 中最核心的资源对象,它定义了一个部署单元——从哪个 Git 仓库的哪个路径读取 Kubernetes 清单,部署到哪个目标集群和命名空间。

一个 Application 包含三个关键要素:

要素 说明 示例
Source(来源) Git 仓库地址、路径、分支 https://github.com/example/app-config.git,路径 deploy/overlays/prod
Destination(目标) 目标集群 URL 和命名空间 https://kubernetes.default.svc,命名空间 production
Sync Policy(同步策略) 自动/手动同步、自愈、修剪行为 automated: { prune: true, selfHeal: true }

2. Project(项目)

Project 是 Argo CD 中的逻辑隔离单元,用于将多个 Application 分组管理,并对其施加访问控制和安全约束。核心功能包括:

  • 来源仓库白名单:限制 Project 下的 Application 只能从指定的 Git 仓库拉取配置
  • 目标集群白名单:限制 Application 只能部署到指定的目标集群和命名空间
  • 资源类型限制:限制可以创建的资源类型(如禁止创建 ClusterRole)
  • RBAC 权限:与 Argo CD RBAC 集成,控制不同用户/团队对 Project 的访问权限

3. Sync 策略(同步策略)

Sync 策略定义了 Argo CD 如何将 Git 中的声明状态应用到集群。分为同步策略同步选项两个维度:

同步策略类型:

策略 说明 适用场景
手动同步 需要人工触发 argocd app sync 命令或点击 UI 按钮 生产环境、变更审批流程严格的团队
自动同步 Argo CD 自动检测 Git 状态变化并同步到集群 开发环境、快速迭代的团队

核心同步选项:

选项 说明 风险
Prune(修剪) 自动删除 Git 中已移除但集群中仍存在的资源 高——误删资源
SelfHeal(自愈) 自动恢复被手动修改的集群资源到 Git 声明状态 中——禁止临时调试修改
Apply Out of Sync Only 仅同步状态不一致的资源 无——默认行为,减少不必要的 API 调用

实战步骤

环境准备

在开始之前,请确保已经部署了 Argo CD。如果你还没有安装,以下命令可以快速部署:

# 创建命名空间
kubectl create namespace argocd

# 安装 Argo CD(最新稳定版)
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

# 查看 Pod 状态,等待所有组件就绪
kubectl wait --for=condition=Ready pods --all -n argocd --timeout=300s

# 获取初始 admin 密码
kubectl -n argocd get secret argocd-initial-admin-secret 
  -o jsonpath="{.data.password}" | base64 -d

第一步:创建 Argo CD Project

Project 是资源隔离的第一道防线。以下 YAML 创建一个名为 devops-team 的 Project,限制只能从指定的 Git 仓库部署,并且只能部署到 devstaging 命名空间:

# project-devops.yaml
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: devops-team
  namespace: argocd
spec:
  description: "DevOps 团队项目,管理微服务部署"

  # 来源仓库白名单——只允许从这些仓库拉取配置
  sourceRepos:
    - 'https://github.com/example/microservices-config.git'
    - 'https://gitlab.internal.com/team-ops/*'

  # 目标集群和命名空间白名单
  destinations:
    - namespace: dev
      server: https://kubernetes.default.svc
    - namespace: staging
      server: https://kubernetes.default.svc
    - namespace: production
      server: https://kubernetes.default.svc

  # 拒绝创建集群级别的资源(ClusterRole, ClusterRoleBinding 等)
  clusterResourceWhitelist:
    - group: '*'
      kind: '*'

  # 允许创建的命名空间资源类型
  namespaceResourceBlacklist:
    - group: 'rbac.authorization.k8s.io'
      kind: 'ClusterRole'
    - group: 'rbac.authorization.k8s.io'
      kind: 'ClusterRoleBinding'

  # 可选:对同步行为进行限制
  syncWindows:
    - kind: deny
      schedule: '0 22 * * *'
      duration: 6h
      applications:
        - '*-production'
      clusters:
        - 'https://kubernetes.default.svc'
      namespaces:
        - production

部署 Project:

kubectl apply -f project-devops.yaml

说明: syncWindows 字段定义了禁止同步的时间窗口。上面的配置禁止在每晚 22:00 到次日凌晨 4:00 之间对生产环境的任何应用进行同步——这是变更冻结窗口的典型用法。

第二步:创建 Application 资源

Application 是 Argo CD 的核心工作单元。以下示例展示了一个完整的 Application 配置,包含自动同步、自愈和修剪功能:

# application-order-service.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: order-service
  namespace: argocd
  # 为 Application 添加标签,便于分组管理
  labels:
    team: devops
    tier: backend
    environment: production
spec:
  # 所属 Project(必须引用已存在的 Project)
  project: devops-team

  # 来源——Git 仓库配置
  source:
    repoURL: 'https://github.com/example/microservices-config.git'
    targetRevision: main  # 分支或标签
    path: services/order-service/overlays/production
    # 可选:指定 Helm 参数
    helm:
      valueFiles:
        - values.yaml
        - values-production.yaml
      parameters:
        - name: replicaCount
          value: "5"
        - name: resources.requests.cpu
          value: "500m"

  # 目标——部署位置
  destination:
    server: 'https://kubernetes.default.svc'
    namespace: production

  # 同步策略
  syncPolicy:
    automated:
      prune: true       # 自动删除 Git 中已移除的资源
      selfHeal: true    # 自动恢复被手动修改的资源
      allowEmpty: false # 不允许空同步(同步后无资源则报错)
    # 同步选项
    syncOptions:
      - CreateNamespace=true        # 自动创建目标命名空间(如果不存在)
      - PruneLast=true              # 先创建新资源,再删除旧资源
      - ApplyOutOfSyncOnly=true     # 仅应用状态不一致的资源
      - ServerSideApply=true        # 使用服务端 Apply(K8s 1.22+)
      - RespectIgnoreDifferences=true

  # 忽略差异(某些字段自动变化,忽略这些差异避免一直 OutOfSync)
  ignoreDifferences:
    - group: apps
      kind: Deployment
      jsonPointers:
        - /spec/replicas  # 忽略 HPA 自动调整的副本数
    - group: autoscaling
      kind: HorizontalPodAutoscaler
      jsonPointers:
        - /status  # 忽略 status 子资源

部署 Application:

kubectl apply -f application-order-service.yaml

第三步:使用 argocd CLI 管理 Application

除了 YAML 声明式管理,argocd CLI 提供了丰富的交互式命令:

# 登录 Argo CD API Server
argocd login argocd.example.com --username admin --password <password> --insecure

# 列出所有 Application
argocd app list

# 查看 Application 的详细状态
argocd app get order-service

# 手动触发同步(覆盖自动同步策略)
argocd app sync order-service --prune --apply-out-of-sync-only

# 查看 Application 的同步状态和资源树
argocd app diff order-service

# 回滚到上一个同步版本
argocd app rollback order-service --id 1

# 暂停自动同步(临时禁止自动同步,维护时使用)
argocd app set order-service --sync-policy manual

# 恢复自动同步
argocd app set order-service --sync-policy automated --auto-prune --self-heal

# 查看 Application 的事件日志
argocd app logs order-service

# 删除 Application(不会删除集群中的资源,除非指定 --cascade)
argocd app delete order-service

第四步:配置 Sync 窗口与策略约束

在生产环境中,我们通常需要限制同步的时间窗口,避免在业务高峰期触发部署。以下是更精细的同步策略配置:

# sync-windows.yaml
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: production-team
  namespace: argocd
spec:
  sourceRepos:
    - 'https://github.com/example/*'
  destinations:
    - namespace: '*'
      server: 'https://kubernetes.default.svc'

  # 同步窗口——细粒度控制
  syncWindows:
    # 规则 1:工作日 9:00-18:00 允许自动同步
    - kind: allow
      schedule: '0 9 * * 1-5'
      duration: 9h
      applications:
        - '*'
      clusters:
        - '*'
      namespaces:
        - 'dev'
        - 'staging'

    # 规则 2:工作日 22:00-次日 6:00 禁止所有同步(生产环境变更冻结)
    - kind: deny
      schedule: '0 22 * * 1-5'
      duration: 8h
      applications:
        - '*-production'
      namespaces:
        - 'production'

    # 规则 3:周末全天禁止同步生产环境
    - kind: deny
      schedule: '0 0 * * 0,6'
      duration: 24h
      applications:
        - '*-production'
      namespaces:
        - 'production'

    # 手动同步窗口覆盖(允许人工审批后手动同步)
    manualSync: true

第五步:多环境 Application 管理

一个典型的微服务在不同环境(dev/staging/prod)下有不同配置。通过 Argo CD 的 Application 可以实现多环境管理:

# 开发环境 Application
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: order-service-dev
  namespace: argocd
  labels:
    app: order-service
    environment: dev
spec:
  project: devops-team
  source:
    repoURL: 'https://github.com/example/microservices-config.git'
    targetRevision: develop
    path: services/order-service/overlays/dev
  destination:
    server: 'https://kubernetes.default.svc'
    namespace: dev
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
---
# 生产环境 Application(更保守的策略)
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: order-service-prod
  namespace: argocd
  labels:
    app: order-service
    environment: production
spec:
  project: devops-team
  source:
    repoURL: 'https://github.com/example/microservices-config.git'
    targetRevision: main  # 生产环境使用 main 分支,更稳定
    path: services/order-service/overlays/production
  destination:
    server: 'https://kubernetes.default.svc'
    namespace: production
  syncPolicy:
    # 生产环境使用手动同步,需要人工审批
    automated:
      prune: false
      selfHeal: false

第六步:验证 Application 状态

部署完成后,可以通过以下方式验证 Application 状态:

# 通过 CLI 查看 Application 同步状态
argocd app get order-service

# 输出示例:
# Name:               order-service
# Project:            devops-team
# Server:             https://kubernetes.default.svc
# Namespace:          production
# URL:                https://argocd.example.com/applications/order-service
# Repo:               https://github.com/example/microservices-config.git
# Target:             main
# Path:               services/order-service/overlays/production
# Sync Policy:        Automated (Prune)
# Sync Status:        Synced
# Health Status:      Healthy
# 
# GROUP        KIND          NAMESPACE    NAME                  STATUS  HEALTH
# apps         Deployment    production   order-service         Synced  Healthy
# v1           Service       production   order-service         Synced  Healthy
# v1           ConfigMap     production   order-service-config  Synced  Healthy
# autoscaling  Horizontal... production   order-service-hpa     Synced  Healthy

# 通过 API 查询 Application 状态(JSON 格式)
kubectl get application order-service -n argocd -o json | jq '.status'

常见问题

Q1: Application 和 Project 的区别是什么?为什么需要 Project?

A: Application 是具体的部署单元,描述「从哪个仓库、部署到哪个集群、用什么策略」。Project 是 Application 的逻辑分组和权限边界,用于控制「哪些仓库可以拉取、哪些集群可以部署、哪些资源类型可以创建」。

简单说:Application 是「做什么」,Project 是「谁能做什么」。在多团队场景中,Project 至关重要——没有 Project,任何团队都能创建 Application 部署到生产集群,这是巨大的安全风险。

Q2: 自动同步的 SelfHeal 和 Prune 有什么区别?何时应该开启?

A:
SelfHeal(自愈):当有人用 kubectl edit 手动修改了集群中的资源,Argo CD 会自动将其恢复为 Git 中声明的状态。适合需要严格禁止手动修改的环境。
Prune(修剪):当 Git 仓库中删除了某个资源(如删除了一个 Deployment 的 YAML 文件),Argo CD 会自动删除集群中对应的资源。适合需要精确控制资源生命周期的场景。

建议: 开发环境可以同时开启两者;生产环境推荐手动同步,或仅开启 SelfHeal 不开启 Prune(避免误删资源)。

Q3: 创建 Application 报错 rpc error: code = PermissionDenied 怎么办?

A: 通常是因为 Application 引用的 Project 不存在,或者 Application 的 source.repoURL 不在 Project 的 sourceRepos 白名单中。排查步骤:

# 1. 确认 Project 存在
kubectl get appproject -n argocd

# 2. 检查 Project 的 sourceRepos 白名单
kubectl get appproject devops-team -n argocd -o yaml | grep sourceRepos -A 5

# 3. 如果需要,更新 Project 白名单
kubectl edit appproject devops-team -n argocd

Q4: 修改了 Git 仓库中的 YAML,但 Argo CD 没有自动同步?

A: 检查以下几点:
1. 同步策略是否为自动同步kubectl get application <name> -n argocd -o yaml | grep syncPolicy 确认 automated 字段存在
2. Argo CD 轮询间隔:默认每 3 分钟检查一次 Git 仓库。可以配置 webhook 加速(GitHub/GitLab webhook 直达 Argo CD)
3. Sync 窗口限制:确认当前时间不在 syncWindows 的 deny 窗口内
4. Git 仓库访问权限:确认 Argo CD 有读取该仓库的权限(SSH key 或 token)

Q5: 如何实现 Argo CD Application 的蓝绿部署和灰度发布?

A: Argo CD 本身不支持蓝绿发布和灰度发布——这是 Argo Rollouts 的职责。Argo CD 负责部署和同步,Argo Rollouts 负责渐进式发布。两者的关系是:Argo CD 管理 Rollouts 资源,Rollouts 管理 Deployment 的流量切换。我们将在第 39 天(Argo Rollouts 渐进式发布)中详细展开。

总结

本文介绍了 Argo CD 的三大核心概念以及实战配置方法,核心要点如下:

  1. Application 是部署单元:定义了从 Git 仓库到 Kubernetes 集群的完整部署路径,包括来源、目标、策略三要素
  2. Project 是隔离边界:通过来源仓库白名单、目标集群白名单和资源类型限制,实现多团队的安全隔离
  3. Sync 策略控制同步行为:手动同步适合生产环境,自动同步(含 Prune 和 SelfHeal)适合开发环境;Sync 窗口可以限制变更时间
  4. 多环境管理:通过不同分支、不同路径、不同同步策略,可以用 Argo CD 统一管理 dev/staging/prod 环境
  5. CLI 与声明式 YAML 双管齐下:Application 和 Project 既可以用 YAML 声明式管理(GitOps 模式),也可以用 argocd CLI 进行交互式操作

在接下来的文章中,我们将深入 Argo CD 的安装配置、RBAC 权限模型、多环境管理最佳实践,以及 Argo CD 与 Tekton + Harbor 的完整集成方案。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容