쿠버네티스 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을 사용합니다.
- Helm 설치
Helm이 설치되어 있지 않다면 다음 명령어를 사용하여 Helm을 설치합니다.
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
- Jenkins 설치
Helm을 사용하여 Jenkins를 설치합니다.
helm repo add jenkinsci https://charts.jenkins.io
helm repo update
helm install jenkins jenkinsci/jenkins
- 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 파이프라인 설정
- Jenkins 파이프라인 플러그인 설치
Jenkins 대시보드에서 "Manage Jenkins" → "Manage Plugins"로 이동하여 "Pipeline" 플러그인을 설치합니다.
- 파이프라인 생성
Jenkins 대시보드에서 "New Item"을 클릭하고, "Pipeline"을 선택하여 새로운 파이프라인을 생성합니다.
- 파이프라인 스크립트 작성
다음은 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을 사용합니다.
- 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
- 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 파이프라인 설정
- .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 저장소의 루트 디렉토리에 저장합니다.
- 파이프라인 실행
코드 변경 사항을 푸시하면 GitLab CI 파이프라인이 자동으로 실행됩니다. GitLab 프로젝트의 "CI / CD" → "Pipelines"에서 파이프라인 상태를 확인할 수 있습니다.
CI/CD 파이프라인 모니터링 및 관리
파이프라인 모니터링
Jenkins와 GitLab CI 모두 파이프라인의 실행 상태를 실시간으로 모니터링할 수 있는 기능을 제공합니다. Jenkins 대시보드와 GitLab 프로젝트의 "Pipelines" 페이지에서 각 파이프라인의 실행 로그를 확인할 수 있습니다.
파이프라인 최적화
효율적인 CI/CD 파이프라인을 유지하기 위해 다음과 같은 최적화 전략을 사용할 수 있습니다.
- 캐싱: 빌드 시간 단축을 위해 Docker 레이어 캐싱을 활용합니다.
- 병렬 처리: 병렬 작업을 통해 파이프라인 실행 시간을 단축합니다.
- 리소스 할당: 파이프라인 실행 시 필요한 리소스를 적절히 할당하여 성능을 최적화합니다.
결론
쿠버네티스에서 CI/CD 파이프라인을 구축하는 것은 코드 변경이 자동으로 빌드, 테스트, 배포되도록 하여 개발 속도를 높이고 코드 품질을 향상시키는 데 중요한 역할을 합니다. 이번 포스팅에서는 Jenkins와 GitLab CI를 사용하여 CI/CD 파이프라인을 구축하는 방법을 자세히 설명했습니다. 이를 통해 쿠버네티스 클러스터에서 효율적인 CI/CD 파이프라인을 설정하고 관리할 수 있기를 바랍니다.