Jenkins와 Docker/Kubernetes 연동

Jenkins와 Docker/Kubernetes 연동

7️⃣ Jenkins와 Docker/Kubernetes 연동

1. Docker 기반 Jenkins 실행 및 관리

Jenkins는 Docker와 쉽게 통합되어 Docker 컨테이너 내에서 Jenkins를 실행할 수 있습니다. 이를 통해 Jenkins 인프라를 간편하게 관리하고 확장할 수 있습니다. Docker를 활용하면 Jenkins 서버와 에이전트를 컨테이너로 배포하여 빠르게 환경을 구축할 수 있습니다.

1.1. Docker로 Jenkins 실행

Docker를 사용하여 Jenkins를 실행하려면 Docker 이미지를 다운로드하고 실행할 수 있습니다. 아래는 Jenkins의 공식 Docker 이미지를 사용하여 Jenkins를 실행하는 방법입니다.

docker pull jenkins/jenkins:lts
docker run -d -p 8080:8080 -p 50000:50000 --name jenkins jenkins/jenkins:lts

이 명령어는 Jenkins를 Docker 컨테이너로 실행하며, 8080 포트와 50000 포트를 개방하여 Jenkins UI와 에이전트 연결을 가능하게 합니다.

1.2. Jenkins와 Docker 연동 설정

Jenkins 내부에서 Docker를 사용할 수 있도록 Docker Plugin을 설치해야 합니다. Docker Plugin을 통해 Jenkins는 Docker 컨테이너 내에서 빌드를 실행하거나 Docker 이미지를 빌드할 수 있습니다.

docker.build("my-image")

그림: Docker로 실행된 Jenkins UI

Docker로 실행된 Jenkins

2. Jenkins에서 Docker 컨테이너를 사용한 빌드

Jenkins에서 Docker를 사용하여 빌드를 수행할 수 있습니다. Docker 컨테이너를 빌드, 테스트, 배포하는 과정은 Jenkins 파이프라인에서 Docker를 활용하여 자동화할 수 있습니다.

2.1. Docker를 이용한 빌드 예시

pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                script {
                    docker.build('my-docker-image')
                }
            }
        }
    }
}

위의 예시는 Jenkins에서 Docker를 사용하여 이미지를 빌드하는 방법을 보여줍니다. docker.build() 명령어를 통해 Docker 이미지를 생성하고 Jenkins가 이를 실행합니다.

2.2. Docker 에이전트 사용

Jenkins에서 Docker 컨테이너를 에이전트로 사용할 수 있습니다. 이를 통해 Jenkins의 빌드 및 테스트가 Docker 환경에서 실행되도록 할 수 있습니다. Docker 에이전트를 사용하는 방법은 다음과 같습니다.

pipeline {
    agent {
        docker {
            image 'maven:3-alpine'
            label 'docker-agent'
        }
    }
    stages {
        stage('Build') {
            steps {
                sh 'mvn clean install'
            }
        }
    }
}

그림: Docker 컨테이너에서 빌드 실행

Docker에서 빌드 실행

3. Jenkins에서 Kubernetes Pod를 Agent로 사용하는 방법

Jenkins는 Kubernetes와 연동하여 Kubernetes Pod를 동적 에이전트로 사용할 수 있습니다. 이를 통해 Jenkins는 Kubernetes 클러스터 내에서 필요할 때마다 Pod를 생성하여 빌드 작업을 분산 처리할 수 있습니다.

3.1. Kubernetes Plugin 설치

Jenkins에서 Kubernetes를 사용하려면 Kubernetes Plugin을 설치해야 합니다. 설치 후 Kubernetes 클러스터를 Jenkins에 연결하여 Jenkins가 Kubernetes 환경에서 Pod를 동적으로 생성할 수 있도록 설정합니다.

3.2. Kubernetes에서 에이전트 자동 생성

Jenkins는 Kubernetes 클러스터에서 에이전트를 동적으로 생성하여 작업을 실행할 수 있습니다. 아래는 Kubernetes에서 Jenkins 에이전트를 자동으로 생성하는 예시입니다.

