Gitlab主要涉及到3个应用:Redis、Postgresql、Gitlab 核心程序,实际上我们只要将这3个应用分别启动起来,然后加上对应的配置就可以很方便的安装 Gitlab 了,我们这里选择使用的镜像不是官方的,而是 Gitlab 容器化中使用非常多的一个第三方镜像:sameersbn/gitlab,基本上和官方保持同步更新,地址:http://www.damagehead.com/docker-gitlab/
如果我们已经有可使用的 Redis 或 Postgresql 服务的话,那么直接配置在 Gitlab 环境变量中即可,如果没有的话就单独部署。 创建一个用于存储密码的secret文件:1、redis
创建PVC和storageclass做持久化
apiVersion: v1kind: PersistentVolumeClaimmetadata:name: gitlab-redis-pvcnamespace: kube-opsannotations:volume.beta.kubernetes.io/storage-class: "managed-nfs-storage"spec:accessModes:- ReadWriteManyresources:requests:storage: 1Gi
redis
apiVersion: apps/v1kind: Deploymentmetadata:name: redisnamespace: kube-opslabels:name: redisspec:replicas: 1selector:matchLabels:app: redistemplate:metadata:name: redislabels:app: redisspec:containers:- name: redisimage: redis # sameersbn/redisimagePullPolicy: IfNotPresentports:- name: rediscontainerPort: 6379volumeMounts:- mountPath: /var/lib/redisname: datalivenessProbe:exec:command:- redis-cli- pinginitialDelaySeconds: 30timeoutSeconds: 5readinessProbe:exec:command:- redis-cli- pinginitialDelaySeconds: 5timeoutSeconds: 1volumes:- name: datapersistentVolumeClaim:claimName: gitlab-redis-pvc---apiVersion: v1kind: Servicemetadata:name: redisnamespace: kube-opslabels:name: redisspec:ports:- name: redisport: 6379targetPort: redisselector:name: redis
2、PG
secret
apiVersion: v1data:PG_USER: cG9zdGdyZXM= # postgresPG_PASSWORD: cGdfcGFzcw== # pg_passkind: Secretmetadata:name: postgres-secretnamespace: kube-opstype: Opaque
加密
echo -n "postgres" | base64echo -n "pg_pass" | base64
PVC
apiVersion: v1kind: PersistentVolumeClaimmetadata:name: gitlab-postgresql-pvcnamespace: kube-opsannotations:volume.beta.kubernetes.io/storage-class: "managed-nfs-storage"spec:accessModes:- ReadWriteManyresources:requests:storage: 1Gi
创建用户并指定id(或者查看用户ID,根据具体的id屁【配置安全上下文】)
PG需要使用普通用户进行启动
-u 指定用户id
-g 指定所属组id
# 需要在挂载的节点上创建,并授权挂载路径useradd postgres -u 1000 -g 1000# 修改用户和组的idgroupmod -g 5000 foo # 修改foo组usermod -u 5000 foo # 修改foo用户# chown -R postgres:postgres kube-ops-gitlab-postgresql-pvc-pvc-efe927e9-c4ea-4581-9826-c727196a281b/
PVC挂载路径的命名格式:<名称空间>-
-
kubectl get pvc -n kube-opsNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGEgitlab-postgresql-pvc Bound pvc-efe927e9-c4ea-4581-9826-c727196a281b 1Gi RWX managed-nfs-storage 4h33mgitlab-redis-pvc Bound pvc-c863945e-2726-43c5-9f6c-7737ea0bbb2a 1Gi RWX managed-nfs-storage 4h43m
否则会报如下错误无法启动:

