[CICD] GitLab 기본 개념 및 설치

Donghee Kim·2025년 12월 21일

문득문득

목록 보기
14/15
post-thumbnail

해당 글을 쓰는 이유는 현재 학교 프라이빗망 내의 Infra에서 CICD를 구축하고자 하였다.
하지만 깃허브와 같은 SCM(Source Code Management)에서 프라이빗망 내의 인프라로 CI나 CD가 안될거 같았다.
다음과 같은 구조다.

  • SCM : GitHub -> [Webhook : Trigger] -> | 프라이빗 망 : Jenkins -> ArgoCD |

학교 네트워크 관리실에서 우리 포트나 DNS를 외부로 오픈하지 않는 한, 아마 프라이빗망 내의 클러스터로 웹훅을 줄 수 없을 것이라 판단하였다.
프라이빗 망내의 GitLab을 구축하기로 하였다.

해당 우려 사항은 다음과 같다.
GitLab은 설치 시 Cert-Manager를 설치하려고한다. 그래서 이미 Cert-Manager는 기본적으로 설치가 되어있어서 리소스 충돌 / 시크릿 충돌 등 여러 상황을 우려하여 설치하고자 하였다.

지금 쓰는 글은 내가 실질적으로 올린 것은 아니지만, 그냥 로컬리하게 테스팅하고 올려보고 다른 사람들도 쓸 수 있도록 기술하고자 한다.

설치 이유

간단하게 그냥 GitHub가 주도권이 실제 GitHub 회사에 있어서 SCM에 대한 WebHook 등 주도권이 GitHub 서버의 IP가 가지고 있다면 우리가 GitLab을 설치해서 해당 주도권을 우리가 갖고자 하는 것이다.

제일 우려했던 사항!

한창 Cert-Manager에 대해 공부하고 있었던 상황이라 더 눈에 들어왔다.
GitLab은 Kubernetes 환경에 설치될 경우:

  • Ingress
  • TLS
  • 내부 컴포넌트 인증
    을 위해 Cert-Manager를 기본 전제로 가정하는 설치 방식이 많습니다.

하지만 이미 클러스터에 Cert-Manager가 설치되어 있는 경우:

  • CRD 충돌
  • Issuer / ClusterIssuer 중복
  • Secret 네이밍 충돌

등이 발생할 수 있어, “무작정 설치하기 전에 구조를 이해하는 것”이 중요합니다.


GitLab

GitLab은 소스 코드 관리(SCM) 를 중심으로
CI(Continuous Integration) 와 CD(Continuous Delivery/Deployment) 기능까지 하나의 플랫폼으로 제공하는 통합 DevOps 도구.


GitLab 설치

1. Docker Desktop & Kind(Kubernetes in Docker) 환경

Ubuntu 20.04.6LTS 설치

Docker Destktop 설치

Kind 설치

  • kind-config.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4

networking:
  disableDefaultCNI: false
  kubeProxyMode: "iptables"

nodes:
  - role: control-plane
    image: kindest/node:v1.25.3
    extraPortMappings:
    - containerPort: 80
      hostPort: 8080
      protocol: TCP
    - containerPort: 443
      hostPort: 8443
      protocol: TCP
  - role: worker
    image: kindest/node:v1.25.3
  - role: worker
    image: kindest/node:v1.25.3
  - role: worker
    image: kindest/node:v1.25.3
  • kind 생성
kind create cluster --config kind-config.yaml

2. 기본적인 Cert-Manager & IngressController 설치

보통 Cert-Manager와 IngressController는 사용중일 수 있기 때문에 우선은 설치된 환경을 구현하고자한다. 실제로 내 Private 망 서버에도 설치가 되어있었다.

NameSpace 설치

kubectl create ns gitlab

Cert-Manager 설치

kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.14.5/cert-manager.yaml

미리 gitlab tls 인증서를 만들어놓아도 괜찮다. 만드는 방법은 다음과 같다.

RootCA 만들기
  • selfsign.yaml
# selfsigned-clusterissuer.yaml
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: selfsign
  namespace: cert-manager
spec:
  selfSigned: {}
  • self-ca-certificate.yaml
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: root-ca
  namespace: cert-manager
spec:
  renewBefore: 360h
  duration: 87600h
  isCA: true
  commonName: "*.localhost"
  secretName: root-secret
  privateKey:
    algorithm: ECDSA
    size: 256
  issuerRef:
    name: selfsign
    kind: ClusterIssuer
    group: cert-manager.io
  • self-ca.yaml
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: root-ca
  namespace: cert-manager
spec:
  renewBefore: 360h
  duration: 87600h
  isCA: true
  commonName: "*.localhost"
  secretName: root-secret
  privateKey:
    algorithm: ECDSA
    size: 256
  issuerRef:
    name: selfsign
    kind: ClusterIssuer
    group: cert-manager.io
  • gitlab-tls.yaml
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: gitlab-cert
  namespace: gitlab       # GitLab이 설치된 네임스페이스
spec:
  secretName: gitlab-tls # 이 Secret 이름이 GitLab Ingress에서 참조됨
  issuerRef:
    name: self-ca        # 이미 존재하는 ClusterIssuer
    kind: ClusterIssuer
  duration: 8760h  # 90일
  renewBefore: 360h      # 15일 전에 갱신
  dnsNames:
    - gitlab.localhost
    - registry.localhost
    - minio.localhost
    - kas.localhost
  • 적용
kubectl apply -f selfsign.yaml
kubectl apply -f slef-ca-certificate.yaml
kubectl apply -f slef-ca.yaml

kubectl apply -f gitlab-tls.yaml

Ingress-Controller 설치

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml

3. Helm 설치 및 GitLab Chart 가져오기

curl -fsSL https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

