🚀 Kubernetes 上的 GITLAB:终极部署指南!🌟
glasskube/glasskube
TL;DR🔍
探索在 Kubernetes 上部署 GitLab 的分步指南,重点介绍 Omnibus 软件包配置。学习如何设置 PostgreSQL、SMTP、容器注册表、Sidekiq、Prometheus 指标和备份。探索 Glasskube GitLab Kubernetes Operator 的替代方案,简化流程并将设置时间缩短至仅需 5 分钟。
我们期待您的反馈!🫶
在下面的评论区分享你的想法!告诉我们你希望我们为你提供哪些主题的更多内容。如果本指南对你有帮助,请点击猫咪图标并留下一颗星,以支持我们创作更多以开发者为中心的内容。你的反馈至关重要!
让我们开始吧🏌️
GitLab是一个面向软件工程团队的开源 DevSecOps 平台。
有两种方式可以在 Kubernetes 集群上部署 GitLab:
- GitLab 云原生混合
- GitLab 软件包(Omnibus)
GitLab 云原生混合
部署 GitLab 云原生混合架构仅在查询特定的用例中才有意义。例如,如GitLab 决策树所示,如果 GitLab 实例需要服务至少 3,000 位用户。对于这种部署,GitLab 组件将分别安装在不同的 Docker 容器中。因此,最低要求是 10 个节点,总共 19 个 vCPU 和 60 GB 内存,每月云成本将高达数千美元。
因此大多数情况下 GitLab Cloud native 是不需要且不太复杂的。
那么,如何在 Kubernetes 上部署 GitLab Omnibus?
Kubernetes 上的 GitLab Omnibus
GitLab 还以“omnibus”为名,发布了以 Docker 镜像形式提供的一体化软件包hub.docker.com/r/gitlab/gitlab-ce
,这些软件包可以通过环境变量轻松配置。正确配置后,可以轻松地在 Kubernetes 上部署 GitLab。
为了实现合理的 Kubernetes 设置,应正确配置以下重要组件:
- PostgreSQL 数据库
- SMTP 配置
- Kubernetes 上的 GitLab 容器注册表
- Sidekiq、Gitaly 和 Puma 配置
- Prometheus 指标
- Kubernetes 上的 GitLab 备份
Kubernetes 上的 GitLab:配置外部 PostgreSQL 数据库
您可以使用CloudNativePG PostgreSQL Operator创建 PostgreSQL 数据库。安装该 Operator 后,可以通过应用 Kubernetes CR 来部署新的 Postgres 集群:
kind: Cluster
apiVersion: postgresql.cnpg.io/v1
metadata:
name: gitlab
spec:
enableSuperuserAccess: false
instances: 2
bootstrap:
initdb:
database: gitlabhq_production
owner: gitlab
storage:
size: 20Gi
重要的是,数据库必须被调用,gitlabhq_production
并且配置的gitlab
数据库用户是数据库的所有者。在本例中,我们创建了一个由两个 PostgreSQL 副本组成的集群,以确保即使运行主副本的节点发生故障,数据库仍然可用。这被称为高可用性 (HA)。
现在,我们已经创建了自己的 PostgreSQL 集群,因此必须在文件中禁用综合镜像中包含的数据库gitlab.rb
。
postgresql['enable'] = false
gitlab_rails['db_adapter'] = 'postgresql'
gitlab_rails['db_encoding'] = 'unicode'
gitlab_rails['db_host'] = 'gitlab-pg-rw'
gitlab_rails['db_password'] = '<your-password>'
很好,我们已经为 GitLab 安装准备好了云原生数据库。
Kubernetes 上的 GitLab:配置 SMTP 凭据
为了确保你的 GitLab 实例能够发送电子邮件,你需要配置一个 SMTP 服务器。这也可以在gitlab.rb
文件中完成。
gitlab_rails['smtp_enable'] = ...
gitlab_rails['smtp_address'] = ...
gitlab_rails['smtp_port'] = ...
gitlab_rails['smtp_user_name'] = ...
gitlab_rails['smtp_password'] = ...
gitlab_rails['smtp_tls'] = ...
gitlab_rails['gitlab_email_from'] = ...
例如,可以在 Brevo 平台上创建用于交易电子邮件的免费 smtp 服务器。
Kubernetes 上的 GitLab:容器注册表
GitLab 拥有众多功能,其中之一就是支持作为容器注册表。这是通过捆绑 Docker 容器注册表的参考实现来实现的,但由于设置起来比较麻烦,默认情况下此功能处于禁用状态。
重要
重要的是要理解,GitLab omnibus 容器中的所有请求将首先由内部 nginx 服务器处理,然后分发到组件。
容器注册表仅适用于 TLS 加密连接,因此我们需要通过入口负载均衡器禁用 TLS 终止,并将加密流量直接发送到 GitLab 容器。如果使用 NGINX 入口控制器,则可以通过在入口中添加以下注释来实现:nginx.ingress.kubernetes.io/ssl-passthrough: true
。
此后,gitlab.rb
必须应用以下配置:
registry['enable'] = true
gitlab_rails['registry_enabled'] = true
registry['token_realm'] = "https://" + ENV['GITLAB_HOST']
gitlab_rails['registry_enabled'] = true
gitlab_rails['registry_host'] = ENV['GITLAB_REGISTRY_HOST']
gitlab_rails['registry_api_url'] = "http://localhost:5000"
registry_external_url 'https://' + ENV['GITLAB_REGISTRY_HOST']
registry_nginx['redirect_http_to_https'] = true
registry_nginx['listen_port'] = 5443
registry_nginx['ssl_certificate'] = "/etc/gitlab/ssl/tls.crt"
registry_nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/tls.key"
registry_nginx['real_ip_trusted_addresses'] = ['10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16']
registry_nginx['server_names_hash_bucket_size'] = 128
此外,可以配置 S3 存储桶(或兼容的云存储端点),以便所有图像层不会存储在卷内,而是存储在可扩展的 S3 中
Kubernetes 上的 GitLab:Sidekiq、Gitaly 和 Puma 配置
Puma(Ruby 的 HTTP 服务器)、Sidekiq(作业调度程序)和 Gitaly(GitLabs 的 Git 桥接器)都可以自定义工作线程数/线程数。最佳配置很大程度上取决于您的用例和需要支持的用户数量。合理的最小配置如下:
puma['worker_processes'] = 2
sidekiq['max_concurrency'] = 9
Kubernetes 上的 GitLab:Prometheus 指标
GitLab omnibus 软件包在镜像中自带了 prometheus 实例。由于大多数 Kubernetes 集群中已经存在 prometheus 实例,因此可以安全地禁用自带的 prometheus。
prometheus_monitoring['enable'] = false
AServiceMonitor
可用于告诉正在运行的 Prometheus 实例在以下端口上监视 GitLabs 组件的公开指标端点:
- 8082(sidekiq)
- 9168(gitlab)
- 9236(意大利)
Kubernetes 上的 GitLab:备份
好吧,在 Kubernetes 上备份 GitLab 本身就可以算是一个技术指南。最简单的方法是使用像Velero这样的备份解决方案备份整个命名空间。
Glasskube GitLab Kubernetes 操作员
认识一下 Glasskube GitLab Kubernetes Operator——我们的开发团队在 GitLab 部署过程中,一直饱受繁琐的配置流程、耗时的设置以及持续不断的故障排除困扰,而 Glasskube GitLab Kubernetes Operator 正是为此而生。为了应对这些挑战,我们精心设计了一个简化整个部署体验的解决方案。Glasskube GitLab Kubernetes Operator 可以部署一个完全配置的 GitLab 实例,并通过自定义资源定义 (CRD) 将所有功能巧妙地抽象出来。有了它,您再也不需要花费大量时间进行设置和更新了。现在,您只需 5 分钟即可轻松启动新的 GitLab 实例。快来试用并分享您的反馈吧!
安装 Glasskube 操作员
第一步是通过 Helm Chart 安装 Glasskube:
helm repo add glasskube https://charts.glasskube.eu/
helm repo update
helm install my-glasskube-operator glasskube/glasskube-operator
完整文档可以在我们的入门文档中找到。
部署 GitLab
重要必须在或 上
设置 DNS 条目。如果配置了 ,则 SSL 证书由或 自动生成。LoadBalancer
Ingress Host
LoadBalancer
cert-manager
ClusterIssuer
gitlab.yaml
apiVersion: "v1"
kind: "Secret"
metadata:
name: "gitlab-smtp"
stringData:
username: "..."
password: "..."
---
apiVersion: v1
kind: Secret
metadata:
name: gitlab-registry-secret
stringData:
accessKey: "..."
secretKey: "..."
---
apiVersion: "glasskube.eu/v1alpha1"
kind: "Gitlab"
metadata:
name: "gitlab"
spec:
host: "gitlab.mycompany.eu"
sshEnabled: true
sshHost: "ssh.gitlab.mycompany.eu"
smtp:
host: "..."
port: 465
fromAddress: "noreply+gitlab@mycompany.eu"
authSecret:
name: "gitlab-smtp"
tlsEnabled: true
registry:
host: "registry.gitlab.mycompany.eu"
storage:
s3:
bucket: gitlab-registry
accessKeySecret:
name: gitlab-registry-secret
key: accessKey
secretKeySecret:
name: gitlab-registry-secret
key: secretKey
region: ...
kubectl apply -f gitlab.yaml
就是这样!完整的自定义资源文档可以在 Glasskube的 GitLab 文档
中找到。
在 Kubernetes 上部署 GitLab Runner
GitLab 上的运行器是支持持续集成和持续交付 (CI/CD) 流水线的执行代理。
它们负责运行作业,即流水线中的各个步骤或任务。
Glasskube Gitlab Kubernetes Operator 让向 Gitlab 添加 Runner 变得非常简单。首先,需要通过 创建一个新的 Runner https://{{host}}/admin/runners/new
。之后,只需将这些 Runner 令牌添加到gitlab.yaml
规范中,Glasskube Kubernetes Operator 就会自动生成这些 Runner 并将其连接到 Gitlab 实例。
runners:
- token: glrt-xxxxXX-xxxxxXXXXX # can be generated at https://{{host}}/admin/runners/new
完整的自定义资源文档可以在 Glasskube 文档中关于GitLab runner 的文档中找到
现在安装已完成。对 Kubernetes Operator 的更新将自动更新 GitLab。
结论
在 Kubernetes 上为不到一千名用户部署 GitLab 实例,不应使用 GitLabs 云原生混合 helm chart,而应使用专门安装的 GitLab Omnibus 软件包并结合云原生基础设施。Glasskube Kubernetes 操作员会负责这项工作。
星形玻璃杯: