
GitLab은 Git 기반의 DevOps 플랫폼이다.
소스 코드 형상 관리, 이슈 추적, 보안, 배포 등 라이프사이클을 관리할 수 있게 해주는 도구이다.
가장 중요한 것은 GitLab은 Community Additon을 무료로 공개해 셀프 호스팅을 할 수 있다.
소스 코드 관리, 이슈 추적 등 프로젝트 라이프사이클을 관리하는 통합 개발 플랫폼이다.
코드 협업과 프로젝트 관리를 원활하게 수행할 수 있다.
간단하게 Kubernetes 위에 GitLab을 배포하고 사용하는 방법을 정리해보았다.
추가로, keycloak OpenID Connect 연동도 함께 정리하였다.
배포는 ArgoCD를 이용하므로, NameSpace 생성은 별도로 진행하지 않는다. (필요시 진행)
사용중인 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
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"
}
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: {}
apiVersion: v1
kind: Service
metadata:
name: gitlab
namespace: gitlab
spec:
type: ClusterIP
ports:
- port: 80
targetPort: 80
selector:
app: gitlab
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 통신 허용
배포는 ArgoCD를 이용해 진행한다.

초기 root 패스워드를 별도로 설정하지 않았으므로, 확인 후 재설정이 필요하다.
kubectl exec -it deployment/gitlab -n gitlab -- cat /etc/gitlab/initial_root_password

프로젝트 생성 시 권한, 그룹 기본 권한 등을 설정할 수 있다.
가장 중요한 git clone을 위한 url을 설정할 수 있다.
GitHub, BitBucket 등 다른 서비스에서 프로젝트를 Import 할 수 있도록 설정할 수 있다.

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

만약 내부망에서 Jenkins 등과 연계로 사용한다면, 내부 IP를 통해 Webhook이 가능하도록 허용해야 한다.
아주 기본적인 설정에 대해 정리하였다.
현재는 더 복잡하게 관리하고 있다.