본문 바로가기

Spring

Spring Cloud Kubernetes로 클라우드 네이티브 애플리케이션 만들기: 주요 기능과 도입 장점

728x90
반응형

Kubernetes는 애플리케이션을 클라우드 네이티브 방식으로 배포하고 관리하는 데 널리 사용됩니다. 하지만 Spring Boot 애플리케이션을 Kubernetes 환경에 통합하는 것은 추가적인 작업이 필요할 수 있습니다. 이 문제를 해결하기 위해 등장한 것이 Spring Cloud Kubernetes입니다. Spring Cloud Kubernetes는 Spring Boot 애플리케이션을 Kubernetes 클러스터에 원활하게 통합하고, 서비스 디스커버리, 설정 관리, 로드 밸런싱 등 여러 클라우드 네이티브 기능을 손쉽게 사용할 수 있게 해줍니다.

이 글에서는 Spring Cloud Kubernetes의 주요 기능과 이를 사용했을 때의 장점, 그리고 Gradle 기반 프로젝트로 주요 기능들을 설명합니다.

1. Spring Cloud Kubernetes의 주요 기능

1.1. ConfigMap과 Secret을 통한 외부 설정 관리

Kubernetes에서 Spring Boot 애플리케이션의 설정을 관리하려면 ConfigMap과 Secret을 활용할 수 있습니다. Spring Cloud Kubernetes는 이를 통해 외부 설정을 쉽게 애플리케이션에 주입할 수 있습니다.

  • ConfigMap: 애플리케이션의 설정 파일을 외부에서 관리.
  • Secret: 보안이 중요한 정보(예: 비밀번호, API 키)를 안전하게 관리.

1.2. Kubernetes 기반의 서비스 디스커버리

Kubernetes 클러스터 내에서 마이크로서비스 간 통신을 할 때, Spring Cloud Kubernetes는 Kubernetes의 DNS 기반 서비스 디스커버리 기능을 활용해, 별도의 Eureka 서버 없이도 각 서비스가 다른 서비스를 쉽게 찾아서 통신할 수 있도록 도와줍니다.

1.3. Kubernetes Ingress와 로드 밸런싱

Spring Cloud Kubernetes는 애플리케이션 간의 트래픽을 Kubernetes의 Ingress나 로드 밸런서 서비스와 통합하여 처리합니다. 이를 통해 클러스터 내에서 요청을 효율적으로 관리하고 로드 밸런싱을 할 수 있습니다.

1.4. Pod와 Deployment Health 체크

Spring Cloud Kubernetes는 Kubernetes의 health 상태와 readiness 프로브를 사용하여 애플리케이션의 상태를 모니터링하고, 이를 기반으로 서비스의 가용성을 보장합니다.

1.5. 자동 스케일링 지원

Kubernetes의 Horizontal Pod Autoscaler(HPA)를 통해 Spring Boot 애플리케이션을 자동으로 확장하거나 축소할 수 있으며, 트래픽이나 CPU 사용량에 따라 Pod 수를 동적으로 조절합니다.

반응형

2. Spring Cloud Kubernetes 도입 시 장점

2.1. 클라우드 네이티브 기능 통합

Spring Cloud Kubernetes를 사용하면 Spring Boot 애플리케이션이 Kubernetes의 네이티브 기능을 쉽게 활용할 수 있습니다. 설정 관리, 서비스 디스커버리, 로드 밸런싱 등은 모두 Kubernetes 환경에 최적화된 방식으로 통합됩니다.

2.2. 애플리케이션의 유연성 증가

애플리케이션의 설정을 ConfigMap과 Secret을 통해 외부에서 관리할 수 있으므로, 코드 수정 없이도 환경 설정을 변경할 수 있어 유연성이 증가합니다.

2.3. 복잡도 감소

Spring Cloud Kubernetes는 서비스 디스커버리와 설정 관리를 자동화하기 때문에, 추가적인 서버나 복잡한 설정 없이도 애플리케이션을 쉽게 Kubernetes에 배포할 수 있습니다.

2.4. 클러스터 내에서 손쉬운 확장성

Kubernetes의 기본 확장 기능(HPA)과 Spring Cloud Kubernetes를 결합하면 애플리케이션이 자동으로 스케일링되며, 대규모 트래픽을 효과적으로 처리할 수 있습니다.

