ArgoCD GitOps:声明式持续部署

FreeGuideOnline 最新 2026-06-13

什么是 GitOps

GitOps 是一种以 Git 仓库作为单一事实来源的运维模式。所有描述系统期望状态的声明式配置都存储在 Git 中,由自动化控制器持续同步实际运行状态至目标状态。它带来了版本控制、审计追踪、回滚能力以及更好的协作体验。

GitOps 的核心原则:

  • 声明式描述:通过 YAML、JSON 等格式定义整个系统状态。
  • 版本化与不可变:配置变更通过 Git commit 记录,可追溯、可回滚。
  • 自动拉取:控制器自动从 Git 仓库拉取期望状态并应用到目标环境。
  • 持续协调:不间断监控实际状态与期望状态的差异,自动修复。

ArgoCD 简介

ArgoCD 是专为 Kubernetes 设计的声明式持续部署工具,完美践行 GitOps 理念。它将应用程序的定义、配置与环境通过 Git 仓库管理,并自动将其同步到 Kubernetes 集群中。

相比手动 kubectl apply,ArgoCD 提供:

  • 可视化 Web UI,直观管理多集群多应用。
  • 自动同步、漂移检测与自动修正。
  • 完善的 RBAC 与 SSO 集成。
  • 多租户、应用集(ApplicationSet)支持。

核心概念

在深入使用前,需要理解 ArgoCD 的三大核心资源类型:

Application

应用是 ArgoCD 管理的基本单元,它定义了某个 Kubernetes 资源从哪里拉取(源仓库)以及部署到哪个集群和命名空间。一个典型的 Application 声明如下:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-app
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/example/repo.git
    targetRevision: HEAD
    path: kustomize/overlays/prod
  destination:
    server: https://kubernetes.default.svc
    namespace: prod
  syncPolicy:
    automated:
      prune: true
      selfHeal: true

AppProject

AppProject 为 Application 提供逻辑分组和权限边界。可以限制允许的源仓库、目标集群、命名空间以及可部署的资源类型。默认存在一个 default 项目,适合入门使用。

Repository & Cluster

  • Repository 表示 Git 或 Helm 仓库的连接凭证。
  • Cluster 表示要部署到的 Kubernetes 集群信息。ArgoCD 默认管理自身所在集群,也可添加外部集群。

安装 ArgoCD

在 Kubernetes 集群中快速安装:

kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

等待所有 Pod 就绪:

kubectl wait --for=condition=ready pod -l app.kubernetes.io/name=argocd-server -n argocd --timeout=300s

访问 Web UI

默认服务类型为 ClusterIP,可通过端口转发访问:

kubectl port-forward svc/argocd-server -n argocd 8080:443

在浏览器打开 https://localhost:8080,使用初始管理员密码登录,用户名 admin。获取密码:

kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d

创建第一个 Application

准备 Git 仓库

创建一个包含 Kubernetes 清单的 Git 仓库。例如,目录结构:

├── deployment.yaml
├── service.yaml
└── kustomization.yaml

deployment.yaml 示例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.25
          ports:
            - containerPort: 80

使用 Kustomize 或纯 YAML 均可。

通过 CLI 创建应用

安装 ArgoCD CLI:

brew install argocd
# 或下载二进制文件

登录:

argocd login localhost:8080 --insecure

创建应用:

argocd app create my-nginx \
  --repo https://github.com/your-org/your-repo.git \
  --path . \
  --dest-server https://kubernetes.default.svc \
  --dest-namespace default

同步(部署)到集群:

argocd app sync my-nginx

查看状态:

argocd app get my-nginx

通过 Web UI 创建

在 UI 中点击 “New App”,填写同样的信息并点击创建,然后点击 “Sync” 即可部署。

同步策略与自动运维

手动同步与自动同步

默认 Application 需要手动点击 “Sync”。可以配置自动同步以完全实现 GitOps 自动闭环。在 Application 的 syncPolicy.automated 中设置:

  • prune: true 自动删除 Git 中移除的资源。
  • selfHeal: true 当集群状态偏离 Git 定义时自动修正。

修改 Application 添加自动同步:

argocd app set my-nginx --sync-policy automated --auto-prune --self-heal

或直接编辑 YAML:

spec:
  syncPolicy:
    automated:
      prune: true
      selfHeal: true

同步选项

