Java/Spring 개발자를 위한 Kubernetes 기반 자동 배포 구조

현대적인 백엔드 시스템에서는 코드 변경부터 서비스 배포까지 자동화된 파이프라인이 중요합니다.
특히 Spring Boot 애플리케이션을 Kubernetes 환경에서 운영할 때는 CI/CD 파이프라인을 통해 배포를 자동화할 수 있습니다.

이번 글에서는 Spring Boot 애플리케이션을 Kubernetes에 배포하는 CI/CD 구조를 개발자 관점에서 정리해 보겠습니다.


1. CI/CD란 무엇인가

CI/CD는 애플리케이션 개발과 배포를 자동화하는 개발 방식입니다.

CI (Continuous Integration)

코드 변경이 발생할 때마다 자동으로

  • 빌드
  • 테스트
  • 검증

을 수행합니다.

 
Git Push

Build

Test
 

CD (Continuous Deployment)

빌드된 애플리케이션을 자동으로 배포합니다.

 
Build 완료

Docker Image 생성

Kubernetes 배포
 

이 과정을 통해 개발자가 직접 서버에 접속하지 않아도 배포가 가능합니다.


2. Spring Boot + Kubernetes CI/CD 전체 구조

Spring Boot 애플리케이션의 CI/CD 파이프라인은 보통 다음과 같은 구조를 가집니다.

 
Developer

Git Repository

CI Pipeline

Docker Image Build

Container Registry

CD Pipeline

Kubernetes Deploy
 

구체적인 흐름

 
코드 작성

Git Push

빌드 & 테스트

Docker 이미지 생성

이미지 저장

Kubernetes 배포
 

3. Spring Boot 애플리케이션 빌드

Spring Boot 애플리케이션은 보통 Gradle 또는 Maven을 사용합니다.

Gradle 예

 
./gradlew build
 

빌드 결과

 
build/libs/app.jar
 

Spring Boot 애플리케이션은 Fat Jar 형태로 패키징됩니다.


4. Docker 이미지 생성

빌드된 Spring Boot 애플리케이션을 Docker 이미지로 생성합니다.

예시 Dockerfile

 
FROM openjdk:17-jdk-slim

WORKDIR /app

COPY build/libs/app.jar app.jar

ENTRYPOINT ["java", "-jar", "app.jar"]
 

이미지 빌드

 
docker build -t spring-app:1.0 .
 

이 이미지는 Kubernetes에서 실행됩니다.


5. Container Registry 저장

Docker 이미지는 Container Registry에 저장합니다.

대표적인 Registry

  • Docker Hub
  • AWS ECR
  • Google Artifact Registry
  • GitHub Container Registry

이미지 업로드

 
docker push myrepo/spring-app:1.0
 

이렇게 저장된 이미지를 Kubernetes에서 가져옵니다.


6. Kubernetes Deployment 배포

Kubernetes에서는 Deployment를 통해 애플리케이션을 실행합니다.

예시

 
apiVersion: apps/v1
kind: Deployment
metadata:
name: spring-app
spec:
replicas: 3
selector:
matchLabels:
app: spring-app
template:
metadata:
labels:
app: spring-app
spec:
containers:
- name: spring-app
image: myrepo/spring-app:1.0
ports:
- containerPort: 8080
 

이 설정은 다음을 의미합니다.

  • Spring Boot 애플리케이션 Pod 3개 실행
  • Docker 이미지 실행
  • 포트 8080 사용

7. GitHub Actions 기반 CI/CD 예시

Spring Boot 프로젝트에서 GitHub Actions를 사용할 수도 있습니다.

예시

 
name: Spring Boot CI/CD

on:
push:
branches: [ main ]

jobs:
build:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v3

- name: JDK 설정
uses: actions/setup-java@v3
with:
distribution: temurin
java-version: 17

- name: Gradle Build
run: ./gradlew build

- name: Docker Build
run: docker build -t myrepo/spring-app:latest .

- name: Docker Push
run: docker push myrepo/spring-app:latest
 

이 파이프라인은

 
코드 push

Gradle build

Docker build

Docker push
 

과정을 자동으로 수행합니다.


8. CD 단계 (Kubernetes 배포)

CD 단계에서는 Kubernetes에 새로운 이미지를 배포합니다.

대표적인 방법

  • kubectl apply
  • Helm
  • ArgoCD
  • GitOps

 
kubectl apply -f deployment.yaml
 

이 명령으로 Kubernetes에 새로운 애플리케이션이 배포됩니다.


9. GitOps 기반 배포 구조

최근 Kubernetes에서는 GitOps 방식이 많이 사용됩니다.

구조

 
Git Repository

ArgoCD

Kubernetes Cluster
 

배포 흐름

 
코드 변경

Docker 이미지 생성

GitOps Repository 업데이트

ArgoCD 자동 배포
 

이 방식은 Kubernetes 상태를 Git으로 관리합니다.


10. 전체 CI/CD 아키텍처

Spring Boot + Kubernetes CI/CD 전체 구조

 
Developer

Git Repository

CI Pipeline

Build & Test

Docker Image

Container Registry

CD Pipeline

Kubernetes Deployment
 

이 구조를 통해 자동화된 배포 시스템을 구축할 수 있습니다.


결론

Spring Boot 애플리케이션을 Kubernetes에서 운영할 때 CI/CD 파이프라인은 매우 중요한 역할을 합니다.

CI/CD 파이프라인을 구성하면

  • 자동 빌드
  • 자동 테스트
  • 자동 배포

가 가능해집니다.

이를 통해 개발자는 코드 개발에 집중하고 운영 부담을 줄일 수 있습니다.

Spring Boot + Docker + Kubernetes + CI/CD 구조는 현대적인 클라우드 네이티브 백엔드 시스템의 기본 아키텍처라고 할 수 있습니다.

LIST

+ Recent posts