Postgresql
apiVersion: apps/v1kind: StatefulSetmetadata:name: postgresnamespace: kube-opsspec:serviceName: "postgres" # 声明它属于哪个Headless Service.replicas: 1selector:matchLabels:app: postgrestemplate:metadata:labels:app: postgresspec:securityContext:runAsUser: 1000runAsGroup: 1000fsGroup: 1000containers:- name: postgresimage: postgres:9.5env:- name: POSTGRES_USERvalueFrom:secretKeyRef:name: postgres-secretkey: PG_USERoptional: false- name: POSTGRES_PASSWORDvalueFrom:secretKeyRef:name: postgres-secretkey: PG_PASSWORDoptional: falseports:- containerPort: 5432name: postgredbvolumeMounts:- name: postgres-datamountPath: /var/lib/postgresql/datasubPath: postgresvolumes:- name: postgres-datapersistentVolumeClaim:claimName: gitlab-postgresql-pvc---apiVersion: v1kind: Servicemetadata:name: postgresqlnamespace: kube-opslabels:app: postgresqlspec:ports:- name: postgresport: 5432targetPort: postgresselector:app: postgresql
3、Gitlab
PVC
apiVersion: v1kind: PersistentVolumeClaimmetadata:name: gitlab-data-pvcnamespace: kube-opsannotations:volume.beta.kubernetes.io/storage-class: "managed-nfs-storage"spec:accessModes:- ReadWriteManyresources:requests:storage: 1Gi---apiVersion: v1kind: PersistentVolumeClaimmetadata:name: gitlab-log-pvcnamespace: kube-opsannotations:volume.beta.kubernetes.io/storage-class: "managed-nfs-storage"spec:accessModes:- ReadWriteManyresources:requests:storage: 1Gi---apiVersion: v1kind: PersistentVolumeClaimmetadata:name: gitlab-etc-pvcnamespace: kube-opsannotations:volume.beta.kubernetes.io/storage-class: "managed-nfs-storage"spec:accessModes:- ReadWriteManyresources:requests:storage: 1Gi
Gitlab
apiVersion: apps/v1kind: Deploymentmetadata:name: gitlabnamespace: kube-opslabels:name: gitlabspec:replicas: 1selector:matchLabels:name: gitlabtemplate:metadata:name: gitlablabels:name: gitlabspec:containers:- name: gitlabimage: gitlab/gitlab-ce:13.7.4-ce.0imagePullPolicy: IfNotPresentenv:- name: TZvalue: Asia/Shanghai- name: GITLAB_TIMEZONEvalue: Beijing- name: GITLAB_SECRETS_DB_KEY_BASEvalue: long-and-random-alpha-numeric-string- name: GITLAB_SECRETS_SECRET_KEY_BASEvalue: long-and-random-alpha-numeric-string- name: GITLAB_SECRETS_OTP_KEY_BASEvalue: long-and-random-alpha-numeric-string- name: GITLAB_ROOT_PASSWORDvalue: admin321- name: GITLAB_ROOT_EMAILvalue: 1690014753@qq.com- name: GITLAB_HOSTvalue: 0.0.0.0:30004- name: GITLAB_PORTvalue: "80"- name: GITLAB_SSH_PORTvalue: "22"- name: DB_TYPEvalue: postgres- name: DB_HOSTvalue: postgresql- name: DB_PORTvalue: "5432"- name: DB_USERvalue: postgres- name: DB_PASSvalue: pg_pass- name: DB_NAMEvalue: gitlab_production- name: REDIS_HOSTvalue: redis- name: REDIS_PORTvalue: "6379"ports:- name: httpcontainerPort: 80- name: sshcontainerPort: 22volumeMounts:- mountPath: /var/opt/gitlabname: data- mountPath: /var/log/gitlabname: logs- mountPath: /etc/gitlabname: etclivenessProbe:httpGet:path: /port: 80initialDelaySeconds: 180timeoutSeconds: 5readinessProbe:httpGet:path: /port: 80initialDelaySeconds: 5timeoutSeconds: 1volumes:- name: datapersistentVolumeClaim:claimName: gitlab-data-pvc- name: logspersistentVolumeClaim:claimName: gitlab-log-pvc- name: etcpersistentVolumeClaim:claimName: gitlab-etc-pvc---apiVersion: v1kind: Servicemetadata:name: gitlabnamespace: kube-opslabels:name: gitlabspec:type: NodePortports:- name: httpport: 80targetPort: httpnodePort: 30004- name: sshport: 22targetPort: sshselector:name: gitlab