可进一步细粒度控制同步行为,例如:

  • Validate=true:验证清单合法性。
  • CreateNamespace=true:自动创建不存在的命名空间。
  • ApplyOutOfSyncOnly=true:仅同步不同步的资源。

示例:

syncPolicy:
  automated: ...
  syncOptions:
    - CreateNamespace=true
    - PrunePropagationPolicy=foreground

漂移检测与健康状态

ArgoCD 持续检测实际集群状态与 Git 定义的差异,并在 UI 中以 “OutOfSync” 标识。健康状态分为:

  • Healthy:资源处于正常运行状态。
  • Progressing:正在部署或更新中。
  • Degraded:资源状态异常。
  • Suspended:暂停(如 CronJob 挂起)。

结合 selfHeal,任何意外漂移都会被自动恢复,确保系统始终向 Git 中的声明收敛。

使用 Kustomize、Helm 和其他工具

ArgoCD 原生支持多种配置管理工具:

Kustomize

只需在 path 中指向包含 kustomization.yaml 的目录即可。ArgoCD 会自动执行 kustomize build

Helm

创建应用时指定 Helm 仓库和 chart 名称:

argocd app create my-helm-app \
  --repo https://charts.example.com/ \
  --helm-chart my-chart \
  --dest-server https://kubernetes.default.svc \
  --dest-namespace default

或直接引用 Git 中的 Helm chart directory。还可以提供自定义 values.yaml 覆写:

spec:
  source:
    repoURL: ...
    path: ./chart
    helm:
      valueFiles:
        - values-prod.yaml

Jsonnet、Ksonnet、自定义插件

通过添加 Sidecar 或 CMP(Config Management Plugin)可扩展支持任意配置生成方式。

多集群管理

ArgoCD 可以管理任意数量的远端 Kubernetes 集群。添加新集群:

argocd cluster add <context-name> --name <cluster-name>

或通过 Web UI 手动提供 kubeconfig。在创建 Application 时指定 dest-server 为集群 API Server 地址即可部署到该集群。

应用集(ApplicationSet)

当需要基于模板生成大量相似 Application(如多环境、多租户)时,ApplicationSet 控制器通过生成器动态创建 Application。常见生成器:

  • List:固定列表生成。
  • Git:根据 Git 仓库中的目录或文件生成。
  • Matrix:组合多个生成器。
  • Pull Request:为每个 PR 自动创建预览环境。

示例:为 Git 仓库中 apps/* 目录每个子目录创建一个 Application:

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: cluster-addons
spec:
  generators:
  - git:
      repoURL: https://github.com/example/cluster-addons.git
      revision: HEAD
      directories:
      - path: apps/*
  template:
    metadata:
      name: '{{path.basename}}'
    spec:
      project: default
      source:
        repoURL: https://github.com/example/cluster-addons.git
        targetRevision: HEAD
        path: '{{path}}'
      destination:
        server: https://kubernetes.default.svc
        namespace: '{{path.basename}}'

安全与访问控制

单点登录(SSO)

ArgoCD 支持 OIDC、SAML、LDAP 等协议集成。配置 argocd-cm ConfigMap 和 argocd-rbac-cm 即可对接企业身份提供商。

RBAC

基于角色的访问控制可以精确到项目、应用和操作。示例策略:

p, role:developer, applications, sync, my-project/*, allow
g, dev-team, role:developer

通过声明式配置,整个 RBAC 策略也可通过 Git 管理。

最佳实践小结

  • Git 作为唯一真相源:任何集群变更必须通过 Git PR,严禁手动 kubectl
  • 环境分离与目录结构:使用 path 区分环境(如 overlays/devoverlays/prod)。
  • 开启自愈和自动清理selfHeal + prune 确保环境一致性。
  • 设置资源限制与网络策略:通过 AppProject 约束高风险操作。
  • 监控与告警:集成 Prometheus metrics,监控同步状态和性能。
  • 密钥管理:使用密封秘密(Sealed Secrets)或外部密钥管理(如 Vault),不要将明文密钥存入 Git。

下一步学习

  • 探索 Argo Rollouts 实现渐进式交付(蓝绿、金丝雀)。
  • 结合 Argo Workflows 构建 CI/CD 流水线。
  • 学习 ArgoCD Notification 配置同步状态通知。
  • 深入 ApplicationSet 实现大规模多环境管理。

ArgoCD 将 GitOps 的理念落地为简单而强大的运维模式,帮助你实现安全、可重复、可审计的持续部署。现在,动手创建你的第一个 GitOps 应用吧!