Post

[CI/CD] GitLab Runner 완전 정리: Kubernetes Executor 설정과 동작 원리

GitLab Runner

1. 개요

한 줄 요약: GitLab CI/CD 파이프라인을 실행하는 에이전트

언제 사용하나:

  • GitLab .gitlab-ci.yml에 정의된 CI/CD Job을 실행할 때
  • 코드 푸시/MR 이벤트 발생 시 자동으로 빌드/테스트 수행
  • Kubernetes 클러스터에서 동적으로 Pod를 생성하여 Job 실행

동작 흐름:

1
GitLab 서버 → Runner 등록 → Job 할당 → Executor에서 실행 → 결과 반환

2. 핵심 개념

2.1. Executor 종류

Executor설명사용 시점
KubernetesKubernetes 클러스터에서 Job마다 Pod 생성가장 일반적, 동적 스케일링
DockerDocker 컨테이너에서 실행단일 서버 환경
ShellRunner가 설치된 서버에서 직접 실행간단한 환경, 레거시

2.2. Runner 타입

타입범위설명
Shared RunnerGitLab 인스턴스 전체모든 프로젝트에서 사용 가능
Group Runner특정 그룹해당 그룹의 프로젝트에서만 사용
Specific Runner특정 프로젝트지정된 프로젝트에만 할당

2.3. 주요 특징

  • 동적 스케일링: Kubernetes Executor는 Job마다 Pod 생성 후 종료
  • 태그 기반 할당: Runner에 태그를 지정해 특정 Job만 실행 가능
  • 동시 실행 제어: concurrent 설정으로 동시 실행 Job 수 제한

3. 기본 명령어

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Runner Pod 확인 (gitlab-runner namespace)
kubectl get pods -n gitlab-runner

# Runner 로그 확인
kubectl logs -n gitlab-runner -f

# Runner 설정 확인
kubectl get configmap -n gitlab-runner gitlab-runner -o yaml

# Runner가 실행 중인 Job Pod 확인
kubectl get pods -n gitlab-runner -l "app=gitlab-runner"

# 특정 Job Pod 로그 확인
kubectl logs -n gitlab-runner runner---

출력 예시:

1
2
3
4
5
NAME                                READY   STATUS    RESTARTS   AGE
gitlab-runner-5d8f7c9b8d-k7m2p      1/1     Running   0          5d

# Job 실행 중
runner-123-456-abc123               1/1     Running   0          30s

4. 주요 설정 패턴

4.1. Kubernetes Executor Runner ConfigMap

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
apiVersion: v1
kind: ConfigMap
metadata:
  name: gitlab-runner
  namespace: gitlab-runner
data:
  config.toml: |
    concurrent = 10       # 동시 실행 가능한 Job 수
    check_interval = 3

    [[runners]]
      name = "k8s-runner"
      url = "https://gitlab.example.com/"
      token = "RUNNER_TOKEN"
      executor = "kubernetes"

      [runners.kubernetes]
        namespace = "gitlab-runner"
        image = "alpine:latest"     # 기본 이미지
        privileged = false
        cpu_request = "100m"
        memory_request = "128Mi"
        cpu_limit = "1"
        memory_limit = "1Gi"
        service_cpu_request = "100m"
        service_memory_request = "128Mi"
        helper_cpu_request = "50m"
        helper_memory_request = "64Mi"

        # PVC로 빌드 캐시 저장
        [runners.kubernetes.volumes.pvc]
          name = "gitlab-runner-cache"
          mount_path = "/cache"

특징:

  • Job마다 alpine:latest 기반 Pod 생성
  • .gitlab-ci.yml에서 image: 지정 시 해당 이미지로 덮어씀
  • 리소스 제한으로 클러스터 과부하 방지

4.2. .gitlab-ci.yml 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
stages:
  - build
  - test

variables:
  MAVEN_OPTS: "-Dmaven.repo.local=/cache/.m2"

build-job:
  stage: build
  image: maven:3.8-openjdk-11    # Runner의 기본 이미지 덮어씀
  tags:
    - kubernetes                 # 이 태그를 가진 Runner에서만 실행
  script:
    - mvn clean package -DskipTests
  artifacts:
    paths:
      - target/*.jar
    expire_in: 1 hour
  only:
    - main
    - merge_requests

test-job:
  stage: test
  image: maven:3.8-openjdk-11
  tags:
    - kubernetes
  script:
    - mvn test
  dependencies:
    - build-job

동작 흐름:

1
2
3
4
5
6
7
8
9
1. GitLab 서버가 `kubernetes` 태그를 가진 Runner에 Job 할당
   ↓
2. Runner가 Kubernetes에 `maven:3.8-openjdk-11` 이미지로 Pod 생성
   ↓
3. Pod 내부에서 `mvn clean package` 실행
   ↓
4. 빌드 산출물을 artifacts로 저장
   ↓
5. Pod 종료 후 자동 삭제

5. GitLab Runner vs Tekton 비교

항목GitLab RunnerTekton
트리거GitLab 이벤트 (push, MR)수동 또는 EventListener
설정 위치.gitlab-ci.yml (소스 저장소)Pipeline YAML (클러스터)
의존성GitLab 서버 필요독립적 (K8s만 필요)
재사용성Job 템플릿 (include)Task 재사용 (taskRef)
UIGitLab CI/CD UITekton Dashboard
캐싱기본 지원 (artifacts, cache)별도 구성 필요
병렬 실행parallel 키워드DAG 방식

6. 주의사항

버전 호환성

  • K8s 1.21: GitLab Runner 14.x 이상 권장
  • GitLab 15.3.2-ce: Runner 15.x와 호환성 좋음
  • Runner와 GitLab 버전 차이가 2 major 버전 이상이면 호환성 문제 발생 가능

HyperCloud IC에서 GitLab Runner로 전환하는 이유

  1. 표준화: GitLab CI/CD는 업계 표준, HyperCloud IC는 Tmax 종속
  2. HyperCloud 독립성: EKS 마이그레이션 등 플랫폼 전환 대비
  3. 성능: GitLab Runner가 캐싱/병렬 실행에서 더 우수
  4. 생태계: GitLab CI/CD 커뮤니티 및 레퍼런스가 풍부
This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.