GitOPS之ArgoCD入门实践
ArgoCD 遵循 GitOPS 模式,将 Git 仓库(支持Git仓库/Helm仓库/OCI仓库,后文以Git库为主描述)作为定义应用期望状态的唯一可信来源,是一款面向 Kubernetes 的声明式 GitOps 持续交付工具。可以将 Git 仓库作为应用程序部署状态的唯一真实来源,支持并自动识别 HelmChart、Kustomize、Jsonnet 以及纯 YAML/JSON 等多种格式来生成Kubernetes的资源清单。
ArgoCD 于 2022 年 12 月 6 日 随整个 Argo 项目一起从 CNCF 毕业,是一款成熟的、可用于生产环境的持续部署 CD 方案。
在传统 CI/CD 流程中(如 Jenkines),CD 部署往往依赖 CI 流水线“推”到集群,集群里实际跑着什么,时间一长就容易和代码脱节。ArgoCD 反过来,由集群内的控制器持续“拉取”并比对 Git 中的清单文件。一旦发现偏差,它会标记为 OutOfSync,并支持自动或手动同步回来。这样做的好处是:所有变更都走 Git 提交,天然有审计记录;回滚就是回退提交;谁改了、改了什么,一目了然。
ArgoCD 核心路径: 开发者推送配置变更 -> 仓库(Git/Helm/OCI仓库) -> ArgoCD(监控到差异) -> K8s 集群(自动同步为目标状态)

