kubernetes上部署gitlab

官网教程:helm安装gitlab

sameersbn:sameersbn/docker-gitlab

说明

gitlab部署方式有很多种,最传统的方法就是官网Linux系统的安装教程,真的是超级简单。目前发展趋势,自然是少不了docker部署和kubernetes部署。gitlab官方提供的docker和kubernetes部署教程较为繁琐,因此有大神自己就制作了gitlab的镜像和部署教程:https://github.com/sameersbn/docker-gitlab

然后gitlab的组件有:redis,postgresql,gitlab核心三大块,因此只需要将这三个应用起起来就可以运行gitlab 了

redis

apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis
  namespace: gitlab
  labels:
    name: redis
spec:
  replicas: 1
  selector:
    matchLabels:
      name: redis
  template:
    metadata:
      labels:
        name: redis
    spec:
      containers:
      - name: redis
        image: redis:6-alpine
        ports:
        - name: redis
          containerPort: 6379
        volumeMounts:
        - mountPath: /var/lib/redis
          name: redis-volume
        livenessProbe:
          exec:
            command:
            - redis-cli
            - ping
          initialDelaySeconds: 30
          timeoutSeconds: 5
        readinessProbe:
          exec:
            command:
            - redis-cli
            - ping
          initialDelaySeconds: 5
          timeoutSeconds: 1
      volumes:
      - name: redis-volume
        persistentVolumeClaim:
          claimName: redis-volume     

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: redis-volume
  namespace: gitlab
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: nfs-client
  resources:
    requests:
      storage: 1Gi

---

apiVersion: v1
kind: Service
metadata:
  name: redis
  namespace: gitlab
  labels:
    name: redis
spec:
  ports:
    - name: redis
      port: 6379
      targetPort: redis
  selector:
    name: redis

postgresql

apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgresql
  namespace: gitlab
  labels:
    name: postgresql
spec:
  selector:
    matchLabels:
      name: postgresql
  template:
    metadata:
      labels:
        name: postgresql
    spec:
      containers:
      - name: postgresql
        image: sameersbn/postgresql:12-20200524
        imagePullPolicy: IfNotPresent
        env:
        - name: DB_USER
          value: gitlab
        - name: DB_PASS
          value: aRS7EGMKKubxzgPp
        - name: DB_NAME
          value: gitlab_production
        - name: DB_EXTENSION
          value: pg_trgm,btree_gist
        ports:
        - name: postgres
          containerPort: 5432
        volumeMounts:
        - mountPath: /var/lib/postgresql
          name: postgresql-volume
        livenessProbe:
          exec:
            command:
            - pg_isready
            - -h
            - localhost
            - -U
            - postgres
          initialDelaySeconds: 30
          timeoutSeconds: 5
        readinessProbe:
          exec:
            command:
            - pg_isready
            - -h
            - localhost
            - -U
            - postgres
          initialDelaySeconds: 5
          timeoutSeconds: 1
      volumes:
      - name: postgresql-volume
        persistentVolumeClaim:
          claimName: postgresql-volume

---
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: postgresql-volume
  namespace: gitlab
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: nfs-client
  resources:
    requests:
      storage: 1Gi
---
apiVersion: v1
kind: Service
metadata:
  name: postgresql
  namespace: gitlab
  labels:
    name: postgresql
spec:
  ports:
    - name: postgres
      port: 5432
      targetPort: postgres
  selector:
    name: postgresql

gitlab

[root@master cert]# kubectl create secret tls gitlab-cert --namespace gitlab --cert=./tls.crt --key=./tls.key
apiVersion: apps/v1
kind: Deployment
metadata:
  name: gitlab
  namespace: gitlab
  labels:
    name: gitlab
spec:
  selector:
    matchLabels:
      name: gitlab
  template:
    metadata:
      name: gitlab
      labels:
        name: gitlab
    spec:
      containers:
      - name: gitlab
        image: sameersbn/gitlab:14.1.3
        imagePullPolicy: IfNotPresent
        env:
        - name: TZ
          value: Asia/Shanghai
        - name: GITLAB_TIMEZONE
          value: Beijing
        - name: GITLAB_SECRETS_DB_KEY_BASE
          value: AoAwTo80cxCpeCGyHrFhBMUckMt0
        - name: GITLAB_SECRETS_SECRET_KEY_BASE
          value: 2y3e4ffJ222QOMMluIll9QpOvH9f
        - name: GITLAB_SECRETS_OTP_KEY_BASE
          value: 6N5NHzM71ohXqnRx5I7slKcptNCP
        - name: GITLAB_ROOT_PASSWORD
          value: mnKOOsoz
        - name: GITLAB_ROOT_EMAIL
          value: [email protected]
        - name: GITLAB_HOST
          value: gitlab.xxxxxx.cn
        - 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: GITLAB_BACKUP_SCHEDULE
          value: daily
        - name: GITLAB_BACKUP_TIME
          value: 01:00
        - name: DB_TYPE
          value: postgres
        - name: DB_HOST
          value: postgresql
        - name: DB_PORT
          value: "5432"
        - name: DB_USER
          value: gitlab
        - name: DB_PASS
          value: "aRS7EGMKKubxzgPp"
        - name: DB_NAME
          value: gitlab_production
        - name: REDIS_HOST
          value: redis
        - name: REDIS_PORT
          value: "6379"
        ports:
        - name: http
          containerPort: 80
        - name: ssh
          containerPort: 22
        volumeMounts:
        - mountPath: /home/git/data
          name: gitlab-volume
        livenessProbe:
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 180
          timeoutSeconds: 5
        readinessProbe:
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 5
          timeoutSeconds: 1
      volumes:
      - name: gitlab-volume
        persistentVolumeClaim:
          claimName: gitlab-volume

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: gitlab-volume
  namespace: gitlab
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: nfs-client
  resources:
    requests:
      storage: 10Gi


---
apiVersion: v1
kind: Service
metadata:
  name: gitlab
  namespace: gitlab
  labels:
    name: gitlab
spec:
  ports:
    - name: http
      port: 80
      targetPort: http
    - name: ssh
      port: 22
      targetPort: ssh
  selector:
    name: gitlab

---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: gitlab
  namespace: gitlab
spec:
  ingressClassName: nginx
  tls:
  - hosts:
      - gitlab.xxxxxx.cn
    secretName: gitlab-cert
  rules:
  - host: gitlab.xxxxxx.cn
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: gitlab
            port: 
              number: 80

部署gitlab的时候启动报错

psql:/home/git/gitlab/db/structure.sql:9: ERROR:  permission denied to create extension "btree_gist"
HINT:  Must be superuser to create this extension.

解决办法:在部署postgresql的时候直接安装这个插件

https://github.com/sameersbn/docker-gitlab/issues/2214

DB_EXTENSION=pg_trgm,btree_gist

创建好ingress后发现分配不到ip,无法访问

原因:k8s1.18对ingress做了一些变更,多了一个ingressclass的字段,因此在创建ingress的时候需要使用ingressClassName来指定使用哪个ingress,具体可以参考:https://kubernetes.io/zh/docs/concepts/services-networking/ingress/#ingress-class

然后就可以访问了,用户名admin,密码上面上面设置的密码

然后可以在设置-->通用--> 可见性与访问控制-->自定义git克隆url,然后重启gitlab就可以愉快地使用了