GitLab 구축 (On Kubernetes)

NOHHYEONGJUN·2025년 6월 26일

CI/CD

목록 보기
11/15
post-thumbnail

GitLab

GitLabGit 기반의 DevOps 플랫폼이다.

소스 코드 형상 관리, 이슈 추적, 보안, 배포 등 라이프사이클을 관리할 수 있게 해주는 도구이다.

가장 중요한 것은 GitLab은 Community Additon을 무료로 공개셀프 호스팅을 할 수 있다.

 

  • 소스 코드 관리, 이슈 추적 등 프로젝트 라이프사이클을 관리하는 통합 개발 플랫폼이다.

  • 코드 협업과 프로젝트 관리를 원활하게 수행할 수 있다.

 

간단하게 Kubernetes 위에 GitLab을 배포하고 사용하는 방법을 정리해보았다.

추가로, keycloak OpenID Connect 연동도 함께 정리하였다.


 

 


1. NameSpace 및 PersistentVolumeClaim 설정

배포는 ArgoCD를 이용하므로, NameSpace 생성은 별도로 진행하지 않는다. (필요시 진행)

PVC 설정

사용중인 storageClass, 필요한 accessModes, 크기 등을 설정한다.

# 설정 파일용 스토리지 (20GB)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: gitlab-config-pvc
  namespace: gitlab
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: longhorn
  resources:
    requests:
      storage: 20Gi

# 데이터 저장용 스토리지 (80GB)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: gitlab-data-pvc
  namespace: gitlab
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: longhorn
  resources:
    requests:
      storage: 80Gi

# 로그 파일용 스토리지 (30GB)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: gitlab-logs-pvc
  namespace: gitlab
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: longhorn
  resources:
    requests:
      storage: 30Gi

 

 


2. ConfigMap

GitLab에 필요한 핵심 설정을 ConfigMap으로 관리한다.

apiVersion: v1
kind: ConfigMap
metadata:
  name: gitlab-config
  namespace: gitlab
data:
  gitlab.rb: |
    # 기본 URL 설정
    external_url 'ex)www.mygitlab.com'
    gitlab_rails['gitlab_shell_ssh_port'] = 22
    
    # 모니터링 기능 비활성화 (리소스 절약)
    prometheus_monitoring['enable'] = false
    sidekiq['metrics_enabled'] = false
    sidekiq['metrics_server_enabled'] = false
    node_exporter['enable'] = false
    redis_exporter['enable'] = false
    postgres_exporter['enable'] = false
    gitlab_exporter['enable'] = false
    puma['enable_prometheus_metrics'] = false
    sidekiq['enable_prometheus_metrics'] = false
    
    # Nginx 설정
    nginx['enable'] = true
    nginx['listen_port'] = 80
    nginx['listen_https'] = false
    
    # KAS(Kubernetes Agent Server) 완전 비활성화
    gitlab_rails['gitlab_kas_enabled'] = false
    gitlab_kas['enable'] = false
    
    # Keycloak OpenID Connect 연동 설정
    gitlab_rails['omniauth_providers'] = [
      {
        "name" => "openid_connect",
        "label" => "Keycloak",
        "args" => {
          "name" => "openid_connect",
          "scope" => ["openid", "profile", "email"],
          "response_type" => "code",
          "issuer" => "ex)https://key.my.com/realms/GitLab",
          "client_auth_method" => "query",
          "discovery" => true,
          "uid_field" => "preferred_username",
          "pkce" => false,
          "client_options" => {
            "identifier" => "gitlab",
            "secret" => "ex)lSDFSD7SDFbNVRl72bFs2ERfhMr",
            "redirect_uri" => "ex)https://www.mygitlab.com/users/auth/openid_connect/callback"
          }
        }
      }
    ]
    
    # SSO 관련 설정
    gitlab_rails['omniauth_allow_single_sign_on'] = ['openid_connect']
    gitlab_rails['omniauth_block_auto_created_users'] = false
    gitlab_rails['omniauth_auto_link_user'] = true
    gitlab_rails['omniauth_bypass_two_factor'] = ['openid_connect']
    gitlab_rails['omniauth_auto_sign_in_with_provider'] = 'openid_connect'
    
    # 프록시 헤더 설정
    nginx['proxy_set_headers'] = {
      "Host" => "$http_host",
      "X-Real-IP" => "$remote_addr",
      "X-Forwarded-For" => "$proxy_add_x_forwarded_for",
      "X-Forwarded-Proto" => "https",
      "X-Forwarded-Ssl" => "on"
    }

 

 


