1. 说明

Gitlab 依赖如下镜像, 如在离线环境请自行导入镜像;同时,Gitlab 还需要 Postgres 数据库 ,请在部署 Gitlab 前对其配置。

docker.io/library/redis:6.2
docker.io/sameersbn/gitlab:15.4.2
docker.io/library/postgres:14

2. 注意事项

由于 Gitlab CE 不支持 LDAP 分配管理员 (这是 Gitlab EE 的功能) ,所以需要部署后手动为用户分配管理员权限,如无法接受可使用 Gitea 部署。

3. 部署前准备

Gitlab 依赖于 PostgresRedis,在部署前你需要预先配置其依赖。

3.1. 创建 LDAP 用户组

Gitlab 被配置为只有归属于 cn=develop 的用户和管理员才能登陆,需要在 LDAP 下创建名为 developgroupOfNames 用户组。 (集群已自动创建)

1
cn=develop,ou=groups,dc=cluster,dc=local

4. 开始部署

4.1. 创建 Gitlab 配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
apiVersion: v1
kind: ConfigMap
metadata:
  name: conf-gitlab
  namespace: core-app
  labels:
    app: gitlab
data:
  DB_NAME: 'gitlabhq_production' (1)
  DB_USER: 'gitlab'  (2)
  HOST: gitlab.d7z.net (3)
  PAGES_HOST: pages.d7z.net (3)
  LDAP_USERS_FILTER: '(|(memberOf=cn=admin,ou=groups,dc=cluster,dc=local)(memberOf=cn=develop,ou=groups,dc=cluster,dc=local))' (4)
---
apiVersion: v1
kind: Secret
metadata:
  name: secret-gitlab
  namespace: core-app
  labels:
    app: gitlab
stringData:
  DB_PASS: 'password'(5)
  ADMIN_PASS: 'gitlab-root-password' (6)
  DB_KEY_SECRETS: 'long-and-random-alpha-numeric-string'  (7)
  SESSION_KEY_SECRETS: 'long-and-random-alpha-numeric-string'  (7)
  OTP_KEY_SECRETS: 'long-and-random-alpha-numeric-string' (7)
  PAGES_KEY_SECRETS: 'long-and-random-alpha-numeric-string' (7)
其中
1 如果你修改了 Postgres 的数据库名称,则需要在此更改
2 如果你修改了 Postgres 的用户,则需要在此更改
3 请将其修改为你 Gitlab 对应的域名
4 LDAP 的过滤条件
5 如果你修改了 Postgres 的密码,则需要在此更改
6 由于 Gitlab CE 无法动态分配管理员,请修改默认管理员密码并妥善保存(请不要使用默认配置)。
7 在部署时请自定义 Secrets ,可使用 pwgen -Bsv1 64 生成 (请不要使用默认配置)。

4.2. 创建 Gitlab 持久卷

使用以下配置创建 Gitlab 的持久卷。同时为 Gitlab 所需要的 Redis 创建持久卷。

Gitlab 将提交保存至持久卷,可按照实际需求调整大小,较高的磁盘性能可提升 Gitlab 提交速度。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-gitlab-data
  namespace: core-app
  labels:
    app: gitlab
spec:
  storageClassName: 'sc-nfs-share'
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 300Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-gitlab-redis
  namespace: core-app
  labels:
    app: gitlab
spec:
  storageClassName: 'sc-nfs-share'
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-gitlab-postgres
  namespace: core-app
  labels:
    app: gitlab
spec:
  storageClassName: 'sc-nfs-share'
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 100Gi

5. 创建 Gitlab Server

使用以下配置创建 Gitlab Server

点击展开
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
apiVersion: v1
kind: ConfigMap
metadata:
  name: conf-gitlab-pg-init
  namespace: core-app
  labels:
    app: gitlab
data:
  00-init-database.sh: |
    #!/usr/bin/env bash
    set -e
    psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-END_SQL
        CREATE EXTENSION pg_trgm;
    END_SQL
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: sts-gitlab
  namespace: core-app
  labels:
    app: gitlab
spec:
  serviceName: svc-gitlab
  selector:
    matchLabels:
      app: gitlab
  replicas: 1
  template:
    metadata:
      labels:
        app: gitlab
    spec:
      containers:
        - name: gitlab-postgres
          image: docker.io/library/postgres:14
          volumeMounts:
            - name: postgres-data
              mountPath: /var/lib/postgresql/data
            - name: postgres-init
              mountPath: /docker-entrypoint-initdb.d/
          env:
            - name: POSTGRES_USER
              valueFrom:
                configMapKeyRef:
                  name: conf-gitlab
                  key: DB_USER
            - name: POSTGRES_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: secret-gitlab
                  key: DB_PASS
            - name: 'POSTGRES_DB'
              valueFrom:
                configMapKeyRef:
                  key: DB_NAME
                  name: conf-gitlab
            - name: 'PGDATA'
              value: "/var/lib/postgresql/data/pgdata"
        - name: gitlab-redis
          image: docker.io/library/redis:6.2
          volumeMounts:
            - name: gitlab-redis
              mountPath: /data
        - name: gitlab-server
          image: docker.io/sameersbn/gitlab:15.4.2
          volumeMounts:
            - name: gitlab-data
              mountPath: /home/git/data
          resources:
            requests:
              memory: 4Gi
          env:
            - name: GITLAB_SSH_PORT
              value: "22"
            - name: GITLAB_PORT
              value: "443"
            - name: GITLAB_HTTPS
              value: "true"
            - name: SSL_SELF_SIGNED
              value: "true"
            - name: GITLAB_HOST
              valueFrom:
                configMapKeyRef:
                  name: conf-gitlab
                  key: HOST
            - name: GITLAB_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: secret-gitlab
                  key: ADMIN_PASS
            - name: GITLAB_SECRETS_DB_KEY_BASE
              valueFrom:
                secretKeyRef:
                  name: secret-gitlab
                  key: DB_KEY_SECRETS
            - name: GITLAB_SECRETS_SECRET_KEY_BASE
              valueFrom:
                secretKeyRef:
                  name: secret-gitlab
                  key: SESSION_KEY_SECRETS
            - name: GITLAB_SECRETS_OTP_KEY_BASE
              valueFrom:
                secretKeyRef:
                  name: secret-gitlab
                  key: OTP_KEY_SECRETS
            - name: GITLAB_PAGES_ACCESS_SECRET
              valueFrom:
                secretKeyRef:
                  name: secret-gitlab
                  key: PAGES_KEY_SECRETS
            - name: GITLAB_PACKAGES_ENABLED
              value: 'false'
            - name: GITLAB_REGISTRY_ENABLED
              value: 'false'
            - name: GITLAB_PAGES_ENABLED
              value: 'true'
            - name: GITLAB_PAGES_DOMAIN
              valueFrom:
                configMapKeyRef:
                  name: conf-gitlab
                  key: PAGES_HOST
            - name: GITLAB_PAGES_HTTPS
              value: 'false'
            - name: GITLAB_PAGES_HTTP
              value: 'true'
            - name: DB_HOST
              value: "127.0.0.1"
            - name: DB_PORT
              value: "5432"
            - name: DB_NAME
              valueFrom:
                configMapKeyRef:
                  name: conf-gitlab
                  key: DB_NAME
            - name: DB_USER
              valueFrom:
                configMapKeyRef:
                  name: conf-gitlab
                  key: DB_USER
            - name: DB_PASS
              valueFrom:
                secretKeyRef:
                  name: secret-gitlab
                  key: DB_PASS
            - name: REDIS_HOST
              value: "127.0.0.1"
            - name: REDIS_PORT
              value: "6379"
            - name: LDAP_ENABLED
              value: "true"
            - name: LDAP_LABEL
              value: "LDAP"
            - name: "LDAP_HOST"
              valueFrom:
                configMapKeyRef:
                  key: LDAP_HOST
                  name: conf-ldap
            - name: LDAP_PORT
              value: "389"
            - name: LDAP_UID
              value: "uid"
            - name: LDAP_ACTIVE_DIRECTORY
              value: "false"
            - name: LDAP_METHOD
              value: "plain"
            - name: LDAP_BIND_DN
              valueFrom:
                configMapKeyRef:
                  name: conf-ldap
                  key: LDAP_BIND_DN
            - name: LDAP_PASS
              valueFrom:
                secretKeyRef:
                  key: LDAP_BIND_DN_PASSWORD
                  name: secret-ldap-service
            - name: LDAP_BASE
              valueFrom:
                configMapKeyRef:
                  key: LDAP_USERS_DN
                  name: conf-ldap
            - name: LDAP_USER_FILTER
              valueFrom:
                configMapKeyRef:
                  key: LDAP_USERS_FILTER
                  name: conf-gitlab
      volumes:
        - name: gitlab-data
          persistentVolumeClaim:
            claimName: pvc-gitlab-data
        - name: gitlab-redis
          persistentVolumeClaim:
            claimName: pvc-gitlab-redis
        - name: postgres-data
          persistentVolumeClaim:
            claimName: pvc-gitlab-postgres
        - name: postgres-init
          configMap:
            name: conf-gitlab-pg-init

