Java/Spring 개발자가 알아야 할 Kubernetes 배포 전략

웹 서비스를 운영하다 보면 애플리케이션을 업데이트해야 하는 상황이 자주 발생합니다.
하지만 서비스 중단 없이 배포하는 것은 항상 어려운 문제였습니다.

전통적인 Java 서버 환경에서는 다음과 같은 방식으로 배포했습니다.

 
빌드

서버 접속

애플리케이션 재시작
 

이 방식은 배포 중에 서비스가 잠시 중단되는 문제가 있습니다.

Kubernetes에서는 Rolling Update 전략을 사용하여 무중단 배포를 구현할 수 있습니다.


1. 전통적인 배포 방식의 문제

기존 Java 웹 애플리케이션 배포 구조는 다음과 같습니다.

 
Server
└ Tomcat
└ application.war
 

배포 과정

 
새 버전 배포

Tomcat 재시작

서비스 중단
 

이 방식은 다음과 같은 문제가 있습니다.

  • 서비스 중단
  • 사용자 요청 실패
  • 배포 리스크 증가

특히 트래픽이 많은 서비스에서는 문제가 더욱 커집니다.


2. Kubernetes의 Rolling Update 개념

Kubernetes에서는 애플리케이션을 Pod 단위로 실행합니다.

구조

 
Deployment

ReplicaSet

Pod
 

Rolling Update는 기존 Pod을 하나씩 새로운 Pod으로 교체하는 방식입니다.

예를 들어 다음과 같은 상황을 가정해 보겠습니다.

현재 상태

 
Pod1 (v1)
Pod2 (v1)
Pod3 (v1)
 

새 버전 배포

 
Pod1 (v2)
Pod2 (v1)
Pod3 (v1)
 

다음 단계

 
Pod1 (v2)
Pod2 (v2)
Pod3 (v1)
 

마지막

 
Pod1 (v2)
Pod2 (v2)
Pod3 (v2)
 

이 과정에서 서비스는 계속 유지됩니다.


3. Spring Boot 애플리케이션 배포 구조

Spring Boot 애플리케이션을 Kubernetes에서 운영할 때 일반적인 구조는 다음과 같습니다.

 
Client

Service

Pod1
Pod2
Pod3
 

Service는 로드밸런싱 역할을 합니다.

즉 새로운 Pod이 준비되면 자동으로 트래픽이 분산됩니다.


4. Rolling Update Deployment 설정

Kubernetes에서는 Deployment 설정을 통해 Rolling Update를 구성할 수 있습니다.

예시

 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-app
spec:
  replicas: 3
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
      maxSurge: 1
  selector:
    matchLabels:
      app: spring-app
  template:
    metadata:
      labels:
        app: spring-app
    spec:
      containers:
      - name: spring-app
        image: spring-app:v2
        ports:
        - containerPort: 8080

 

설정 설명

  • maxUnavailable
    동시에 중지될 수 있는 Pod 수
  • maxSurge
    동시에 추가로 생성되는 Pod 수

이 설정을 통해 서비스 중단 없이 배포가 진행됩니다.


5. Rolling Update 동작 과정

Spring Boot 애플리케이션 배포 과정은 다음과 같습니다.

1. 새로운 Pod 생성
2. Pod 준비 상태 확인
3. 트래픽 연결
4. 기존 Pod 종료

 

이 과정에서 중요한 요소는 Readiness Probe입니다.


6. Readiness Probe 설정

Readiness Probe는 애플리케이션이 트래픽을 받을 준비가 되었는지 확인합니다.

Spring Boot에서는 보통 Actuator health endpoint를 사용합니다.

readinessProbe:
  httpGet:
    path: /actuator/health
    port: 8080
  initialDelaySeconds: 10
  periodSeconds: 5

 

동작 방식

Pod 생성
 ↓
애플리케이션 시작
 ↓
/actuator/health 확인
 ↓
Service 연결

 

즉 준비되지 않은 Pod에는 트래픽이 전달되지 않습니다.


7. 무중단 배포 구조

Spring Boot + Kubernetes 무중단 배포 구조는 다음과 같습니다.

 
Client

Service

Pod(v1)
Pod(v1)
Pod(v1)
 

배포 시작

 
Pod(v2)
Pod(v1)
Pod(v1)
 

완료

 
Pod(v2)
Pod(v2)
Pod(v2)
 

사용자는 서비스 중단을 느끼지 못합니다.


8. 실제 운영에서의 추가 구성

실제 운영 환경에서는 다음 요소도 함께 구성합니다.

Liveness Probe

애플리케이션 장애 감지

 
Pod Crash

자동 재시작
 

HPA (Horizontal Pod Autoscaler)

트래픽 증가 시 Pod 자동 확장

 
CPU 증가

Pod 자동 증가
 

결론

Kubernetes의 Rolling Update는 서비스 중단 없이 애플리케이션을 배포할 수 있는 강력한 기능입니다.

Spring Boot 애플리케이션을 Kubernetes에서 운영하면 다음과 같은 장점을 얻을 수 있습니다.

  • 무중단 배포
  • 자동 복구
  • 자동 확장
  • 안정적인 운영

Java/Spring 개발자가 Kubernetes 배포 전략을 이해하면 클라우드 네이티브 환경에서 안정적인 서비스 운영이 가능해집니다.

 

 

 

LIST

+ Recent posts