GitLab과 Kubernetes 연동을 통한 자동화된 CI/CD 파이프라인 구축

소스 코드 저장소 준비

먼저 GitLab 프로젝트를 생성하고 샘플 애플리케이션 코드를 업로드합니다. 예시 프로젝트 주소는 다음과 같습니다:

https://gitee.com/SunHarvey/helloworld_java.git

로컬 환경에서 다음 명령어를 실행하여 코드를 가져오고 원격 저장소에 푸시합니다:

git clone https://gitee.com/SunHarvey/helloworld_java.git
cd helloworld_java
git remote set-url origin https://gitee.com/SunHarvey/helloworld_java.git
git push origin master

Kubernetes 클러스터에 GitLab Runner 설치

1. GitLab Runner 등록 정보 확보

  • GitLab에 로그인 후 대상 프로젝트로 이동합니다.
  • 좌측 메뉴에서 Settings > CI / CD 선택 후 Runners 섹션의 Expand 버튼 클릭
  • 표시되는 URL과 Registration token을 기록해 둡니다.

2. Helm Chart 설정

공식 GitLab Runner Helm 차트를 복제하거나 커스텀 차트를 사용할 수 있습니다:

git clone https://github.com/haoshuwei/gitlab-runner.git
cd gitlab-runner

values.yaml 파일 내 다음 필드를 수정합니다:

gitlabUrl: "http://your-gitlab-instance/"
runnerRegistrationToken: "YOUR_REGISTRATION_TOKEN"

전역 Runner로 설정하려면 GitLab 관리자 계정으로 Admin Area > Overview > Runners에서 토큰을 확인하세요.

3. Helm을 통한 설치

Helm 패키지를 생성하고 설치합니다:

helm package .
helm install gitlab-runner . --namespace gitlab --create-namespace

설치 완료 후 Pod 상태를 확인하고, GitLab UI에서 Runner가 활성화되었는지 검증합니다.

CI/CD 환경 변수 설정

프로젝트의 Settings > CI / CD > Variables에서 다음 변수를 추가합니다:

  • REGISTRY_USERNAME: 컨테이너 레지스트리 사용자명
  • REGISTRY_PASSWORD: 컨테이너 레지스트리 비밀번호
  • kube_config: Base64 인코딩된 kubeconfig 내용

kubeconfig 인코딩 명령어:

cat ~/.kube/config | base64 -w 0

.gitlab-ci.yml 구성

다음은 Java 애플리케이션을 빌드하고 Kubernetes에 배포하는 CI/CD 파이프라인 예시입니다:

image: docker:stable

stages:
  - build
  - build-image
  - deploy

variables:
  KUBECONFIG: /etc/deploy/config
  JAR_PATH: /opt/artifacts/app.jar

build-app:
  image: maven:3.8-jdk-17
  stage: build
  tags:
    - k8s-runner
  script:
    - mvn clean package -DskipTests
    - mkdir -p /opt/artifacts
    - cp target/*.jar $JAR_PATH
  artifacts:
    paths:
      - /opt/artifacts/

build-and-push-image:
  image: docker:latest
  stage: build-image
  tags:
    - k8s-runner
  services:
    - docker:dind
  variables:
    DOCKER_HOST: tcp://localhost:2375
    DOCKER_TLS_CERTDIR: ""
  script:
    - docker login -u "$REGISTRY_USERNAME" -p "$REGISTRY_PASSWORD" registry-vpc.cn-hongkong.aliyuncs.com
    - docker build -t registry-vpc.cn-hongkong.aliyuncs.com/YourImageRepo/helloworld:$CI_COMMIT_SHORT_SHA .
    - docker push registry-vpc.cn-hongkong.aliyuncs.com/YourImageRepo/helloworld:$CI_COMMIT_SHORT_SHA

deploy-to-k8s:
  image: bitnami/kubectl:1.27
  stage: deploy
  tags:
    - k8s-runner
  script:
    - mkdir -p /etc/deploy
    - echo "$kube_config" | base64 -d > $KUBECONFIG
    - sed -i "s|IMAGE_TAG_PLACEHOLDER|registry-vpc.cn-hongkong.aliyuncs.com/YourImageRepo/helloworld:$CI_COMMIT_SHORT_SHA|g" k8s/deployment.yaml
    - kubectl apply -f k8s/deployment.yaml -n gitlab

파이프라인 단계 설명

  • build: Maven으로 JAR 파일 생성 및 아티팩트 보존
  • build-image: Docker 이미지 빌드 및 프라이빗 레지스트리에 푸시 (이미지 태그는 커밋 해시 사용)
  • deploy: kubeconfig 복원 후 deployment 매니페스트의 이미지 경로 치환 및 적용

배포 확인

애플리케이션이 gitlab 네임스페이스에 배포되었다면 다음 명령어로 서비스 상태를 확인할 수 있습니다:

kubectl get svc -n gitlab

주의사항

  • GitLab 프로젝트에서 Auto DevOps 기능이 활성화되어 있다면 충돌을 방지하기 위해 비활성화해야 합니다.
  • Docker-in-Docker(dind) 서비스를 사용할 경우 보안 설정을 적절히 구성해야 합니다.

태그: GitLab kubernetes helm docker CI/CD

10월 2일 03:58에 게시됨