Journey to Security/클라우드

[k8s] 스프링부트(Spring boot) 서버를 파드(Pod)로 띄우기

Cordilog 2026. 1. 3. 23:44

쿠버네티스에서 스프링부트 서버를 파드로 띄우는 과정을 알아보자.

1. IDE에 스프링 프로젝트 열기

먼저 스프링 이니셜라이저(Spring Initializr)에서 스프링부트(Spring Boot) 프로젝트 demo 파일(zip)을 다운받아서 원하는 경로에 압축을 풀어놓는다.

이전 포스팅 참고 : https://nanujahope.tistory.com/105

 

그 다음, IDE에(ex. IntelliJ) 스프링 프로젝트(ex. demo)를 오픈한다.

2. 테스트용 코드 작성

src/main/java/com.example.demo/ 디렉토리에 AppController라는 자바 클래스를 새로 만든다. 

파드가 실행되는 것만 확인하는 용도이므로 다음과 같이 간단한 예시 코드를 복붙해서 정상적으로 실행(run)되는지 확인한다.

 

[예시 코드]

package com.example.demo;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class AppController {

    @GetMapping("/")
    public String home() {
        return "Hello, World!";
    }
}

 

스프링부트(Spring Boot) 애플리케이션은 기본적으로 내장 톰캣(Tomcat)을 사용하여 8080 포트에서 실행된다.

다음과 같이 웹 브라우저에서 주소창에 localhost:8080을 치면 스프링 서버가 정상적으로 뜨는 것을 확인할 수 있다. 

 

3. 도커 이미지 생성

이렇게 스프링 서버가 정상 동작하는 것을 확인했으므로, 다음은 도커 이미지 생성을 위해 /demo/ 밑에 Dockerfile을 생성한다. 

FROM eclipse-temurin:17-jdk  #Java 17 환경을 준비