pipeline {
    agent {
        kubernetes {
            label 'jenkins-agent'
            defaultContainer 'jnlp'
        }
    }
    stages {
        stage('Build') {
            steps {
                container('maven') {
                    sh 'mvn clean install'
                }
            }
        }
    }
}

위의 예시는 Kubernetes 클러스터에서 jnlp라는 기본 컨테이너를 사용하여 Jenkins 빌드를 실행하는 방법을 보여줍니다.

그림: Kubernetes에서 Jenkins 에이전트 생성

Kubernetes에서 Jenkins 에이전트 생성

4. Kubernetes Plugin을 활용한 동적 Jenkins Agent 생성

Jenkins는 Kubernetes Plugin을 활용하여 클러스터 내에서 동적으로 Jenkins 에이전트를 생성할 수 있습니다. Kubernetes 클러스터의 리소스를 효율적으로 사용하고, 필요할 때마다 에이전트를 자동으로 생성하여 빌드를 실행할 수 있습니다.

4.1. Kubernetes Plugin 설정

  1. Kubernetes 클러스터 연결: Jenkins 대시보드에서 Manage Jenkins -> Configure System으로 이동하여 Kubernetes 클러스터를 설정합니다.
  2. Pod Template 설정: Jenkins 에이전트를 실행할 Kubernetes Pod 템플릿을 설정하여, 빌드에 필요한 컨테이너들을 정의합니다.

예시: Pod Template 설정

kubernetes {
    label 'jenkins-agent'
    defaultContainer 'jnlp'
    containers {
        containerTemplate(name: 'maven', image: 'maven:3-alpine', ttyEnabled: true, command: 'cat')
    }
}

그림: Kubernetes 에이전트 설정 화면

Kubernetes 에이전트 설정

5. Jenkins와 Helm을 이용한 Kubernetes 배포 자동화

Jenkins는 Helm을 사용하여 Kubernetes 클러스터에 배포를 자동화할 수 있습니다. Helm 차트를 사용하여 애플리케이션 배포를 정의하고 Jenkins 파이프라인에서 이를 자동으로 실행할 수 있습니다.

5.1. Helm을 이용한 Kubernetes 배포 예시

pipeline {
    agent any
    stages {
        stage('Deploy') {
            steps {
                script {
                    sh 'helm upgrade --install my-app ./charts/my-app'
                }
            }
        }
    }
}

위 예시에서는 Jenkins 파이프라인을 사용하여 Helm 차트를 통해 Kubernetes에 애플리케이션을 배포하는 방법을 보여줍니다.

그림: Helm을 통한 Kubernetes 배포

Helm 배포

6. Jenkins + ArgoCD를 활용한 GitOps 구축

GitOps는 Git을 단일 진리의 원천으로 사용하여 배포 및 관리를 자동화하는 방법론입니다. Jenkins와 ArgoCD를 결합하면 GitOps 흐름을 구축하여, 코드 변경 시 자동으로 Kubernetes에 배포를 실행할 수 있습니다.

6.1. Jenkins와 ArgoCD 연동

Jenkins에서 빌드된 Docker 이미지를 Git 리포지토리에 푸시한 후, ArgoCD는 해당 Git 리포지토리의 변화를 감지하고 Kubernetes 클러스터에 자동으로 배포를 수행합니다.

예시: Jenkins와 ArgoCD 연동

pipeline {
    agent any
    stages {
        stage('Push to Git') {
            steps {
                script {
                    // Docker 이미지 푸시
                    sh 'docker push my-docker-image'
                }
            }
        }
        stage('Notify ArgoCD') {
            steps {
                script {
                    // ArgoCD API를 호출하여 배포를 트리거
                    sh 'curl -X POST http://argocd-server/api/v1/applications/my-app/sync'
                }
            }
        }
    }
}

그림: Jenkins와 ArgoCD 연동 흐름

Jenkins와 ArgoCD 연동


Jenkins와 Docker, Kubernetes를 연동하면 CI/CD 파이프라인을 더욱 효율적이고 확장 가능한 형태로 구축할 수 있습니다. Jenkins는 Docker와 Kubernetes의 유연성을 이용하여 다양한 배포 환경을 지원하고, Helm과 ArgoCD를 통해 배포 자동화 및 GitOps 방식을 쉽게 구현할 수 있습니다.

RSS Feed