ArgoCD核心能力
ArgoCD 的核心能力,可以概括为围绕“持续比对与收敛”这一 GitOps 循环所构建的一组功能。它们共同确保集群状态始终向 Git 中声明的期望状态看齐,并在偏离时提供发现、纠正和管控的手段。
持续同步与偏离检测。 这是 ArgoCD 最根本的能力。ArgoCD 部署在 K8s 集群内,会持续监控你指定的 Git 仓库。一旦发现仓库里的期望状态与集群中的实际状态有差异,应用会被标记为 OutOfSync,它就会自动或手动触发同步,把集群调整到 Git 仓库定义的状态。
多集群管理和部署。 一个 ArgoCD 实例就能向多个 K8s 集群部署应用,非常适合同构多云或混合云管理。
规模化部署管理。 面对多集群或单体仓库中大量应用带来的重复配置问题,ApplicationSet 控制器提供了规模化手段。它通过模板和生成器(如集群列表、Git 目录结构等),自动批量创建和管理多个 Application 资源,无需为每个目标手写配置。这使得向多个环境、多个集群分发结构相似的应用变得高效且不易出错。
多格式清单支持。 ArgoCD 不绑定特定的配置工具,支持从 Git 仓库中读取 Helm Chart、Kustomize、Jsonnet 以及纯 YAML/JSON 等多种格式来生成 Kubernetes 清单。这降低了团队迁移或混合使用不同工具链的成本。
可视化界面。 提供了功能完整的 Web UI,以可视化方式展示应用资源拓扑、健康状态以及 Git 与集群之间的实时差异(diff),对于排查“部署为何未生效”这类问题尤为直观。
访问控制与安全模型。 在权限管理上,ArgoCD 提供了 SSO 集成(支持 OIDC、LDAP、SAML 等)和基于角色的访问控制(RBAC),允许将应用按 AppProject 分组,并精细限制用户或团队能操作哪些应用、能从哪些源拉取、能部署到哪些目标。此外,ArgoCD 采用拉取(Pull)模型:由集群主动从 Git 拉取配置,而非外部系统推入,因此无需向集群开放入站端口或授予 Git 仓库对私有集群的网络访问权限,这在安全敏感环境中是一项重要优势。
复杂发布流程与生命周期钩子。 为了支持蓝绿部署、金丝雀发布等更复杂的发布策略,ArgoCD 提供了 PreSync、Sync、PostSync 钩子。这些钩子允许在同步过程的不同阶段执行自定义任务(例如数据库迁移、流量切换、验证测试),从而将简单的状态同步扩展为可控的发布流水线。
健康评估与可观测性除了同步状态,ArgoCD 还会对应用资源进行健康状态分析,判断应用是否真正在正常运行、能否处理请求。它提供审计日志,记录应用事件和 API 调用;同时暴露 Prometheus 指标,便于接入现有的监控告警体系。这些能力让团队不仅能知道“配置是否一致”,还能判断“应用是否健康”。
概括而言,ArgoCD 的核心能力覆盖了从发现偏差(漂移检测)、纠正偏差(同步与自愈)、规模化管控(多集群与 ApplicationSet)、安全接入(RBAC 与 Pull 模型)到发布编排(钩子)和可观测性(健康与指标)的完整闭环,使其成为 Kubernetes 环境下实施 GitOps 持续交付的成熟工具。
ArgoCD核心概念
ArgoCD 的核心概念围绕一个基本循环展开:将 Git 中声明的“期望状态”与 Kubernetes 集群中的“实际状态”进行持续比对,并在两者不一致时执行同步。
状态:
- 目标状态(Target State) 是应用在 Git 仓库中所声明的期望形态,由清单文件定义。
- 实时状态(Live State) 则是集群中实际运行的资源状况,比如部署了哪些 Pod、使用了什么镜像。
- 同步状态(Sync Status) 是比对的结果体现,如果实时状态与目标状态一致,应用处于 Synced;如果存在差异,则标记为 OutOfSync。- - 健康状态(Health) 用于判断应用是否运行正常、能否正常处理请求,即使配置同步无误,应用本身也可能因崩溃或就绪探针失败而处于不健康状态。
- 同步(Sync) 就是使实时状态向目标状态收敛的动作,可以手动触发,也可以配置为自动执行。
- 刷新(Refresh) 则是重新拉取 Git 中的最新内容并与实时状态做比对,它只负责“发现差异”,不负责“消除差异”。
资源对象:
-
Application 是最核心的部署单元。它在一个资源中同时声明了三件事:源(Source),即清单来自哪个 Git 仓库、哪个路径、哪个版本,支持 Kustomize、Helm、Jsonnet 或纯 YAML 等格式;目标(Destination),即部署到哪个集群的哪个命名空间;以及同步策略(SyncPolicy),决定是自动同步还是手动同步、是否在检测到漂移时自动修复(selfHeal)、是否清理 Git 中已删除的资源(prune)。
-
ApplicationSet 解决的是规模化问题。当需要向多个集群或为多个团队生成大量结构相似的 Application 时,用模板加参数生成器批量创建,避免手写重复配置。
-
AppProject 提供逻辑分组和访问控制边界。它把一个或多个 Application 归入同一项目,配合 RBAC 规则限制谁能操作哪些应用、能从哪些 Git 源拉取、能部署到哪些目标集群。在多团队共用一套 ArgoCD 实例的场景中,AppProject 是隔离的基础。
ArgoCD与同类工具的对比
ArgoCD 是带强 UI 的 GitOps 持续交付工具,Flux 是纯控制器风格的轻量 GitOps 引擎,Jenkins X 则是一站式 CI/CD 平台,GitOps 只是其中一环。
| 维度 | ArgoCD | Flux CD | Jenkins X |
|---|---|---|---|
| 定位 | GitOps CD 工具 | 轻量 GitOps 控制器 | 一站式 CI/CD 平台 |
| Web UI | 完整 | 无(可选轻量面板) | 有 |
| 多集群 | 强 | 中 | 中 |
| 多租户/RBAC | 应用层 RBAC,需仔细配置 | K8s 原生 RBAC,隔离更彻底 | 中 |
| 漂移检测/自愈 | 核心能力 | 核心能力 | 依赖底层 |
| 金丝雀分析 | 需配 Argo Rollouts | 需配 Flagger | 一般 |
| 资源占用 | 中 | 低 | 高 |
| 上手难度 | 低 | 中 | 高 |
在 GitOps 工具选型中,ArgoCD 和 Flux 是最常被拿来比较的两个。ArgoCD 的优势在于开箱即用的 Web UI、完善的多集群视图和更直观的 RBAC 配置,适合需要可视化管理和多租户隔离的团队;Flux 更轻量、CLI 优先,适合偏好纯代码化操作、追求低资源占用的技术团队。两者都是 CNCF 毕业项目,质量有保障。Jenkins X 则偏向一站式 DevOps 平台,封装程度高但灵活性相对受限。
获取 ArgoCD Helm Chart
可以通过 藏云阁 HelmChart 仓库中 获取 ArgoCD Helm Chart
helm repo add argoproj.github.io https://charts.cncfstack.com/argoproj.github.io
helm pull argoproj.github.io/argo-cd --version 10.5.0
helm pull 会下载 argo-cd-10.5.0.tgz Helm Chart 文件到本地。
HelmChart安装argocd
部署 ArgoCD 时,一般情况需要修改 Helm Chart 中的默认配置,如镜像仓库、域名、副本数等内容。
推荐新增一个 values.yml 文件,一般不直接修改原 Chart 中的 values.yaml 文件。
在国内/离线环境进行 HelmChart 部署时,最头疼的还是默认配置的镜像拉取问题,可以通过 values.yaml 文件替换修改为可访问的镜像仓库,示例中 image 使用 藏云阁镜像仓库
需要注意的是默认部署的 ArgoCD 是单副本的环境,如果需要高可用的,需要修改 values.yml 文件中的 replicas 为 2 以上。
global:
domain: argocd.cncfstack.com
image:
repository: registry.cncfstack.com/quay.io/argoproj/argocd
dex:
image:
repository: registry.cncfstack.com/ghcr.io/dexidp/dex
redis:
image:
repository: registry.cncfstack.com/ecr-public.aws.com/docker/library/redis
redis-ha:
image:
repository: registry.cncfstack.com/ecr-public.aws.com/docker/library/redis
exporter:
image: registry.cncfstack.com/ghcr.io/oliver006/redis_exporter
haproxy:
image:
repository: registry.cncfstack.com/ecr-public.aws.com/docker/library/haproxy
server:
extensions:
image:
repository: registry.cncfstack.com/quay.io/argoprojlabs/argocd-extension-installer
ingress:
enabled: true
annotations:
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
tls: true
hostname: argocd.cncfstack.com
configs:
params:
server.insecure: true # 允许 HTTP 连接
values.yml 配置完成后,执行以下命令进行 HelmChart 安装
helm -n argocd install argocd --namespace argocd --create-namespace argo-cd-10.5.0.tgz -f values.yml
使用 helm 安装 ArgoCD 的参数
--create-namespace: 如果集群中没有 argocd 命名空间,则创建。argo-cd-10.5.0.tgz: 前面步骤中helm pull下载的 Helm Chart 文件-f values.yml: 使用 values.yml 文件中的配置渲染,其他配置项会使用 HelmChart 中默认的配置。
安装成功后默单个副本 POD 列表
[root@master1 ~]# kubectl -n argocd get pod
NAME READY STATUS RESTARTS AGE
argocd-application-controller-0 1/1 Running 1 (18h ago) 45h
argocd-applicationset-controller-77497b89df-gc9pm 1/1 Running 1 (18h ago) 45h
argocd-dex-server-7c874c5958-vqvgs 1/1 Running 1 (18h ago) 45h
argocd-notifications-controller-6c5f7c5dcc-nkbrt 1/1 Running 1 (18h ago) 45h
argocd-redis-798565fd74-c2spd 1/1 Running 1 (18h ago) 45h
argocd-repo-server-59d57b7dcc-vr7g6 1/1 Running 3 (18h ago) 45h
argocd-server-7c8986577c-c6chs 1/1 Running 1 (18h ago) 45h
WebUI 访问 ArgoCD
在 HelmChart 部署完成后,会自动根据 values.yaml 中的配置创建 ingress 配置,通过 ingress 域名访问 WebUI 界面。
默认的用户名密码:
- 用户名:
admin - 密码: 默认密码保存在 secret 中,可以通过以下命令获取。建议登录后修改默认密码。
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d