COPY build/libs/*SNAPSHOT.jar app.jar  #빌드된 jar 파일을 가져오기

ENTRYPOINT ["java", "-jar", "/app.jar"]  #자바 명령어로 실행

 

FROM eclipse-temurin:17-jdk

베이스 이미지(기반이 되는 환경)를 가져옴

  • 의미: 이 도커 이미지는 eclipse-temurin이라는 곳에서 제공하는 Java 17 JDK 버전의 리눅스 환경 위에서 만들어진다는 뜻
    • eclipse-temurin: 예전의 OpenJDK(AdoptOpenJDK)를 잇는 무료 자바 배포판
    • jdk: Java Development Kit의 약자로, 자바 프로그램을 실행하고 개발할 수 있는 도구들이 포함되어 있음.

COPY build/libs/*SNAPSHOT.jar app.jar

호스트에 있는 빌드 파일을 컨테이너 안으로 복사함

  • 의미: 호스트의 build/libs/ 폴더에 있는 이름에 SNAPTSHOT이 포함된 .jar 파일을, 컨테이너 내부의 최상위 경로에 app.jar라는 이름으로 복사해 넣으라는 뜻
    • build/libs/ : 보통 Gradle로 빌드하면 결과물(.jar)이 생성되는 기본 경로입니다.
    • *SNAPTSHOT.jar : 파일명 전체를 적지 않고 *(와일드카드)를 사용한 이유: 버전이 바뀌어 파일명이 my-web-0.0.1-SNAPSHOT.jar에서 my-web-0.0.2-SNAPSHOT.jar로 바뀌더라도 Dockerfile을 수정할 필요 없이 자동으로 잡히도록 함.
    • app.jar : 복사된 파일의 이름을 심플하게 app.jar로 변경한다. 이렇게 하면 나중에 실행할 때 파일명을 고민할 필요가 없다.

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

컨테이너가 시작될 때 실행할 명령어를 지정

  • 의미: 이 이미지를 기반으로 컨테이너(Pod)가 생성되어 시작될 때, 자동으로 java -jar /app.jar 명령어를 실행하라는 뜻
    • 이 명령어가 실행되면 Spring Boot 서버가 켜짐.
    • 파일 이름을 app.jar로 통일해두었기 때문에, 항상 /app.jar를 실행하면 된다.

위와 같이 Dockerfile을 작성하고 나면, 터미널에 다음 명령어를 쳐서 기존에 빌드된 파일을 청소하고 새로운 jar 파일로 빌드한다.

./gradlew clean build

 

그러면 아래와 같이 build/libs/ 밑에 SNAPSHOP.jar 파일이 생성되는데, 이 파일을 바탕으로 도커 이미지를 만들게 된다. 

 

다음으로, 아래 명령어로 "spring-server"라는 이름의 도커 이미지를 빌드한다.

** 도커 앱(데몬)이 실행되고 있어야 함. **

 docker build -t spring-server .

 

  • docker build :  이전에 작성한 Dockerfile이라는 텍스트 파일(설계도)을 읽어서, 실제로 실행 가능한 도커 이미지 파일로 만들라는 뜻.
  • -t : Tag(태그)의 약자. 생성될 이미지에 이름을 붙이는 옵션.
  • spring-server : 사용자가 정한 이미지 이름.
    • 뒤에 버전을 명시하지 않았으므로(예: spring-server:v1), 자동으로 spring-server:latest가 됨.
    • 나중에 이 이미지를 실행하거나 찾을 때 이 이름을 사용하게 된다.
  • .  : 점(. )은 현재 위치를 뜻함. 도커에게 "현재 경로에서 Dockerfile을 찾고, COPY 명령어로 복사할 파일(jar 파일 등)도 이 경로 기준(정확히는 Context)으로 찾아라"라고 알려줌

빌드가 완료되면 docker image ls 또는 docker images 명령어로 이미지가 잘 생성되었는지 확인한다.

이미지 목록에 spring-server:latest가 뜨면 성공적으로 빌드된 것이다.

 

4. Manifest 파일(yaml) 생성

/demo/ 밑에 spring-pod.yaml 파일을 생성한다. (파일명은 임의로 지을 수 있음) 

apiVersion: v1
kind: Pod

metadata:
  name: spring-pod

spec:
  containers:
    - name: spring-container
      image: spring-server
      imagePullPolicy: IfNotPresent
      ports:
        - containerPort: 8080

 

기본 정보 (Header)

 

  • apiVersion: v1 : 쿠버네티스 API의 버전을 의미. Pod는 가장 기초적인 리소스라서 안정화된 v1 버전을 사용.
  • kind: Pod : "지금 만들려는 것은 Pod(파드)"라고 종류를 명시.

메타데이터 (Metadata)

  • metadata : 리소스 자체의 이름이나 라벨 등 식별 정보를 담는 곳.
  • name: spring-pod : 이 파드의 고유 이름을 "spring-pod"로 짓겠다는 뜻. 나중에 kubectl get pod 명령어로 조회할 때 이 이름으로 표시된다.

상세 스펙 (Spec)

  • spec : 이 파드를 어떤 상태로 띄울 것인지 구체적인 내용을 정의함.
  • containers : 파드 안에는 하나 이상의 컨테이너가 들어갈 수 있기 때문에 여기서 컨테이너들을 나열한다.
  • - name: spring-container : 파드 내부에서 실행될 컨테이너의 이름입니다. (파드 이름과는 별개)
  • image: spring-server : 앞에서 docker build로 만든 이미지의 이름. "내 컴퓨터(혹은 저장소)에 있는 spring-server라는 이미지를 가져와서 실행하라"는 뜻.
  • imagePullPolicy: IfNotPresent : 내 컴퓨터(로컬)에 spring-server 이미지가 있는지 먼저 확인하고, 있으면 그것을 사용한다. 만약 로컬에 없다면, 그때 외부 저장소(Docker Hub 등)에서 다운로드를 시도한다. (로컬에서 빌드한 이미지를 사용할 때 가장 안전하고 범용적으로 쓰이는 옵션)
  • ports: 네트워크 포트 설정.
  • - containerPort: 8080 : "이 컨테이너는 8080번 포트를 열어두고 기다리고 있다"라고 명시하는 것. Spring Boot의 기본 포트가 8080이기 때문에 이렇게 적어주면 된다.

5. 파드 생성 및 실행

yaml 파일을 작성한 후, 아래 명령어로 파드를 생성해서 컨테이너를 실행한다. 

kubectl apply -f spring-pod.yaml

 

 

콘솔에 pod/spring-pod created 라는 메시지가 뜨면 파드가 정상적으로 생성된 것이다.

kubectl get pods 명령어로 파드가 실행되고 있는지 확인한다.

 

 

 

 

 

6. 서버 접속 확인

방법 1: 파드 내부에 접속해서 요청 보내기

kubectl exec -it spring-pod -- bash 명령어로 실행 중인 파드 내부로 들어가서 이 파드 안에서 실행 중인 스프링 서버(8080번 포트)에 GET 요청을 보낸다.

아래와 같이 뜨면 성공이다.

 

방법 2: 포트 포워딩으로 웹 브라우저에서 접속

kubectl port-forward pod/spring-pod 12345:8080 명령으로 로컬의 12345를 컨테이너의 8080 포트에 연결한다.

웹 브라우저에서 localhost:12345로 접속했을 때 아래와 같이 화면이 뜨면 서버에 정상적으로 접속된 것이다.

 

파드로 띄운 서버에 접속하는 위 두 가지 방법에 대한 보충 설명은 아래 포스팅에도 정리되어 있다.

https://nanujahope.tistory.com/100

실습 내용은 인프런 강의 <비전공자도 이해할 수 있는 쿠버네티스 입문/실전>을 참고했다.