helm version

helm repo add gitlab https://charts.gitlab.io/

helm repo list

helm repo update

helm pull gitlab/gitlab --untar

=> 해당 과정을 거치면 GitLab Chart를 가져올 수 있다.

4. Helm 차트 커스텀

해당 디렉토리 위치를 vscode 로 열어서 커스텀 해야한다. 커스텀하는 파일은 다음과 같다.

gitlab chart 버전마다 조금씩 기술된 위치가 다를 수 있다.

  • gitlab/values.yaml - global:
  1. Gitlab Version
edition: ce
  • ee : 상용(유료) 기능 포함
  • ce : 오픈소스 버전
  1. hosts
hosts:
	domain: localhost
  • 해당 칸은 사용 중인 도메인을 사용하면 된다. 해당 도메인을 사용하면 Helm Chart가 총 네가지의 도메인을 만들어준다.

    • gitlab.example.com : GitLab Web UI (Main 서비스)
    • registry.example.com : GitLab Container Registry
    • minio.example.com : GitLab 내부 Object Storage (MinIO)
    • kas.example.com : GitLab Kubernetes Agent Server (KAS)

+물론 나는 외부 DNS 를 사용하지만, localhost를 로컬에서 DNS처럼 사용하고 싶으면 해당 파일에 DNS 를 등록해주어야 사용가능하다.

C:\Windows\System32\drivers\etc\hosts

# Copyright (c) 1993-2009 Microsoft Corp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
#
...
127.0.0.1 testing.127.0.0.1.nip.io
127.0.0.1 gitlab.localhost # 등록한 부분
127.0.0.1 registry.localhost # 등록한 부분
127.0.0.1 minio.localhost # 등록한 부분
127.0.0.1 kas.localhost # 등록한 부분
127.0.0.1 jenkins.localhost 

# Added by Docker Desktop
172.16.11.247 host.docker.internal
172.16.11.247 gateway.docker.internal
# To allow the same kube context to work on the host and the container:
127.0.0.1 kubernetes.docker.internal
# End of section

외부 DNS를 사용한다면 서브 Domain 을 외부 DNS에서 등록해주면 된다.

  1. Ingress 여부
## https://docs.gitlab.com/charts/charts/globals#configure-ingress-settings
ingress:
  apiVersion: ""
  configureCertmanager: false # cert-manager를 Gitlab이 덮어쓰지 않도록
  # useNewIngressForCerts: false
  provider: nginx
  class: nginx # 우리는 현재 설치된 nginx-Ingress를 사용할 것이다.
  annotations: {}
  enabled: true
  tls: 
     enabled: true
     secretName: gitlab-tls # 이전에 만들었던 secret이다.
  path: /
  pathType: Prefix
  1. InstallCertmanager
installCertmanager: false

...

certmanager:
  installCRDs: false # => 현재 존재하기때문에 false
  1. nginxingress
nginx-ingress:
  enabled: false # nginxingress controller도 수동으로 설치하였기에 false로 설정한다.
  1. prometheus
prometheus:
  install: false # proetheus가 당장 필요하지는 않음.
  1. gitlab_runner
    GitLab Runner는 GitLab과 함께 작동하여 코드 변경 사항을 자동으로 빌드, 테스트 및 배포하는 CI 도구
gitlab-runner:
  install: false # gitlab-runner 대신 추후에 Jenkins를 쓰고자 함.

5. Custom GitLab 설치

helm install gitlab gitlab/gitlab \
  -n gitlab \
  -f values.yaml

6. Portforwading

kubectl port-forward \
  -n ingress-nginx \
  svc/ingress-nginx-controller \
  --address 0.0.0.0 \
  8180:80 \
  9443:443

설치된 프록시 서버인 nginx-ingress-controller를 포워딩해주면 생성돤 ingress에 따라 접속이 가능해질 것이다.

이후, 다음과 같이 gitlab.localhost:9443 을 접속할 수 있을 것이다.

7. 초기 로그인

  • ID : ROOT
  • Init PW :
kubectl get secret gitlab-gitlab-initial-root-password \
  -n gitlab \
  -o jsonpath="{.data.password}" | base64 --decode

ex : B2N8oUaxyMXWbUhnxoUL41PEerN4UujGzJ4FBHt45fi7xIuGYbEJKKBuM2gOkpvB

다음과 같이 로그인이 가능하다.


+GitLab 인증서

ps. gitlab-tls
Jenkins 나 로컬과 같은 곳에서 gitlab에 대해 https(jenkins의 multipipeline / local의 gitclone)과 같은요청을 한다면?
아마 인증서 관련 에러가 뜰 것이다.
그럴 때는 gitlab-tls(우리가 만들었던 Certificate(Secret) 리소스) 에서 인증서 부분을 추출하여 OS 신뢰저장소 or java Keystore 등에 추가하면 된다.
해당 인증서를 추가하는 방법은 다음과 같다.

  • 인증서 추출 방법
kubectl get secret gitlab-tls -n gitlab \
  -o jsonpath="{.data.tls\.crt}" | base64 -d > gitlab.crt

=> gitlab.crt가 파일로 생성된다.

  • OS 신뢰저장소 기준 (Linux 계열)
sudo cp gitlab.crt /usr/local/share/ca-certificates/gitlab.crt
sudo update-ca-certificates
  • Window 계열
    • 구글에 Windows 사설 인증서 설치하는 방법에 관한 레퍼런스가 너무 잘나와있다.
  • KeyStore 기준 (jenkins : jnlp sidecar container 기준)
keytool -importcert \
  -alias gitlab-ca \
  -file gitlab.crt \
  -keystore $JAVA_HOME/lib/security/cacerts
profile
WannaB.E/D.E

0개의 댓글