使用 ArgoCD 部署 Rancher
ArgoCD 部署应用可以通过 WebUI 进行 Application 创建,也可以通过 yaml 文件进行创建。
下文示例中使用 ArgoCD 来部署 Rancher,需要注意以下几项:
- Application资源默认必须部署在 ArgoCD 运行的 Namespace。即 metadata 中固定为
namespace: argocd,其他 Namespace 需要进行特殊配置。 - repoURL 在实践 GitOPS 时一般是配置 Git 代码仓库地址。这里使用 OCI 仓库地址,需要注意的是 OCI 仓库地址需要以
oci://开头。 - 在部署 Rancher 时,HelmChart 中的配置项需要进行修改,可以在
spec.source.helm.valuesObject中进行修改,这里的配置就是部署时额外的 Rancher values.yaml(特别是 Docker 镜像地址,默认一般是 DockerHub,网络不通。藏云阁镜像仓库提供 Rancher 的所有镜像同步,配置systemDefaultRegistry: "registry.cncfstack.com/docker.io"即可,Rancher部署详情)
rancher-application.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: rancher
namespace: argocd
spec:
project: cncfstack
destination:
namespace: cattle-system
server: https://kubernetes.default.svc
source:
repoURL: oci://registry-local.cncfstack.com/cncfstack/rancher
targetRevision: "2.15.1"
path: . # OCI Helm Chart 必须设置为 "."
helm:
valuesObject:
hostname: rancher.cncfstack.com
bootstrapPassword: "change-password"
systemDefaultRegistry: "registry.cncfstack.com/docker.io"
agentTLSMode: "system-store"
certmanager:
version: "v1.21.1"
ingress:
tls:
source: rancher
syncPolicy:
automated:
prune: true # 自动删除多余资源
selfHeal: true # 自动修复手动变更
syncOptions:
- CreateNamespace=true
- PruneLast=true # 最后再删除资源,减少中断
可以直接使用 kubectl 导入 Application 文件
kubectl apply -f rancher-application.yaml
ArgoCD 部署过程可以查看部署进度、相关资源,以及错误信息等

更多资源
- Github仓库 https://github.com/argoproj/argo-cd
- 官方demo环境: https://cd.apps.argoproj.io/