3. Deployment 설정

GitLab은 메모리 집약적이므로 충분한 리소스 할당이 필요하다.
또한 GitLab 안정 버전을 확인 후, 사용한다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: gitlab
  namespace: gitlab
spec:
  selector:
    matchLabels:
      app: gitlab
  replicas: 1
  template:
    metadata:
      labels:
        app: gitlab
    spec:
      containers:
      - name: gitlab
        image: gitlab/gitlab-ce:17.9.2-ce.0
        ports:
        - containerPort: 80
        volumeMounts:
        - name: config
          mountPath: /etc/gitlab
        - name: data
          mountPath: /var/opt/gitlab
        - name: logs
          mountPath: /var/log/gitlab
        - name: gitlab-config       
          mountPath: /etc/gitlab/gitlab.rb
          subPath: gitlab.rb  
        - name: shm
          mountPath: /dev/shm     
        resources:
          requests:
            memory: "6Gi"
            cpu: "2"
          limits:
            memory: "32Gi"
            cpu: "8"
      volumes:
      - name: config
        persistentVolumeClaim:
          claimName: gitlab-config-pvc
      - name: data
        persistentVolumeClaim:
          claimName: gitlab-data-pvc
      - name: logs
        persistentVolumeClaim:
          claimName: gitlab-logs-pvc
      - name: gitlab-config        
        configMap:
          name: gitlab-config     
      - name: shm
        emptyDir: {}

 

 


4. Service 및 Ingress 설정

Service 설정

apiVersion: v1
kind: Service
metadata:
  name: gitlab
  namespace: gitlab
spec:
  type: ClusterIP
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: gitlab

 

Ingress 설정

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: gitlab-ingress
  namespace: gitlab
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
    nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
    nginx.ingress.kubernetes.io/proxy-connect-timeout: "300"
    nginx.ingress.kubernetes.io/proxy-body-size: "0"
    nginx.ingress.kubernetes.io/proxy-buffer-size: "64k"
    nginx.ingress.kubernetes.io/proxy-buffering: "on"
spec:
  ingressClassName: nginx
  rules:
  - host: ex)www.mygitlab.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: gitlab
            port:
              number: 80

Ingress annotation 설명

  • 타임아웃 설정: Git 작업 시 긴 처리 시간을 고려한 타임아웃 값

  • 프록시 버퍼 설정: 대용량 파일 업로드/다운로드 최적화

  • SSL 리다이렉트 비활성화: 내부 HTTP 통신 허용


 

 


5. 배포 및 확인

배포는 ArgoCD를 이용해 진행한다.

 

초기 설정 확인

초기 root 패스워드를 별도로 설정하지 않았으므로, 확인 후 재설정이 필요하다.

kubectl exec -it deployment/gitlab -n gitlab -- cat /etc/gitlab/initial_root_password

 

 


6. 추가 설정

Visibility and access controls

프로젝트 생성 시 권한, 그룹 기본 권한 등을 설정할 수 있다.

가장 중요한 git clone을 위한 url을 설정할 수 있다.

Import and export settings

GitHub, BitBucket 등 다른 서비스에서 프로젝트를 Import 할 수 있도록 설정할 수 있다.

 

 

Appearance Custom

Favicon, Logo, Login Page Title 등 다양하게 커스텀할 수 있다.

 

 

Outbound requests

만약 내부망에서 Jenkins 등과 연계로 사용한다면, 내부 IP를 통해 Webhook이 가능하도록 허용해야 한다.


결론

아주 기본적인 설정에 대해 정리하였다.

현재는 더 복잡하게 관리하고 있다.

profile
Cloud/DevOps & Network Virtualization에 관심 있는 대학생입니다. 🐳

0개의 댓글