
前几天跟一个同行吐槽,他说:“我们 GitOps 口号喊了两年了,CI/CD 流水线也搭了,Git 仓库里也放了 K8s YAML,但说实话——生产环境一出问题,还是直接 kubectl edit 改的,改完忘了同步回去,下次上线又把配置覆盖了,接着告警就炸了……”
你心里是不是也在点头?👻
去年 The New Stack 的调查数据也印证了这事:只有约 40% 的组织真正实现了声明式期望状态管理。这个概念喊得响,落地时却普遍有个所谓的 GitOps Gap。
今天就拿我司在 GitOps 上的一路折腾(准确说是「我踩过的一系列坑」),聊聊 GitOps 的真实面貌——理念有多美,现实有多骨感,以及那些真正有效的实践到底长啥样。
说白了:GitOps = Git 仓库作为唯一事实来源 + 声明式配置 + 自动协调引擎。
我通常这么打比方:Git 仓库就是你家的装修图纸,Kubernetes 集群就是你家的房子,Argo CD(或 Flux)就是那个认真负责的包工头——它每隔几分钟就瞄一眼图纸,只要发现房子实际装修跟图纸不一样,二话不说就给改回去。
📝Notes: GitOps 的核心不只是一个 CI/CD 方案,它更是一种运维模型,核心是持续协调而非持续部署。
GitOps 的三个核心支柱:
按照 Red Hat 官方说法(参考来源 1),GitOps 扩展了 DevOps 和 IaC 的理念,把 Git 仓库变成集群配置的「唯一真相源」。
调查显示,虽然超过 50% 的云原生部署采用了 GitOps 相关概念或工具,但真正通过声明式配置来管理状态的,也就只有 40% 左右。这 Gap 怎么来的?我琢磨了一下,主要有这几个原因。
很多团队觉得:“我们有 Jenkins,代码改了自动 build 并 apply 到 K8s 集群,这不就是 GitOps 吗?”
错。❌
如果缺少自动协调这个环节——也就是集群里实际跑的状态跟 Git 仓库里的定义不一致时,系统能自动拉回来——那你就只是在做传统 CI/CD,顶多算个 Git 驱动的 DevOps。
服务器着火了,谁会先去 Git 仓库改 YAML 再等流水线跑完?当然是直接 kubectl edit 啊!😱
这部分我深有体会。有一次线上告警,内存压力爆了,我直接 SSH 上去了几个 kubectl scale,火灭了但忘了改 Git。结果其他同事发版时又把副本数覆盖回去了,又火了起来……是的,第二天又重复了一遍。
这就是典型的配置漂移 + 单点知识黑洞,也是 GitOps 要解决的问题,但反过来也成了落地的障碍——因为很多团队习惯了防御式运维——不出事就不管,出事了就先止血,事后再说。
📝声明: 我不是说不能用
kubectl改生产,而是说——如果你这么做了,事后一定要把变更同步回 Git,不要让它成为「幽灵配置」。
选 Argo CD 还是 Flux?这个问题能吵一整天,我来说说自己的感受。
维度 | Argo CD | Flux |
|---|---|---|
社区活跃度 | ✅ 非常活跃,Red Hat、Intuit 等大厂支持 | ⚠️ 母公司 Weaveworks 破产,有资金风险 |
可视化 UI | ✅ 内置 Web UI,直观 | 👎 依赖第三方(如 Weave GitOps,但母公司已停服) |
多集群能力 | ✅ 支持一个 Argo CD 控制多集群 | ✅ 同样原生支持多集群 |
渐进式交付 | ✅ 通过 Argo Rollouts 支持金丝雀/蓝绿 | ⚠️ 支持但不那么直观 |
学习曲线 | 中等(概念多,但文档全) | 较低(配置简洁,operator 原生) |
要我推荐的话:用户规模不大、团队经验一般的,首推 Argo CD,因为它可视化的 UI 和 Red Hat 的持续支持能让 GitOps 的「透明性」更好地体现。
扯了这么多 Gap,还是得说说真正好用的东西。结合我司的踩坑经验和 The New Stack(参考来源 2)总结的实践,以下是我认为最值得上手的 5 条:
别把所有环境(dev/staging/prod)的配置硬编码在一个 overlays/ 下面,那太痛苦了。更有效的做法是:
📝Notes: Kustomize 比 Helm 更「K8s 原生」,但 Helm 的模板能力和社区生态更强。我倾向:All In Helm, 当然, 也推荐普通应用用 Kustomize,复杂中间件/第三方组件用 Helm。
这可能是 GitOps 最大的价值所在。当部署失败或引入配置漂移时,Argo CD 可以自动回退到 Git 仓库中记录的「上一个健康状态」。
关键配置示例(Argo CD Application):
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: my-app
spec:
syncPolicy:
automated:
prune: true
selfHeal: true
allowEmpty: false
retry:
limit: 3
backoff:
duration: 5s
factor: 2
maxDuration: 3m
syncOptions:
- Validate=false
- PrunePropagationPolicy=foreground
- Replace=true设置 selfHeal: true 和自动重试,让集群自己修复自己的配置漂移。
如果你想让 GitOps 不只是「运维工具」,而是「交付平台」,那你一定得试试 Argo Rollouts。
简单来说,它能做到:
金丝雀部署示例:
kind: Rollout
metadata:
name: my-app-rollout
spec:
strategy:
canary:
steps:
- setWeight: 20
- pause: {duration: 2m}
- setWeight: 50
- pause: {duration: 5m}
- setWeight: 100把这个 Rollout 对象提交到 Git,Argo CD 会自动协调并执行金丝雀策略。这比手动控制流量不知道高到哪里去了。
这可不是开玩笑——GitOps 和自动化测试是黄金搭档。建议:
📝Notes: 如果 API Gateway 也通过 GitOps 管理(如 Traefik IngressRoute 的 CRD),那整个流量入口就能实现 Git 驱动的全栈配置,非常爽。
GitOps 的理念很美,但现实很残酷——有些操作天然不适合走 Git:
这些场景,如动态凭证建议用 External Secrets Operator 或 Vault Agent Injector 来解决,而不是硬塞进 Git 的 PR 流程里。
说白了,GitOps 是一个理念,不是魔法。要想让它真正发挥作用,得做到这几点:
写到最后,想起一句古诗:
纸上得来终觉浅,绝知此事要躬行。
我的个人娱乐项目 Homelab2 和公司的全球监控集群都使用 GitOps 的理念进行运维管理.
特别是现在 AI 越来越火, 作为运维, Vibe Coding + GitOps 保障系统和环境稳如老狗, 我已经 AI 运维生产环境大半年了.😎
动手试试看吧。先从你自己负责的一个小服务开始,把它挪到 Argo CD 上管理,体验一把「代码推完,集群自动适配」的感觉。🎉
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。