一、软硬件环境

1. 集群环境简介

在部署gitlab前,集群已经安装了以下服务

  1. Kubernetes 1.18.6
  2. Nginx-Ingress反向代理
  3. Grafana+Prometheus监控
  4. Helm 3.x
  5. 使用GlusterFS提供存储

2. chart简介

官方的Helm Charts包含了一组服务,结合集群当前的实际情况,本次部署不重复部署Ingress、Prometheus和Grafana。

二、安装与配置

1. 安装前

默认的charts无法直接使用,需要对其中的参数做相关调整后,才能安装到平台上。

1.1 设置默认的storageclass

gitlab中集成了一组容器,部分容器(minio,gitaly,postgresql, redis等)需要挂载卷来实现数据的持久化。为了简化相关的配置,通过制定默认的sc,这样在接下来的部署过程中,无需指定sc,既能完成pvc的创建。

  1. # 为glusterfs-storage添加注解
  2. kubectl edit sc glusterfs-storage
  3. # 在annotations中添加默认属性
  4. metadata:
  5. annotations:
  6. storageclass.kubernetes.io/is-default-class: "true"

1.2 创建命名空间

将gitlab部署到一个独立的命名空间,好处是在部署过程中一旦出现了错误,可以通过删除命名空间来快速清理已部署的资源。

# 创建名称为gitlab的命名空间
kubectl create ns gitlab

1.3 导入tls证书

虽然chart中集成了自动获取证书的容器实例,但本次部署通过集成自定义的tls证书完成部署。

# 在指定的命名空间上添加secret
kubectl create -n gitlab secret tls tls-3incloudcom \
--key nginx-cert/1688217__3incloud.com.key 
--cert nginx-cert/1688217__3incloud.com.pem

1.4 创建邮件secret

如果想要使用自定义的邮件服务器发送邮件,还需要指定邮件相关的配置,其中邮件服务器密码是以Secret的形式存储。

# 命令创建邮件服务器的密码
kubectl create secret generic smtp-password --from-literal=password="<password>" -n gitlab

2. 参数配置

Gitlab Charts中包含的配置项很多,根据实际的部署情况,选出合适的配置进行修改,完成应用的部署。

2.1 邮件配置

global.smtp.enabled=true 
global.smtp.domain="3in.org" 
global.smtp.address="c2.icoremail.net" 
global.smtp.port=25 
global.email.from="noreply@3in.org" 
global.smtp.user_name="noreply@3in.org" 
global.smtp.authentication="login" 
global.smtp.password.secret=smtp-password
global.smtp.tls=none 
global.smtp.starttls_auto=false

2.2 域名与证书

# 配置域名
global.hosts.domain="3incloud.com"
global.hosts.https=true
global.hosts.minio.name=gitlab-minio.3incloud.com
# 这里的证书是通配符证书
gitlab.webservice.ingress.tls.secretName=tls-3incloudcom
registry.ingress.tls.secretName=tls-3incloudcom
minio.ingress.tls.secretName=tls-3incloudcom

2.3 集成外部nginx-ingress

nginx-ingress.enabled=false
# 指定外部ingress class名称
global.ingress.annotations."kubernetes\.io/ingress\.class"=nginx
# 不配置证书管理器
global.ingress.configureCertmanager=false
certmanager.install=false

2.4 关闭安装prometheus

prometheus.install=false

2.5 自定义ssh端口

# 使用32022作为ssh端口
global.shell.port=32022

2.6 调整存储容量

# minio
minio.persistence.size=80Gi
# gitaly
gitaly.persistence.size=350Gi

2.7 gitlab版本

global.edition=ce

2.8 gitlab时区

global.time_zone=Asia/Shanghai

2.9 runner特权配置

gitlab-runner.runners.privileged=true

3. 部署

helm install gitlab gitlab/gitlab -n  gitlab \
--set global.hosts.domain="3incloud.com"
--set ...

4. 配置ssh端口

添加配置

apiVersion: v1
kind: ConfigMap
metadata:
  name: tcp-configmap-32022
data:
  32022: "gitlab/gitlab-gitlab-shell:32022"

在ingress中暴露端口

args:
  - /nginx-ingress-controller
  - --tcp-services-configmap=gitlab/tcp-configmap-32022

5. 验证与登录

检查部署的pod状态和ingress资源是否已经正常。

# 查看编码后的root密码
kubectl describe secret gitlab-gitlab-initial-root-password
# 解码密码
echo "<password>" | base64 --decode

6. 更新配置

helm upgrade g-200927-w-gitlab gitlab/gitlab --reuse-values -n gitlab --version=4.4.1 \
--set global.hosts.minio.name=gitlab-minio.3incloud.com

三、遇到的问题

1. 配置写进YAML文件

在安装和更新的过程中,如果将配置项通过文件的形式进行传递,则会导致部分参数不生效。所以所有配置项还是以—set的形式进行配置。

2. 关于卷扩容

如果需要对挂载卷进行容量扩容,如果是通过动态sc来提供pvc,则定义sc时,需要开启允许卷扩容配置项allowVolumeExpansion: true。

reclaimPolicy: Delete
allowVolumeExpansion: true

四、完整的安装示例

helm install g-gitlab gitlab/gitlab -n  gitlab \
--set global.smtp.enabled=true \
--set global.smtp.domain="3in.org" \
--set global.smtp.address="c2.icoremail.net" \
--set global.smtp.port=25 \
--set global.email.from="noreply@3in.org" \
--set global.smtp.user_name="noreply@3in.org" \
--set global.smtp.authentication="login" \
--set global.smtp.password.secret=smtp-password \
--set global.smtp.tls=none \
--set global.smtp.starttls_auto=false \
--set global.edition=ce \
--set global.time_zone="Asia/Shanghai" \
--set global.hosts.domain="3incloud.cn" \
--set global.hosts.https=true \
--set global.hosts.minio.name=gitlab-minio.3incloud.cn \
--set global.ingress.annotations."kubernetes\.io/ingress\.class"=nginx \
--set global.ingress.configureCertmanager=false \
--set gitlab.webservice.ingress.tls.secretName=tls-3incloudcn \
--set gitlab.webservice.resources.requests.cpu=1000m \
--set gitlab.webservice.resources.requests.memory=2Gi \
--set gitlab.task-runner.resources.requests.cpu=500m \
--set gitlab.task-runner.resources.requests.memory=1Gi \
--set registry.ingress.tls.secretName=tls-3incloudcn \
--set minio.ingress.tls.secretName=tls-3incloudcn \
--set nginx-ingress.enabled=false \
--set certmanager.install=false \
--set prometheus.install=false \
--set global.shell.port=32022 \
--set minio.persistence.size=280Gi \
--set gitaly.persistence.size=280Gi \
--set gitlab-runner.runners.privileged=true

参考文档

  1. Gitlab Helm官方安装手册
  2. kubernetes用Glusterfs做持久化存储做PVC扩容