一、软硬件环境
1. 集群环境简介
在部署gitlab前,集群已经安装了以下服务
- Kubernetes 1.18.6
- Nginx-Ingress反向代理
- Grafana+Prometheus监控
- Helm 3.x
- 使用GlusterFS提供存储
2. chart简介
官方的Helm Charts包含了一组服务,结合集群当前的实际情况,本次部署不重复部署Ingress、Prometheus和Grafana。
二、安装与配置
1. 安装前
默认的charts无法直接使用,需要对其中的参数做相关调整后,才能安装到平台上。
1.1 设置默认的storageclass
gitlab中集成了一组容器,部分容器(minio,gitaly,postgresql, redis等)需要挂载卷来实现数据的持久化。为了简化相关的配置,通过制定默认的sc,这样在接下来的部署过程中,无需指定sc,既能完成pvc的创建。
# 为glusterfs-storage添加注解
kubectl edit sc glusterfs-storage
# 在annotations中添加默认属性
metadata:
annotations:
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