쿠버네티스 CI/CD 파이프라인 구축

쿠버네티스 CI/CD 파이프라인 구축

- Jenkins, GitLab CI 등을 이용한 CI/CD 파이프라인 구축
- 키워드: 쿠버네티스 CI/CD, Kubernetes Jenkins


서론


쿠버네티스(Kubernetes)는 컨테이너화된 애플리케이션의 배포, 확장 및 관리를 자동화하는 강력한 플랫폼입니다. 이러한 기능을 극대화하려면 CI/CD(Continuous Integration and Continuous Deployment) 파이프라인을 구축하여 코드 변경이 자동으로 빌드, 테스트, 배포되도록 설정하는 것이 중요합니다. CI/CD 파이프라인을 통해 개발 속도를 높이고, 코드 품질을 향상시키며, 배포를 자동화할 수 있습니다. 이번 포스팅에서는 Jenkins와 GitLab CI를 사용하여 쿠버네티스 클러스터에서 CI/CD 파이프라인을 구축하는 방법을 초보자도 이해할 수 있도록 자세히 설명합니다.


본론


CI/CD 개념


CI(Continuous Integration)


CI는 개발자가 코드를 자주 통합하여 코드 변경 사항을 자동으로 빌드하고 테스트하는 프로세스입니다. 이를 통해 코드 변경이 지속적으로 검증되어 코드 품질을 유지할 수 있습니다.


CD(Continuous Deployment)


CD는 코드 변경 사항이 자동으로 배포되는 프로세스입니다. CI와 함께 사용하여 코드 변경이 테스트를 통과하면 자동으로 프로덕션 환경에 배포되도록 설정할 수 있습니다. 이를 통해 배포 속도를 높이고, 사람의 개입 없이 안정적인 배포를 할 수 있습니다.


Jenkins를 이용한 CI/CD 파이프라인 구축


Jenkins란?


Jenkins는 오픈 소스 자동화 서버로, 다양한 빌드 및 배포 작업을 자동화할 수 있습니다. 플러그인 기반 아키텍처를 가지고 있어 다양한 도구와 통합할 수 있습니다.


Jenkins 설치


쿠버네티스 클러스터에 Jenkins를 설치하기 위해 Helm을 사용합니다.


  1. Helm 설치

Helm이 설치되어 있지 않다면 다음 명령어를 사용하여 Helm을 설치합니다.


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

  1. Jenkins 설치

Helm을 사용하여 Jenkins를 설치합니다.


helm repo add jenkinsci https://charts.jenkins.io
helm repo update
helm install jenkins jenkinsci/jenkins

  1. Jenkins 초기 설정

Jenkins 설치가 완료되면 Jenkins에 접근하여 초기 설정을 진행합니다. Jenkins 서비스에 포트 포워딩을 설정합니다.


kubectl port-forward svc/jenkins 8080:8080

웹 브라우저에서 http://localhost:8080에 접속하여 초기 관리자 암호를 입력합니다. 암호는 다음 명령어를 통해 확인할 수 있습니다.


kubectl exec --namespace default -it svc/jenkins -c jenkins -- /bin/cat /run/secrets/chart-admin-password && echo

Jenkins 파이프라인 설정


  1. Jenkins 파이프라인 플러그인 설치

Jenkins 대시보드에서 "Manage Jenkins" → "Manage Plugins"로 이동하여 "Pipeline" 플러그인을 설치합니다.


  1. 파이프라인 생성

Jenkins 대시보드에서 "New Item"을 클릭하고, "Pipeline"을 선택하여 새로운 파이프라인을 생성합니다.


  1. 파이프라인 스크립트 작성

다음은 Jenkins 파이프라인 스크립트 예시입니다. 이 스크립트는 코드 변경이 발생하면 빌드하고, Docker 이미지를 생성하여 쿠버네티스 클러스터에 배포합니다.


pipeline {
    agent any

    environment {
        registry = "myregistry"
        registryCredential = 'dockerhub'
        dockerImage = ''
    }

    stages {
        stage('Clone') {
            steps {
                git 'https://github.com/myrepo/myapp.git'
            }
        }
        stage('Build') {
            steps {
                script {
                    dockerImage = docker.build registry + ":$BUILD_NUMBER"
                }
            }
        }
        stage('Test') {
            steps {
                sh 'docker run --rm myregistry/myapp:$BUILD_NUMBER ./run_tests.sh'
            }
        }
        stage('Push') {
            steps {
                script {
                    docker.withRegistry( '', registryCredential ) {
                        dockerImage.push()
                    }
                }
            }
        }
        stage('Deploy') {
            steps {
                sh 'kubectl apply -f k8s/deployment.yaml'
            }
        }
    }
}

