1、什么是GitLab
GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的Web服务,可通过Web界面进行访问公开的或者私人项目。它拥有与Github类似的功能,能够浏览源代码,管理缺陷和注释。
GitLab官方网站:https://about.gitlab.com/
GitLab Github代码库:https://github.com/gitlabhq/gitlabhq
GitLab共有三个版本:GitLab社区版(CE)、GitLab企业版(EE)、GitLab极虎版(JH-中国特供版)。在kubernetes中部署GitLab需要用到三个组件:Redis、Postgresql和GitLab。我们只需要根据资源清单把这三个组件跑起来、再使用对用的配置项就可以快速的运行GitLab了;GitLab也提供了官方镜像文件、但是这里我们要使用一个GitLab的第三方镜像:sameersbn/gitlab,这个镜像库基本上和官方保持一样的更新速度。
sameersbn/gitlab地址:http://www.damagehead.com/docker-gitlab/
2、创建Ceph资源池
在开始之前我们首先需要对各组件进行持久化存储配置、这里我使用的是Ceph分布式存储;我们首先来创建一个对应的Ceph存储资源池给GitLab使用。资源清单文件如下:
apiVersion: ceph.rook.io/v1
kind: CephBlockPool
metadata:
name: gitlab-replicapool
namespace: gitlab
spec:
failureDomain: host
replicated:
size: 3
requireSafeReplicaSize: true
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: gitlab-rook-ceph-block
provisioner: rook-ceph.rbd.csi.ceph.com
parameters:
clusterID: rook-ceph
pool: harbor-replicapool
imageFormat: "2"
imageFeatures: layering
csi.storage.k8s.io/provisioner-secret-name: rook-csi-rbd-provisioner
csi.storage.k8s.io/provisioner-secret-namespace: rook-ceph
csi.storage.k8s.io/controller-expand-secret-name: rook-csi-rbd-provisioner
csi.storage.k8s.io/controller-expand-secret-namespace: rook-ceph
csi.storage.k8s.io/node-stage-secret-name: rook-csi-rbd-node
csi.storage.k8s.io/node-stage-secret-namespace: rook-ceph
csi.storage.k8s.io/fstype: xfs
allowVolumeExpansion: true
reclaimPolicy: Delete
[root@kubernetes01 ~]# kubectl get CephBlockPool -n gitlab
NAME AGE
gitlab-replicapool 3d15h
[root@kubernetes01 ~]#
3、部署Redis
如果你已经有可以使用的Redis和Postgresql应用组件、你可以直接在GitLab的环境变量中直接使用即可;这里我们重新部署一套Redis和Postgresql应用组件、对应的Redis资源清单文件如下:
# Service
kind: Service
apiVersion: v1
metadata:
name: gitlab-redis
labels:
name: gitlab-redis
spec:
type: ClusterIP
ports:
- name: redis
protocol: TCP
port: 6379
targetPort: redis
selector:
name: gitlab-redis
# PVC
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: gitlab-redis-pv-claim
labels:
app: gitlab
spec:
storageClassName: gitlab-rook-ceph-block
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
---
# Deployment
kind: Deployment
apiVersion: apps/v1
metadata:
name: gitlab-redis
labels:
name: gitlab-redis
spec:
replicas: 1
selector:
matchLabels:
name: gitlab-redis
template:
metadata:
name: gitlab-redis
labels:
name: gitlab-redis
spec:
containers:
- name: gitlab-redis
image: 'redis:6.2'
ports:
- name: redis
containerPort: 6379
protocol: TCP
volumeMounts:
- name: gitlab-redis-persistent-storage
mountPath: /var/lib/redis
livenessProbe:
exec:
command:
- redis-cli
- ping
initialDelaySeconds: 5
timeoutSeconds: 5
periodSeconds: 10
successThreshold: 1
failureThreshold: 3
readinessProbe:
exec:
command:
- redis-cli
- ping
initialDelaySeconds: 5
timeoutSeconds: 5
periodSeconds: 10
successThreshold: 1
failureThreshold: 3
# 持久化存储配置
volumes:
- name: gitlab-redis-persistent-storage
persistentVolumeClaim:
claimName: gitlab-redis-pv-claim
[root@kubernetes01 gitlab]# vi redis-deploy.yaml
[root@kubernetes01 gitlab]# kubectl apply -f redis-deploy.yaml -n gitlab
service/gitlab-redis created
persistentvolumeclaim/gitlab-redis-pv-claim created
deployment.apps/gitlab-redis created
[root@kubernetes01 gitlab]#
[root@kubernetes01 ~]# kubectl get svc -n gitlab|grep redis
gitlab-redis ClusterIP 10.254.76.24 <none> 6379/TCP 3d15h
[root@kubernetes01 ~]# kubectl get pod -n gitlab|grep redis
gitlab-redis-5899459775-s5xb9 1/1 Running 0 3d15h
[root@kubernetes01 ~]# kubectl get pvc -n gitlab|grep redis
gitlab-redis-pv-claim Bound pvc-507b78ec-d9dc-48da-8a25-7a696734804a 5Gi RWO gitlab-rook-ceph-block 3d15h
[root@kubernetes01 ~]#
4、部署postgresql
然后就是部署postgresql数据库,对应的资源清单文件如下:
# Service
kind: Service
apiVersion: v1
metadata:
name: gitlab-postgresql
labels:
name: gitlab-postgresql
spec:
ports:
- name: postgres
protocol: TCP
port: 5432
targetPort: postgres
selector:
name: postgresql
type: ClusterIP
---
# PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: gitlab-postgresql-pv-claim
labels:
app: gitlab-postgresql
spec:
storageClassName: gitlab-rook-ceph-block
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 50Gi
---
# Deployment
kind: Deployment
apiVersion: apps/v1
metadata:
name: gitlab-postgresql
labels:
name: gitlab-postgresql
spec:
replicas: 1
selector:
matchLabels:
name: postgresql
template:
metadata:
name: postgresql
labels:
name: postgresql
spec:
containers:
- name: gitlab-postgresql
image: sameersbn/postgresql:12-20200524
ports:
- name: postgres
containerPort: 5432
env:
- name: DB_USER
value: gitlab
- name: DB_PASS
value: admin@1234
- name: DB_NAME
value: gitlab_production
- name: DB_EXTENSION
value: 'pg_trgm,btree_gist'
livenessProbe:
exec:
command: ["pg_isready","-h","localhost","-U","postgres"]
initialDelaySeconds: 30
timeoutSeconds: 5
periodSeconds: 10
successThreshold: 1
failureThreshold: 3
readinessProbe:
exec:
command: ["pg_isready","-h","localhost","-U","postgres"]
initialDelaySeconds: 5
timeoutSeconds: 1
periodSeconds: 10
successThreshold: 1
failureThreshold: 3
volumeMounts:
- name: gitlab-postgresql-persistent-storage
mountPath: /var/lib/postgresql
# 持久化存储配置
volumes:
- name: gitlab-postgresql-persistent-storage
persistentVolumeClaim:
claimName: gitlab-postgresql-pv-claim
变量说明:
参数名称 | 默认值 | 描述 |
---|---|---|
DB_USER | – | 创建一个数据库用户 |
DB_PASS | – | 指定创建的用户的密码 |
DB_NAME | – | 创建一个数据库并指定库名 |
DB_EXTENSION | – | 指定安装的扩展包 |
详情可查看该镜像的 Github 文档:https://github.com/sameersbn/docker-postgresql
[root@kubernetes01 gitlab]# kubectl apply -f postgresql-deploy.yaml -n gitlab
service/gitlab-postgresql created
persistentvolumeclaim/gitlab-postgres-pv-claim created
deployment.apps/postgresql created
[root@kubernetes01 gitlab]#
[root@kubernetes01 ~]# kubectl get svc -n gitlab|grep postgresql
gitlab-postgresql ClusterIP 10.254.114.179 <none> 5432/TCP 2d21h
[root@kubernetes01 ~]# kubectl get pod -n gitlab|grep postgresql
gitlab-postgresql-678f8fc4c6-pcxzp 1/1 Running 0 2d21h
[root@kubernetes01 ~]# kubectl get pvc -n gitlab|grep postgresql
gitlab-postgresql-pv-claim Bound pvc-2600b476-fe09-46dc-924d-c594b0282836 50Gi RWO gitlab-rook-ceph-block 2d21h
[root@kubernetes01 ~]#
5、部署GitLab
Redis和Postgres部署完成之后我们就开始不是核心应用GitLab。这里我们部署的是GitLab14.1.0版本、GitLab 14.0版本是一个大的版本更新;官方称呼其为:GitLab 14 是一个完整的 DevOps 平台。下面我们一起来看看GitLab 14都有哪些变化:
Epic Boards:Epic Boards 通过持续传达 Epic 状态来调整团队和组织,它在一个统一的地方可视化和优化所有 Epic,使用可自定义的拖放界面,任何用户都可以轻松理解和协作。Epic Boards 也是管理和可视化理想 Epic 工作流的游戏规则改变者,例如创作工作流状态(草稿、写作、完成)、DevOps 工作流状态(例如计划、开发和生产中)或任何其他互斥的说明可以使用范围标签进行建模。通过 Epic Boards 可视化工作流程使能够提高可预测性和效率。
内置的 Terraform 模块注册表:Terraform 模块在构建整个组织的标准基础架构组件方面发挥着核心作用,用户可以使用 GitLab 内置的 Terraform 模块注册表来发现具有语义版本控制支持的 Terraform 模块,以支持升级和维护。此外,还可以使用 GitLab CI/CD 轻松发布模块。
简化顶部导航菜单:GitLab 14.0 引入了一个全新的、精简的顶部导航菜单,以帮助用户更快进入目的地。新的合并菜单提供了以前的项目、组和更多菜单的综合功能。用户只需点击一次即可访问项目、组和实例级功能。此外,全新的响应式设计改进了小屏幕上的导航体验。
支持在 VS Code 中合并请求评论:开发者通常将大部分时间花在本地开发环境中。当他们被分配了一个 PR 进行审查时,这需要离开编辑器并在 GitLab 内执行该审查。在 GitLab 中执行审核时,可能还需要使用本地编辑器来获取有关提议更改的更多背景信息。用于 Visual Studio Code (VS Code) 的 GitLab Workflow 3.21.0 现在支持完整的 PR 审查过程。在 VS Code 中选择 GitLab 图标打开侧边栏以显示正在审查的 PR,选择 PR 概述以查看 PR 的完整详细信息和讨论。
重新设计侧边栏导航:GitLab 14 重新设计和重构了左侧边栏,以提升可用性、一致性和可发现性。
此次版本更新重点围绕在DevOps上,通过简化复杂的工作流程,来提高效率,在效率、可信度且高可见度三个面向都有不少更新。用户在新版本中,最直观感受是UI的更新,顶端的导航变得更简洁,侧栏的导航也经过重新设计,老用户可能需要点时间来适应。GitLab 14.0的目标是要成为一个完整的DevOps平台,提供现代化DevOps功能,在简化工作流的同时,还能供任何用户规模,快速、可信且高可见度的方式,构建和交付软件的体验。
下面我们开始部署 GitLab 14 ;对应的资源清单文件如下:
# Service
kind: Service
apiVersion: v1
metadata:
name: gitlab
labels:
name: gitlab
spec:
ports:
- name: http
protocol: TCP
port: 80
- name: ssh
protocol: TCP
port: 22
targetPort: ssh
selector:
name: gitlab
---
# PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: gitlab-pv-claim
labels:
app: gitlab
spec:
storageClassName: gitlab-rook-ceph-block
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 50Gi
---
# Deployment
kind: Deployment
apiVersion: apps/v1
metadata:
name: gitlab
labels:
name: gitlab
spec:
replicas: 1
selector:
matchLabels:
name: gitlab
template:
metadata:
name: gitlab
labels:
name: gitlab
spec:
containers:
- name: gitlab
image: 'sameersbn/gitlab:14.1.0'
ports:
- name: ssh
containerPort: 22
- name: http
containerPort: 80
- name: https
containerPort: 443
env:
- name: TZ
value: Asia/Shanghai
- name: GITLAB_TIMEZONE
value: Beijing
- name: GITLAB_SECRETS_DB_KEY_BASE
value: long-and-random-alpha-numeric-string
- name: GITLAB_SECRETS_SECRET_KEY_BASE
value: long-and-random-alpha-numeric-string
- name: GITLAB_SECRETS_OTP_KEY_BASE
value: long-and-random-alpha-numeric-string
- name: GITLAB_ROOT_PASSWORD
value: admin@1234
- name: GITLAB_ROOT_EMAIL
value: z0ukun@163.com
- name: GITLAB_HOST
value: 'gitlab.z0ukun.com'
- name: GITLAB_PORT
value: '80'
- name: GITLAB_SSH_PORT
value: '22'
- name: GITLAB_NOTIFY_ON_BROKEN_BUILDS
value: 'true'
- name: GITLAB_NOTIFY_PUSHER
value: 'false'
- name: DB_TYPE
value: postgres
- name: DB_HOST
value: gitlab-postgresql
- name: DB_PORT
value: '5432'
- name: DB_USER
value: gitlab
- name: DB_PASS
value: admin@1234
- name: DB_NAME
value: gitlab_production
- name: REDIS_HOST
value: gitlab-redis
- name: REDIS_PORT
value: '6379'
livenessProbe:
httpGet:
path: /
port: 80
scheme: HTTP
initialDelaySeconds: 300
timeoutSeconds: 5
periodSeconds: 10
successThreshold: 1
failureThreshold: 3
readinessProbe:
httpGet:
path: /
port: 80
scheme: HTTP
initialDelaySeconds: 5
timeoutSeconds: 30
periodSeconds: 10
successThreshold: 1
failureThreshold: 3
volumeMounts:
- name: gitlab-persistent-storage
mountPath: /home/git/data
- name: localtime
mountPath: /etc/localtime
volumes:
- name: gitlab-persistent-storage
persistentVolumeClaim:
claimName: gitlab-pv-claim
- name: localtime
hostPath:
path: /etc/localtime
变量说明:
参数名称 | 默认值 | 描述 |
---|---|---|
GITLAB_TIMEZONE | UTC | 指定时区 |
GITLAB_SECRETS_DB_KEY_BASE | – | 用于加密数据库中的CI机密变量以及导入凭据。如果丢失或旋转了此机密,则将无法使用现有的CI机密。 |
GITLAB_SECRETS_SECRET_KEY_BASE | – | 用于密码重置链接和其他“标准”身份验证功能。如果丢失或旋转了此机密,电子邮件中的密码重置令牌将重置。 |
GITLAB_SECRETS_OTP_KEY_BASE | – | 用于加密数据库中的2FA机密。如果您丢失或旋转了此机密,则您的所有用户都将无法使用 2FA 登录。 |
GITLAB_ROOT_PASSWORD | admin@1234 | 指定 root 用户在首次运行时的密码。(注意:GitLab 要求长度至少为8个字符)。 |
GITLAB_ROOT_EMAIL | admin@example.com!fe | 指定 root 用户在首次运行时的电子邮件。 |
GITLAB_HOST | localhost | 指定 GitLab 服务器的主机名,默认为 localhost,修改此参数可用配置 Gitlab 库中的克隆地址。 |
GITLAB_PORT | 80 | 指定 GitLab 服务器的端口号,修改此参数可用配置 Gitlab 库中的克隆地址的端口号。 |
GITLAB_SSH_PORT | $GITLAB_SSH_LISTEN_PORT | 指定 ssh 端口号。 |
GITLAB_NOTIFY_ON_BROKEN_BUILDS | true | 启用或禁用通知的电子邮件。 |
GITLAB_NOTIFY_PUSHER | true | 将推送程序添加到构建通知电子邮件的收件人列表中。 |
GITLAB_NOTIFY_PUSHER | false | 将推送程序添加到构建通知电子邮件的收件人列表中。 |
DB_TYPE | postgres | 指定数据库类型。 |
DB_HOST | localhost | 指定数据库主机地址(k8s service地址)。 |
DB_PORT | 5432 | 指定数据库服务器端口。 |
DB_USER | root | 指定数据库用户名。 |
DB_PASS | – | 指定数据库密码。 |
DB_NAME | gitlabhq_production | 指定数据库名。 |
REDIS_HOST | localhost | 指定 Redis 的主机地址。 |
REDIS_PORT | 6379 | 指定 Redis 端口。 |
详情可查看该镜像的 Github 文档:https://github.com/sameersbn/docker-gitlab
[root@kubernetes01 ~]# kubectl get pod -n gitlab
NAME READY STATUS RESTARTS AGE
gitlab-f5d7f6c48-54pgk 1/1 Running 0 2d21h
gitlab-postgresql-678f8fc4c6-pcxzp 1/1 Running 0 2d21h
gitlab-redis-5899459775-s5xb9 1/1 Running 0 3d16h
[root@kubernetes01 ~]# kubectl get pvc -n gitlab
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
gitlab-postgresql-pv-claim Bound pvc-2600b476-fe09-46dc-924d-c594b0282836 50Gi RWO gitlab-rook-ceph-block 2d21h
gitlab-pv-claim Bound pvc-78edce38-4797-4d2f-ab36-31e3b6748534 50Gi RWO gitlab-rook-ceph-block 2d21h
gitlab-redis-pv-claim Bound pvc-507b78ec-d9dc-48da-8a25-7a696734804a 5Gi RWO gitlab-rook-ceph-block 3d16h
[root@kubernetes01 ~]# kubectl get storageclass -n gitlab
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
gitlab-rook-ceph-block rook-ceph.rbd.csi.ceph.com Delete Immediate true 3d16h
harbor-rook-ceph-block rook-ceph.rbd.csi.ceph.com Delete Immediate true 12d
jenkins-rook-ceph-block rook-ceph.rbd.csi.ceph.com Delete Immediate true 2d8h
rook-ceph-block rook-ceph.rbd.csi.ceph.com Delete Immediate false 8d
[root@kubernetes01 ~]# kubectl get svc -n gitlab
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
gitlab ClusterIP 10.254.99.74 <none> 80/TCP,22/TCP 2d21h
gitlab-postgresql ClusterIP 10.254.114.179 <none> 5432/TCP 2d21h
gitlab-redis ClusterIP 10.254.76.24 <none> 6379/TCP 3d16h
[root@kubernetes01 ~]#
创建完成之后我们可以查看POD、SVC的部署状态。成功部署之后我们通过Traefik IngressRoute来访问GitLab。
注:Redis和Postgres的环境变量配置可以根据自己的实际需求进行修改。
6、访问GitLab
我们来创建Traefik IngressRoute用于访问GitLab、资源清单文件如下:
[root@kubernetes01 traefik-ingressroute]# cat gitlab-ingressroute-http.yaml
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: gitlab-webui
namespace: gitlab
spec:
entryPoints:
- web
routes:
- match: Host(`gitlab.z0ukun.com`)
kind: Rule
services:
- name: gitlab
port: 80
从下图可以看到我们已经成功创建Traefik IngressRoute、下面我们用gitlab.z0ukun.com这个域名来访问GitLab(记得修改hosts文件)。
访问gitlab.z0ukun.com我们已经可以看到GitLab的登录页面、我们使用上面配置的账号密码登录GitLab:
默认的GitLab里面有一个Monitoring的项目、到此 Gitlab 已经部署完毕,详细的操作方法和使用教程各位小伙伴请自行百度。
7、使用GitLab
Gitlab 运行后,我们可以注册为新用户并创建一个项目,还可以做很多的其他系统设置,比如设置语言、设置应用风格样式等等。点击Create blank project
创建一个新的项目,和 Github 使用上没有多大的差别。
创建完成后,我们可以添加本地用户的一个SSH-KEY
,这样我们就可以通过 SSH 来拉取或者推送代码了。SSH 公钥通常包含在~/.ssh/id_rsa.pub
文件中,并以ssh-rsa
开头。如果没有的话可以使用ssh-keygen
命令来生成,id_rsa.pub
里面的内容就是我们需要的 SSH 公钥,然后添加到 Gitlab 中。这里我们把kubernetes01节点已有的SSH公钥添加到GitLab中。
[root@kubernetes01 z0ukun]# cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCkpr6gQBAVYDWSV8Fz9ykfwvwvsLpnVRDhPCv6vtOxkylyn19NX0AqdetBYbmCGE179uuMDn5t8nrIUhFu+DNY/Oa2Glgdln8aQkxQqruLhIFHWSjyEWqEGZwoYrKZV7SRnx1bEe0BReVe4a9mf4ptdWlegsXsw6wZ3Q4Xr1zHYOQ3pWhED6W+Ii3uONAa+6Bj2h36RIvWaO86pnBeZn/u2+N6i4Z2MB4tOhgnWiNKkjITBTcDlaSgXkjKrucn/HEI6nqoptHVm/V6bEsLQzqhtTm9MICaOkTJ1PWwAqOq8qDHzWLQ7u7woR1RQYOmSvij2dSuucwL0hpq/iZiLwGx root@kubernetes01
[root@kubernetes01 z0ukun]#
现在我们就可以去kubernetes01节点的项目目录下面、把代码推送到GitLab了:
# 进入项目目录
[root@kubernetes01 z0ukun]# ls
apps db.sqlite3 manage.py media __pycache__ README.md setting static templates venv z0ukun
[root@kubernetes01 z0ukun]#
# 初始化项目
[root@kubernetes01 z0ukun]# git init
Initialized empty Git repository in /root/z0ukun/.git/
# 添加git 远程url链接
[root@kubernetes01 z0ukun]# git remote add origin http://gitlab.z0ukun.com/root/z0ukun.git
[root@kubernetes01 z0ukun]# git remote set-url origin http://gitlab.z0ukun.com/root/z0ukun.git
# 推送代码到缓存区
[root@kubernetes01 z0ukun]# git add .
# 创建README.md文件
[root@kubernetes01 z0ukun]# touch README.md
# 添加README.md文件
[root@kubernetes01 z0ukun]# git add README.md
# 提交README.md文件
[root@kubernetes01 z0ukun]# git commit -m "add README"
[master (root-commit) 76e0972] add README
1132 files changed, 176113 insertions(+)
create mode 100644 .idea/.gitignore
create mode 100644 .idea/inspectionProfiles/profiles_settings.xml
......
create mode 100644 z0ukun/urls.py
create mode 100644 z0ukun/wsgi.py
# 推送代码到master
[root@kubernetes01 z0ukun]# git push -u origin master
Username for 'http://gitlab.z0ukun.com': root
Password for 'http://root@gitlab.z0ukun.com':
Counting objects: 1229, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (1217/1217), done.
Writing objects: 100% (1229/1229), 10.05 MiB | 3.76 MiB/s, done.
Total 1229 (delta 99), reused 0 (delta 0)
remote: Resolving deltas: 100% (99/99), done.
To http://gitlab.z0ukun.com/root/z0ukun.git
* [new branch] master -> master
Branch master set up to track remote branch master from origin.
[root@kubernetes01 z0ukun]#
代码推送完成以后我们到GitLab的z0ukun项目中可以看到推送成功的代码。
到这里就表明我们的 Gitlab 就成功部署到了 Kubernetes 集群当中了。