클라우드 네이티브 환경에서 애플리케이션을 운영하는 데 있어 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 클러스터 내에서 다른 서비스와의 통신을 쉽게 관리할 수 있게 됩니다.
이번 글에서는 Spring Boot 애플리케이션을 Kubernetes에 배포하는 방법과 함께, Helm을 사용한 구성 관리, 그리고 Spring Cloud Kubernetes를 통해 서비스 디스커버리 및 설정 관리 기능을 사용하는 방법에 대해 알아보았습니다. 이러한 기술들을 적절히 사용하면 Kubernetes 클러스터에서 Spring Boot 애플리케이션의 클라우드 네이티브 기능을 극대화할 수 있습니다.
'Spring' 카테고리의 다른 글
Spring AI 🤖: 자바 개발자를 위한 인공지능 통합의 새로운 패러다임 (0) | 2024.09.13 |
---|---|
Spring Cloud Kubernetes로 클라우드 네이티브 애플리케이션 만들기: 주요 기능과 도입 장점 (0) | 2024.09.10 |
Spring Boot에서 Custom Annotation으로 코드를 더욱 우아하게 관리하는 방법 (0) | 2024.09.10 |
Spring Boot AOT 컴파일: 성능 최적화의 새로운 패러다임 (0) | 2024.09.10 |
비동기 데이터베이스 혁신, Spring R2DBC로 고성능 애플리케이션 만들기 (0) | 2024.09.09 |