2. GitLab平台架构与部署选型

在动手安装 GitLab 之前,必须先回答一个比“装哪个版本”更根本的问题:这套平台以什么形态运行、由谁维护、故障时如何恢复。GitLab 官方提供三种主流部署形态——Omnibus 包、Helm Chart 与 GitLab Operator,它们并非简单的“新旧替代”关系,而是对应不同的运维能力、集群条件与生命周期管理诉求。选错形态,后期扩容、升级和排障的成本会成倍增加。

三种部署形态的本质差异

Omnibus 是“单机一体化”思路。它把 PostgreSQL、Redis、Gitaly、Sidekiq、Nginx、Puma 等所有组件打包进一个安装包,通过 /etc/gitlab/gitlab.rb 统一配置,再由 gitlab-ctl reconfigure 生成各组件配置并重启服务。它的优势是组件版本经过官方验证、依赖自洽、排障路径清晰;代价是单机资源上限明显,横向扩展需要手工拆分组件。

Helm Chart 是“Kubernetes 原生”思路。它把 GitLab 拆成多个 Deployment/StatefulSet,通过 values.yaml 声明式配置,依赖集群的 Service、Ingress、PVC、Secret 完成编排。它天然支持滚动升级与副本伸缩,但要求团队具备 K8s 运维能力,且对象存储、数据库、Redis 通常需要外部托管服务配合。

GitLab Operator 是“Chart 之上的自动化控制器”。它基于 Kubernetes Operator 模式,用 CRD(如 GitLab 自定义资源)描述期望状态,由控制器持续调谐实际状态。相比直接使用 Helm,Operator 能自动处理升级顺序、备份、证书轮换等有状态操作,适合希望把 GitLab 生命周期纳入 GitOps 流程的团队。

GitLab 三种部署形态的组件承载与运维边界 Omnibus 单机一体化 Nginx(内置) Puma / Workhorse Sidekiq Gitaly PostgreSQL(内置) Redis(内置) 配置入口:gitlab.rb 生效方式:gitlab-ctl reconfigure Helm Chart(K8s 原生) Ingress / Gateway webservice(Deployment) sidekiq(Deployment) gitaly(StatefulSet) 外部 PostgreSQL 外部 Redis / 对象存储 配置入口:values.yaml 生效方式:helm upgrade --install GitLab Operator CRD:GitLab 自定义资源 Controller 调谐循环 自动升级 / 备份编排 证书轮换 / 健康检查 底层仍调度 Helm Release 复用 K8s 存储与网络 配置入口:GitLab CR 生效方式:kubectl apply 运维复杂度低 / 单机为主 自动化程度高 / 集群原生

自建与云托管的取舍

形态确定后,第二个决策是“谁来运维”。自建(Self-Managed)意味着你拥有 GitLab 的全部控制权:数据落在自己的机房或私有云,可深度定制 Runner、镜像仓库、审计策略,也能满足等保与数据不出境要求。但代价是你要承担升级窗口、备份验证、容量规划、CVE 响应等全部责任。以 Omnibus 为例,一次跨大版本升级通常需要先备份、再停写、再升级、再验证,窗口期往往在 1~2 小时。

云托管(GitLab.com SaaS 或云厂商托管版)把底层运维交给服务方,团队只需管理命名空间、成员与 CI 配额。它适合快速起步、团队规模小、无强合规约束的场景。但要注意:SaaS 版的 Runner 共享资源存在排队,敏感代码上传到第三方需要评估;云厂商托管版虽然数据在境内,但版本节奏受服务方控制,某些高级功能可能滞后。

一个常见的折中方案是“自建核心 + 云上 Runner”:GitLab 主实例自建以保证代码与制品可控,CI Runner 部署在云上按需伸缩,兼顾安全与弹性。这种混合模式在中小团队中落地效果较好。

高可用架构设计要点

当团队规模超过 200 人、或 CI 并发持续走高时,单机 Omnibus 会成为瓶颈。此时需要按“无状态横向扩展、有状态主从复制”的原则拆分:

  • 入口层:两台以上 Nginx 或云负载均衡,健康检查指向 /-/health,会话保持非必需(GitLab 使用 JWT)。
  • 应用层:Puma/Workhorse 无状态,可部署多副本,共享同一数据库与 Redis。
  • 数据层:PostgreSQL 采用主从 + Patroni 自动切换;Redis 使用 Sentinel 或 Cluster;Gitaly 按仓库分片,配合 Praefect 做路由与副本一致性。
  • 存储层:制品、LFS、上传文件统一走对象存储(如 MinIO 或云 OSS),避免本地磁盘成为单点。
  • 备份:数据库每日全量 + WAL 归档,Gitaly 仓库快照,备份文件异地存放并定期做恢复演练。
判断是否该上高可用,可以看两个信号:一是单次 gitlab-ctl reconfigure 或升级导致的停机是否已影响业务;二是 Sidekiq 队列积压是否频繁超过 5 分钟。若两者都出现,说明单机已到边界。

选型决策参考

场景推荐形态关键理由
10~50 人,无 K8s 团队Omnibus 单机部署快、依赖自洽、排障简单
50~200 人,已有 K8sHelm Chart复用集群能力,便于扩缩容
200 人以上,强合规Omnibus 多节点 / Helm + 外部存储数据可控,组件可独立扩展
追求 GitOps 与自动化运维GitLab OperatorCR 声明式管理,升级备份自动化
快速验证、无运维投入GitLab.com SaaS零运维起步,按需付费

最后强调一个容易被忽略的点:无论选哪种形态,都要在部署前确定外部访问地址(external_url)、对象存储桶和备份目标这三项。它们一旦上线后再变更,往往涉及证书、回调地址、Runner 注册和已有数据的迁移,成本远高于前期规划。把这三项写进部署检查清单,再开始安装,是本章最实用的落地建议。