3. Gradle 기반의 Spring Cloud Kubernetes 프로젝트 예제

Gradle 설정

먼저, Gradle 설정 파일 build.gradle을 Java로 설정합니다.

plugins {
    id 'org.springframework.boot' version '3.1.0'
    id 'io.spring.dependency-management' version '1.0.15.RELEASE'
    id 'java'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.cloud:spring-cloud-starter-kubernetes-client-config'
    implementation 'org.springframework.cloud:spring-cloud-starter-kubernetes-client-discovery'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

이 Gradle 파일은 Java 프로젝트에서 Spring Cloud Kubernetes 기능을 사용할 수 있도록 필요한 의존성을 포함합니다.


2. ConfigMap을 활용한 설정 관리

Kubernetes에서 외부 설정을 관리하기 위해 ConfigMap을 정의합니다.

2.1. ConfigMap 생성

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

이 ConfigMap 파일은 custom.message라는 속성을 정의합니다.

2.2. Java에서 ConfigMap 사용

Java 애플리케이션에서는 @Value 어노테이션을 통해 이 설정을 주입받을 수 있습니다.

package com.example.demo;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MessageController {

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

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

이 MessageController 클래스는 /message 엔드포인트에서 Kubernetes의 ConfigMap으로부터 주입된 custom.message 값을 반환합니다.

3. 서비스 디스커버리

Spring Cloud Kubernetes를 통해 Kubernetes 클러스터 내에서 서비스 디스커버리를 구현할 수 있습니다. 이는 각 서비스가 별도의 Eureka 서버 없이도 서로를 인식하고 통신할 수 있게 해줍니다.

3.1. 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

이 매니페스트 파일은 Spring Boot 애플리케이션을 Kubernetes 클러스터에 배포하고, 서비스 디스커버리를 위해 spring-boot-service를 정의합니다. Kubernetes 클러스터에서 다른 마이크로서비스는 이 spring-boot-service 이름을 통해 통신할 수 있습니다.

4. Health 체크와 자동 스케일링

4.1. Health 체크

Spring Boot에서 기본 제공하는 /actuator/health 엔드포인트를 활성화하여 Kubernetes가 애플리케이션의 상태를 모니터링할 수 있게 합니다. 이를 위해 application.properties 파일에 다음을 추가합니다.

management.endpoints.web.exposure.include=health
management.endpoint.health.show-details=always

이 설정으로 /actuator/health 엔드포인트가 활성화되며, Kubernetes의 readiness와 liveness 프로브로 사용할 수 있습니다.

# deployment.yaml에 추가
spec:
  containers:
    - name: spring-boot-container
      image: my-repo/spring-boot-app:latest
      ports:
        - containerPort: 8080
      livenessProbe:
        httpGet:
          path: /actuator/health
          port: 8080
        initialDelaySeconds: 30
        periodSeconds: 10
      readinessProbe:
        httpGet:
          path: /actuator/health
          port: 8080
        initialDelaySeconds: 30
        periodSeconds: 10

4.2. 자동 스케일링

Kubernetes의 Horizontal Pod Autoscaler(HPA)를 사용하여 애플리케이션을 자동으로 스케일링할 수 있습니다. HPA는 CPU 사용량 또는 메모리 사용량을 기준으로 Pod 수를 조정합니다.

kubectl autoscale deployment spring-boot-app --cpu-percent=50 --min=1 --max=10

이 명령은 CPU 사용량이 50%를 초과할 때 spring-boot-app 배포의 Pod 수를 최대 10개까지 자동으로 확장합니다.

728x90

이번 글에서는 Spring Cloud Kubernetes를 활용하여 Spring Boot 애플리케이션을 Kubernetes 클러스터에 통합하는 방법을 살펴보았습니다. 주요 기능으로는 ConfigMap과 Secret을 통한 설정 관리, 서비스 디스커버리, 로드 밸런싱, 그리고 자동 스케일링이 있습니다. Spring Cloud Kubernetes를 도입함으로써 Spring Boot 애플리케이션이 Kubernetes 환경에 원활하게 통합되어 클라우드 네이티브 아키텍처의 이점을 최대한 활용할 수 있습니다.

728x90
반응형