본문 바로가기

Spring

Spring Boot 애플리케이션을 Kubernetes에 완벽하게 배포하는 방법: Helm과 Spring Cloud Kubernetes를 활용한 실전 가이드

728x90
반응형

클라우드 네이티브 환경에서 애플리케이션을 운영하는 데 있어 Kubernetes(K8s)는 가장 널리 사용되는 오케스트레이션 도구입니다. 이 글에서는 Spring Boot 애플리케이션을 Kubernetes 환경에 배포하는 방법과 함께, Helm을 통한 구성 관리, 그리고 Spring Cloud Kubernetes를 활용한 서비스 디스커버리 및 설정 관리에 대해 다루겠습니다. 이를 통해 Kubernetes 환경에서 Spring Boot 애플리케이션의 클라우드 네이티브 기능을 확장하는 방법을 알아보겠습니다.

1. Spring Boot 애플리케이션을 Kubernetes에 배포하기

Kubernetes 환경에 Spring Boot 애플리케이션을 배포하는 첫 번째 단계는 컨테이너화입니다. Spring Boot는 자체적으로 Java 애플리케이션을 쉽게 컨테이너로 만들 수 있도록 돕는 기능을 제공하며, 일반적으로 Docker 이미지를 사용합니다.

1.1. Dockerfile 작성

먼저, Gradle 기반의 Spring Boot 애플리케이션을 위한 Dockerfile을 작성합니다.

# 베이스 이미지
FROM eclipse-temurin:17-jdk-alpine

# 작업 디렉토리 설정
WORKDIR /app

# 의존성 파일 복사 및 캐싱
COPY build.gradle.kts settings.gradle.kts gradlew /app/
COPY gradle /app/gradle
RUN ./gradlew build || return 0

# 애플리케이션 빌드 및 복사
COPY . /app
RUN ./gradlew build

# 애플리케이션 실행
ENTRYPOINT ["java", "-jar", "build/libs/demo-0.0.1-SNAPSHOT.jar"]

이 Dockerfile을 통해 Spring Boot 애플리케이션을 컨테이너화하고, 이를 Kubernetes 클러스터에 배포할 준비를 마칩니다.

1.2. Kubernetes 배포 매니페스트

이제 Kubernetes에 배포하기 위한 매니페스트 파일을 생성합니다. 여기에는 Deployment와 Service 리소스를 포함합니다.

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-boot-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: spring-boot-app
  template:
    metadata:
      labels:
        app: spring-boot-app
    spec:
      containers:
        - name: spring-boot-container
          image: my-repo/spring-boot-app:latest
          ports:
            - containerPort: 8080
---
# service.yaml
apiVersion: v1
kind: Service
metadata:
  name: spring-boot-service
spec:
  selector:
    app: spring-boot-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: LoadBalancer

이 파일을 통해 Kubernetes 클러스터에 애플리케이션을 배포할 수 있습니다.

kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
반응형

2. Helm을 사용한 Kubernetes 구성 관리

Kubernetes의 복잡한 구성 관리를 쉽게 할 수 있도록 Helm을 사용하여 배포를 관리할 수 있습니다. Helm은 템플릿을 활용해 더 유연한 배포를 가능하게 합니다.

2.1. Helm Chart 생성

Helm Chart를 통해 Kubernetes 리소스를 관리할 수 있습니다.

helm create spring-boot-chart

values.yaml 파일에서 애플리케이션의 설정을 관리할 수 있습니다.

# values.yaml
replicaCount: 3

image:
  repository: my-repo/spring-boot-app
  tag: "latest"

service:
  type: LoadBalancer
  port: 80

Helm을 사용하면 설정 파일을 재사용 가능하고 환경별로 쉽게 커스터마이징할 수 있습니다.

2.2. Helm을 사용한 배포

Helm을 통해 Spring Boot 애플리케이션을 배포합니다.

helm install spring-boot-release ./spring-boot-chart

values.yaml을 커스터마이징하여 배포 환경에 맞는 설정을 할 수 있습니다.

3. Spring Cloud Kubernetes로 클라우드 네이티브 확장

Spring Cloud Kubernetes는 Spring Boot 애플리케이션을 Kubernetes 클러스터에서 실행할 때 유용한 기능을 제공합니다. 서비스 디스커버리, 설정 관리, 그리고 로드 밸런싱과 같은 클라우드 네이티브 기능을 쉽게 적용할 수 있습니다.

3.1. Gradle 설정

Spring Cloud Kubernetes를 프로젝트에 추가하려면 의존성을 추가해야 합니다.

// build.gradle.kts
dependencies {
    implementation("org.springframework.cloud:spring-cloud-starter-kubernetes-client-config")
    implementation("org.springframework.cloud:spring-cloud-starter-kubernetes-client-discovery")
}

3.2. ConfigMap을 활용한 설정 관리

Kubernetes의 ConfigMap을 사용하여 외부 설정을 Spring Boot 애플리케이션에 주입할 수 있습니다.

# configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: spring-boot-config
data:
  application.properties: |
    message=Hello from Kubernetes ConfigMap!

이 ConfigMap을 사용하여 Spring Boot 애플리케이션에서 외부 설정을 로드할 수 있습니다.

@RestController
public class MessageController {

    @Value("${message}")
    private String message;

    @GetMapping("/message")
    public String getMessage() {
        return message;
    }
}

3.3. 서비스 디스커버리

Spring Cloud Kubernetes를 사용하여 Kubernetes 환경에서의 서비스 디스커버리 기능을 활용할 수 있습니다

# deployment.yaml에 annotations 추가
metadata:
  annotations:
    spring.cloud.kubernetes.discovery.enabled: "true"

이렇게 하면 애플리케이션이 Kubernetes 클러스터 내에서 다른 서비스와의 통신을 쉽게 관리할 수 있게 됩니다.

728x90

이번 글에서는 Spring Boot 애플리케이션을 Kubernetes에 배포하는 방법과 함께, Helm을 사용한 구성 관리, 그리고 Spring Cloud Kubernetes를 통해 서비스 디스커버리 및 설정 관리 기능을 사용하는 방법에 대해 알아보았습니다. 이러한 기술들을 적절히 사용하면 Kubernetes 클러스터에서 Spring Boot 애플리케이션의 클라우드 네이티브 기능을 극대화할 수 있습니다.

728x90
반응형