DevOps와 클라우드는 최근 IT 업계에서 빠르게 성장하고 있는 분야입니다. 특히 CI/CD(지속적 통합 및 지속적 배포) 환경에서의 무중단 배포는 애플리케이션의 가용성과 사용자 경험을 극대화하는 데 중요한 역할을 합니다. 이 글에서는 CI/CD 환경에서 무중단 배포를 실습하는 방법을 단계별로 안내하겠습니다.

CI/CD 환경 구축

우선, CI/CD 환경을 구축하기 위해 필요한 도구들을 소개하겠습니다. 일반적으로 Jenkins, GitLab CI, CircleCI, Travis CI와 같은 도구가 사용됩니다. 여기서는 Jenkins를 사용하여 무중단 배포를 구현하는 방법을 설명하겠습니다.

1. Jenkins 설치하기

Jenkins를 설치하려면 다음과 같은 명령어를 사용할 수 있습니다. Ubuntu를 기준으로 합니다.

sudo apt update
sudo apt install openjdk-11-jdk
wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add -
sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ >> /etc/apt/sources.list.d/jenkins.list'
sudo apt update
sudo apt install jenkins

설치가 완료되면 Jenkins를 시작합니다.

sudo systemctl start jenkins
sudo systemctl enable jenkins

웹 브라우저를 열고 http://localhost:8080에 접속하여 초기 설정을 완료합니다.

2. GitHub와 Jenkins 연동하기

Jenkins에서 GitHub 리포지토리를 빌드하기 위해서는 GitHub 플러그인을 설치해야 합니다.

  • Jenkins 대시보드에서 Manage Jenkins > Manage Plugins에 들어갑니다.
  • Available 탭에서 GitHub 플러그인을 검색하고 설치합니다.

설치가 완료되면 Jenkins의 대시보드로 돌아가 GitHub 리포지토리를 불러옵니다.

3. 파이프라인 설정하기

Jenkins에서 새로운 파이프라인을 생성합니다.

  1. Jenkins 대시보드에서 New Item을 클릭합니다.
  2. Pipeline을 선택하고, 이름을 입력한 후 OK를 클릭합니다.
  3. Pipeline 탭에서 다음과 같은 스크립트를 작성합니다.
pipeline {
    agent any 
    stages {
        stage('Build') {
            steps {
                echo 'Building..'
                sh 'mvn clean package' // Maven을 사용하는 경우
            }
        }
        stage('Deploy') {
            steps {
                echo 'Deploying..'
                sh 'ssh user@server "docker pull myapp:latest && docker run -d -p 80:8080 myapp:latest"'
            }
        }
    }
    post {
        always {
            echo 'Cleaning up..'
            sh 'docker system prune -f'
        }
    }
}

이 파이프라인은 Build 단계에서 애플리케이션을 빌드하고, Deploy 단계에서 서버에 배포합니다. SSH를 사용하여 원격 서버에 접근하고 Docker를 사용해 애플리케이션을 실행합니다.

무중단 배포 구현하기

무중단 배포를 위해서는 기존 애플리케이션을 중단하지 않고 새로운 버전을 배포할 수 있는 전략이 필요합니다. 일반적으로 Blue-Green 배포 방식이나 Canary 배포 방식을 사용합니다. 이 글에서는 Blue-Green 배포 방식을 예로 설명합니다.

1. Blue-Green 배포 환경 설정

두 개의 환경(Blue와 Green)을 준비합니다. 현재 운영 중인 환경이 Blue라고 가정하겠습니다. 새로운 버전의 애플리케이션을 Green 환경에 배포한 후, 트래픽을 Green으로 전환합니다.

2. Jenkins 파이프라인 수정하기

위의 Jenkins 파이프라인을 수정하여 Blue-Green 배포를 구현합니다. 다음과 같이 Deploy 단계의 스크립트를 수정합니다.

stage('Deploy') {
    steps {
        script {
            def currentEnv = sh(script: 'kubectl get svc myapp -o jsonpath="{.spec.selector.version}"', returnStdout: true).trim()
            def newEnv = currentEnv == 'blue' ? 'green' : 'blue'

            echo "Deploying to ${newEnv} environment"
            sh "kubectl set image deployment/myapp myapp=myapp:${env.BUILD_ID} --record"
            sh "kubectl patch service myapp -p '{\"spec\":{\"selector\":{\"version\":\"${newEnv}\"}}}'"
        }
    }
}

이 스크립트는 Kubernetes에서 현재 환경을 확인하고 새로운 환경으로 이미지를 배포한 후, 서비스의 버전을 새 환경으로 전환합니다.

마무리

무중단 배포는 사용자에게 중단 없는 서비스를 제공하며, CI/CD 환경에서 필수적인 도구입니다. Jenkins를 사용하여 쉽게 설정할 수 있으며, Blue-Green 배포 방식 같은 전략을 도입함으로써 애플리케이션의 가용성을 극대화할 수 있습니다. 위에서 설명한 내용을 바탕으로 CI/CD 환경을 구축하고 무중단 배포를 실습해 보세요. DevOps의 세계로 한 걸음 더 나아가는 계기가 되길 바랍니다!