接着上一篇 GitOps 与统一认证落地继续聊。上一篇讲了 GitOps 是什么、auth 服务怎么用,这篇回答一个很自然的追问:业务服务的东西写进 Git 没问题,但 ingress-nginx、RBAC、监控这些 k8s 公共的东西放哪?也是同一个仓库吗?还是搞一个专门的仓库?

先说结论

搞专门的仓库是对的——这正是业界标准分法。但分法有轻重两档,不用一上来就拆。关键是一个思维转换:

业务团队的仓库里放”代码”,另外有一个仓库(或一个路径)放”集群长什么样”。

也就是说业务仓库(放代码、跑 CI)和 GitOps 仓库(放部署清单)本来就是两个东西;而 GitOps 仓库内部,还要再把”各团队自己的应用”和”平台公共的东西”分开——因为后者改错是全站事故,审批力度应该不一样。

方案一:单一 GitOps 仓库 + CODEOWNERS(起步推荐)

gitops-repo/
├── apps/          # 各团队的部署清单,各团队负责自己的目录
│   ├── auth-service/
│   └── order-service/
├── platform/      # ingress-nginx、监控、cert-manager、RBAC、namespace...
└── envs/          # dev / staging / prod

一个仓库管所有,但用 CODEOWNERS 按路径卡审批:

# CODEOWNERS
/platform/            @platform-team
/apps/auth-service/   @auth-team
/apps/order-service/  @order-team

效果:改 platform/ 必须平台组 review,各团队改自己目录不受影响。一个仓库就能实现”公共的东西专人把关”,起步阶段这就够了。

方案二:平台仓库 + 应用仓库分离(团队多了再拆)

platform-repo/     # 平台组维护,业务团队只读
├── ingress-nginx/
├── monitoring/
├── argocd/
├── rbac/
└── bootstrap/     # 集群初始化:namespace、quota、网络策略、App of Apps

team-order-repo/   # order 团队维护,平台组只读
└── ...部署清单

什么时候值得拆?两个真实信号:

  1. 权限真正冲突。platform 里的东西(全局认证、RBAC)改错是全站事故,业务团队的误操作风险你不想承担——这是治理问题;
  2. CI 机器人的凭证问题。CI 构建完要自动改仓库里的镜像 tag,但 GitHub/Git 的写凭证(deploy key / token)是仓库级的——monorepo 里给 order 团队的 CI bot 一个 token,它理论上能改 platform。拆仓之后每个团队的 bot 只拿到自己仓库的凭证,爆炸半径物理隔离。这是技术问题,而且是最硬的那个。

Argo CD 怎么管多个仓库

Argo CD 天然支持多 repoURL——每个 Application 声明自己的 source 仓库就行。再用 App of Apps 收口:platform 仓库里放一个”根应用”,指向一个目录,目录里声明所有 Application(有的指向 platform 仓库自己、有的指向各团队仓库)。

于是:

  • 新团队接入 = 在 platform 仓库提个 PR,加一个指向他们仓库的 Application;
  • 平台组对所有集群里的”部署行为”保持全局视野,但不用碰各团队的文件;
  • platform 仓库本身就是”这个集群有哪些东西”的清单。

平台仓库里具体放什么

  • ingress-nginx(含全局认证 ConfigMap)、cert-manager、监控告警规则、日志采集;
  • namespace 划分、ResourceQuota、NetworkPolicy、RBAC;
  • auth 服务 + 分级放行表(它属于平台组件);
  • Kyverno 策略;
  • App of Apps 根应用和集群引导(bootstrap)配置。

我的建议

现在这个阶段:先建一个 GitOps 仓库,目录里把 platform/ 和 apps/ 分开,配上 CODEOWNERS,把 auth 服务、ingress-nginx ConfigMap、分级放行表搬进去跑通全流程。

等出现了上面两个拆仓信号(权限冲突、bot 凭证),再把 platform/ 原样平移成独立仓库——目录结构不变,Argo 的 source 改个 repoURL 就完事,迁移成本很低。

一句话总结:公共的东西不是”没地方放”,而是要放到一个审批更严、拥有者更明确的地方——”一个仓库里的严路径”和”独立仓库”,是同一件事的两种力度,按团队规模选力度就行。

参考