这篇文章本身就是简体中文写成的,因此译文与原文一致。以下为整理后的版本(语言上已符合自然口语化的中文表达,产品名保留英文):
ArgoCD vs 手动操作:效率对比实测
为什么要做这个对比
上个月我们团队出了一次事故:凌晨两点,一个同事手动 kubectl edit 改了生产环境的 ConfigMap,改完忘了同步另外两个副本的 YAML 文件。第二天另一个同事基于旧配置发了版,直接把凌晨的修改覆盖回去了。排查了三个小时才找到原因。
这次事故之后我下决心把 ArgoCD 引入团队,但推新工具总有人不服气:“我用 kubectl 三行命令搞定的事,为什么要去界面上点来点去?”行,那我们就实测。我拿我们一个真实的微服务项目(6 个服务,3 个环境)做了一周的对比,把两种方式的操作耗时、出错率都记了下来。这篇文章就是那份实测报告。
环境准备
先说下基础环境,你可以照着搭一个最小版本:
- K8s 集群:v1.28,云上的托管集群
- ArgoCD 安装:
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
装完之后暴露 UI(测试环境用 port-forward 就够了):
kubectl port-forward svc/argocd-server -n argocd 8080:443
默认用户是 admin,密码取自 argocd-initial-admin-secret。
然后建一个应用,指向我们的 Git 仓库:
argocd app create demo-app \
--repo https://git.example.com/devops/k8s-manifests.git \
--path overlays/production \
--dest-server https://kubernetes.default.svc \
--dest-namespace production \
--sync-policy automated
实测场景一:改一个镜像版本
这是最日常的操作。手动方式的流程是:
- 本地改 deployment.yaml 里的 image tag
git add . && git commit && git pushkubectl apply -f deployment.yamlkubectl rollout status deployment/demo-app
我掐了秒表,熟练操作大约 90 秒,其中大部分时间浪费在“我改的是哪个文件来着”和“要不要顺手 apply 一下别的”这种犹豫上。
ArgoCD 方式,因为开了 auto-sync,改完 YAML push 之后什么都不用做。ArgoCD 每 3 分钟轮询一次仓库(后面会说到这是个坑),推完之后打开 UI 就能看到同步进度和 Pod 滚动状态。
实测:commit 30 秒,剩下全自动。而且 UI 上能清楚看到新旧 ReplicaSet 的替换过程,比 rollout status 直观得多。
实测场景二:紧急回滚
这才是拉开差距的地方。
手动方式回滚有两种:
kubectl rollout undo deployment/demo-app --to-revision=12
问题是:这个操作不会写回 Git。集群状态和仓库状态从此不一致,下次有人 apply 就是灾难重演。
ArgoCD 方式,直接在 Git 里 revert 那个 commit:
git revert abc1234
git push
60 秒后集群自动回滚完毕,Git 历史里多了一条 revert 记录,谁改的、为什么改(commit message 里写清楚)全部可追溯。
实测场景三:环境间同步
我们要把 staging 验证过的配置推到 production。手动方式:把 staging 目录的文件复制到 production 目录,然后挨个 diff、apply。6 个服务下来花了 15 分钟,中间还漏了一个服务的资源限额。
ArgoCD 用 Kustomize 的 overlay 结构,base 里放公共配置,staging 和 production 只放差异。改一个 base 文件,两个环境各自的 Application 都能看到漂移和待同步项,在 UI 里逐个确认同步。整个流程 4 分钟,而且 UI 的 diff 视图让我发现了一个之前手动同步时一直被覆盖的错误配置。
一个意外的坑:auto-sync 的轮询延迟
前面提到 3 分钟轮询。实测中我们最不适应的就是这个:push 完以为完事了,结果 2 分半之后才开始同步。解决方案有两个:
方案一,Webhook。给 Git 仓库配一个指向 ArgoCD API 的 webhook,push 即触发,延迟降到 10 秒以内。
方案二,手动触发(CI 流水线最后一步):
argocd app sync demo-app --async
我们最终用了 webhook + 在 CI 里显式 argocd app wait --synced --health 做发布确认,效果最好。
一周数据汇总
| 操作 | 手动 | ArgoCD |
|---|---|---|
| 改镜像版本 | 90 秒 | 30 秒 + 自动 |
| 回滚 | 2 分钟(且不可追溯) | 60 秒(Git 可追溯) |
| 环境间同步 | 15 分钟 | 4 分钟 |
| 排查“现在线上到底是什么版本” | 多条命令拼凑 | UI 一眼 |
那一周我们没有再出配置漂移事故——不是因为大家更小心了,而是漂移在 UI 上是红的,藏不住。
不吹不黑:ArgoCD 的局限
- 学习成本真实存在。Application、Project、App-of-Apps 这些概念,团队里完全没接触过 GitOps 的人需要至少一周适应期。
- 密钥管理要另外解决。ArgoCD 不能直接管 Secret,我们接了 Sealed Secrets,又是一套要学的东西。
- 紧急情况时会别扭:真出大事时手动 kubectl 确实快,但改完必须马上
argocd app diff核对并补回 Git,否则自动同步会把它打回去。 - 小项目杀鸡用牛刀:一两个服务的玩具项目,直接 kubectl 挺好,别折腾。
我的结论
如果团队超过 3 个人、服务超过 5 个,ArgoCD 带来的可追溯性和一致性是手动操作永远给不了的。那些说“kubectl 更快”的人没说错——单次操作确实快,但事故成本才是大头。我们那三个小时的排查时间,够 ArgoCD 跑十年了。
建议从非关键环境开始,跑两周,让大家看看那个漂移检测的红色标记——比任何布道都管用。