配置导入完成后,使用如下命令监控启动结果。

1
kubectl get pods -n core-app -l app=gitlab

5.1. 关联 Service

Server 创建完成且工作正常后,使用以下配置创建对应的 Service

Gitlab 需要暴露 22 端口以便使用 ssh 提交,请根据对应的 LoadBalancer 实现自行配置,此处使用的是 metallb
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
apiVersion: v1
kind: Service
metadata:
  labels:
    app: gitlab
  name: svc-gitlab
  namespace: core-app
spec:
  ports:
    - name: gitlab-web
      protocol: TCP
      port: 80
    - name: gitlab-ssh
      protocol: TCP
      port: 22
  selector:
    app: gitlab
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: gitlab
  name: svc-gitlab-lb
  namespace: core-app
  annotations:
    metallb.universe.tf/allow-shared-ip: "public-ip-share"
spec:
  ports:
    - name: gitlab-ssh
      protocol: TCP
      port: 22
  selector:
    app: gitlab
  type: LoadBalancer

创建完成后使用如下命令查看结果。

1
kubectl get service -n core-app -l app=gitlab

5.2. 关联 Ingress

使用以下配置将 Service 与 Ingress 相关联。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-gitlab
  namespace: core-app
  labels:
    app: gitlab
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/proxy-body-size: "0"
spec:
  ingressClassName: nginx-public
  tls:
    - hosts:
        - gitlab.d7z.net
      secretName: tls-pub-d7z
  rules:
    - host: gitlab.d7z.net
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: svc-gitlab
                port:
                  name: gitlab-web
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-gitlab-pages
  namespace: core-app
  labels:
    app: gitlab
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/proxy-body-size: "0"
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
  ingressClassName: nginx-public
  tls:
    - hosts:
        - pages.d7z.net
        - '*.pages.d7z.net'
      secretName: tls-pub-d7z
  rules:
    - host: pages.d7z.net
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: svc-gitlab
                port:
                  name: gitlab-web
    - host: '*.pages.d7z.net'
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: svc-gitlab
                port:
                  name: gitlab-web

6. 测试

6.1. 检查部署结果

使用以下命令查看各个组件的部署结果。

1
kubectl get pods,pvc,service,ingress -n core-app -l app=gitlab

6.2. 测试 LDAP 登陆

创建一个测试用户,并在 cn=develop 下添加对此用户的绑定,然后在 Gitlab 测试登陆,登陆成功后,退出用户并在 LDAP 下删除此用户,然后再次测试,如无法登陆则表明部署成功。