GitLab CI를 이용한 CI/CD 파이프라인 구축


GitLab CI란?


GitLab CI는 GitLab에서 제공하는 내장 CI/CD 도구로, GitLab 저장소에 변경 사항이 발생할 때 자동으로 빌드, 테스트, 배포할 수 있습니다. GitLab Runner를 사용하여 파이프라인 작업을 실행합니다.


GitLab Runner 설치


쿠버네티스 클러스터에 GitLab Runner를 설치하기 위해 Helm을 사용합니다.


  1. GitLab Runner 설치

Helm을 사용하여 GitLab Runner를 설치합니다.


helm repo add gitlab https://charts.gitlab.io
helm repo update
helm install --namespace gitlab-runner gitlab-runner gitlab/gitlab-runner

  1. GitLab Runner 등록

GitLab에서 Runner를 등록합니다. GitLab 프로젝트의 "Settings" → "CI/CD" → "Runners"에서 등록 토큰을 확인합니다. 다음 명령어를 사용하여 Runner를 등록합니다.


kubectl exec -it $(kubectl get pods --namespace gitlab-runner -l app=gitlab-runner -o jsonpath="{.items[0].metadata.name}") -- gitlab-runner register

GitLab CI 파이프라인 설정


  1. .gitlab-ci.yml 파일 작성

다음은 GitLab CI 파이프라인 설정 파일 예시입니다. 이 파일은 코드 변경이 발생하면 빌드하고, Docker 이미지를 생성하여 쿠버네티스 클러스터에 배포합니다.


stages:
  - build
  - test
  - deploy

variables:
  DOCKER_DRIVER: overlay2

before_script:
  - docker info

build:
  stage: build
  script:
    - docker build -t myregistry/myapp:$CI_COMMIT_REF_NAME .
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    - docker push myregistry/myapp:$CI_COMMIT_REF_NAME

test:
  stage: test
  script:
    - docker run --rm myregistry/myapp:$CI_COMMIT_REF_NAME ./run_tests.sh

deploy:
  stage: deploy
  script:
    - kubectl apply -f k8s/deployment.yaml

이 파일을 GitLab 저장소의 루트 디렉토리에 저장합니다.


  1. 파이프라인 실행

코드 변경 사항을 푸시하면 GitLab CI 파이프라인이 자동으로 실행됩니다. GitLab 프로젝트의 "CI / CD" → "Pipelines"에서 파이프라인 상태를 확인할 수 있습니다.


CI/CD 파이프라인 모니터링 및 관리


파이프라인 모니터링


Jenkins와 GitLab CI 모두 파이프라인의 실행 상태를 실시간으로 모니터링할 수 있는 기능을 제공합니다. Jenkins 대시보드와 GitLab 프로젝트의 "Pipelines" 페이지에서 각 파이프라인의 실행 로그를 확인할 수 있습니다.


파이프라인 최적화


효율적인 CI/CD 파이프라인을 유지하기 위해 다음과 같은 최적화 전략을 사용할 수 있습니다.


  1. 캐싱: 빌드 시간 단축을 위해 Docker 레이어 캐싱을 활용합니다.
  2. 병렬 처리: 병렬 작업을 통해 파이프라인 실행 시간을 단축합니다.
  3. 리소스 할당: 파이프라인 실행 시 필요한 리소스를 적절히 할당하여 성능을 최적화합니다.

결론


쿠버네티스에서 CI/CD 파이프라인을 구축하는 것은 코드 변경이 자동으로 빌드, 테스트, 배포되도록 하여 개발 속도를 높이고 코드 품질을 향상시키는 데 중요한 역할을 합니다. 이번 포스팅에서는 Jenkins와 GitLab CI를 사용하여 CI/CD 파이프라인을 구축하는 방법을 자세히 설명했습니다. 이를 통해 쿠버네티스 클러스터에서 효율적인 CI/CD 파이프라인을 설정하고 관리할 수 있기를 바랍니다.

다음 이전