接着上一篇 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 团队维护,平台组只读
└── ...部署清单
什么时候值得拆?两个真实信号:
- 权限真正冲突。platform 里的东西(全局认证、RBAC)改错是全站事故,业务团队的误操作风险你不想承担——这是治理问题;
- 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 就完事,迁移成本很低。
一句话总结:公共的东西不是”没地方放”,而是要放到一个审批更严、拥有者更明确的地方——”一个仓库里的严路径”和”独立仓库”,是同一件事的两种力度,按团队规模选力度就行。