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
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 컨테이너에서 빌드 실행
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 에이전트 생성
4. Kubernetes Plugin을 활용한 동적 Jenkins Agent 생성
Jenkins는 Kubernetes Plugin을 활용하여 클러스터 내에서 동적으로 Jenkins 에이전트를 생성할 수 있습니다. Kubernetes 클러스터의 리소스를 효율적으로 사용하고, 필요할 때마다 에이전트를 자동으로 생성하여 빌드를 실행할 수 있습니다.
4.1. Kubernetes Plugin 설정
- Kubernetes 클러스터 연결: Jenkins 대시보드에서
Manage Jenkins
->Configure System
으로 이동하여 Kubernetes 클러스터를 설정합니다. - 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 에이전트 설정 화면
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 배포
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와 Docker, Kubernetes를 연동하면 CI/CD 파이프라인을 더욱 효율적이고 확장 가능한 형태로 구축할 수 있습니다. Jenkins는 Docker와 Kubernetes의 유연성을 이용하여 다양한 배포 환경을 지원하고, Helm과 ArgoCD를 통해 배포 자동화 및 GitOps 방식을 쉽게 구현할 수 있습니다.