[DevOps] 백엔드(Spring) 서버를 파드로 띄우기

·2025년 2월 12일

쿠버네티스

목록 보기
3/7
post-thumbnail

✅ 백엔드(Spring Boot) 서버를 파드(Pod)로 띄우기

0. Spring Boot 프로젝트 셋팅

https://start.spring.io

1. API 작성

@RestController
public class AppController {
    @GetMapping("/")
    public String home() {
        return "Hello world";
    }
}

2. 프로젝트 실행

실행 후 http://localhost:8080 접속

3. Dockerfile 작성

FROM openjdk:17-jdk

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

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

4. 프로젝트 빌드 후 Dockerfile 이미지 빌드

./gradlew clean build # 프로젝트 빌드

docker build -t spring-server . # Docker Image 빌드

docker image ls # 이미지 생성 됐는지 확인

5. yaml 파일 작성하기

spring-pod.yaml

apiVersion: v1 # Pod를 생성할 때는 v1이라고 기재한다. (공식 문서)
kind: Pod # Pod를 생성한다고 명시
metadata:
  name: spring-pod # Pod에 이름 붙이는 기능
spec:
  containers:
    - name: spring-container # 생성할 컨테이너의 이름
      image: spring-server # 컨테이너를 생성할 때 사용할 Docker Image
      ports:
        - containerPort: 8080 # 해당 컨테이너가 어떤 포트를 사용하는 지 명시적으로 표현

6. yaml 파일을 기반으로 파드(Pod) 생성하고 확인

kubectl apply -f spring-pod.yaml # yaml 파일에 적혀져있는 리소스(파드)를 생성

kubectl get pods # 파드(Pod) 조회

STATUS를 보면 ErrImagePull라고 떠있다. 이미지를 Pull 받아오는 중에 문제가 발생한 것이다. 이미지는 정상적으로 존재하는데 왜 에러가 떴을까?

✅ 이미지 풀 정책 (Image Pull Policy)

이미지가 없다고 에러가 뜨는 이유 이미지 풀 정책 때문이다.

이미지 풀 정책(Image Pull Policy)이란 쿠버네티스가 yaml 파일을 읽어들여 파드를 생성할 때, 이미지를 어떻게 Pull을 받아올 건지에 대한 정책을 의미한다.

아래와 같은 정책이 있다.

  1. Always

    로컬에서 이미지를 가져오지 않고, 무조건 레지스트리(= Dockerhub, ECR과 같은 원격 이미지 저장소)에서 가져온다.

  2. IfNotPresent

    로컬에서 이미지를 먼저 가져온다. 만약 로컬에 이미지가 없는 경우에만 레지스트리에서 가져온다.

  3. Never

    로컬에서만 이미지를 가져온다.

다음과 같이 매니페스트 파일에 이미지 풀 정책을 설정할 수 있다.

apiVersion: v1
kind: Pod
metadata:
  name: spring-pod
spec:
  containers:
    - name: spring-container
      image: spring-server
      ports:
        - containerPort: 8080
      imagePullPolicy: Always # 이미지 풀 정책
  • 기존에는 이미지 풀 정책을 따로 지정하지 않았다. 이때는 아래와 같이 작동한다.
    • 이미지의 태그가 latest 이거나 명시되지 않은 경우(해당): imagePullPolicyAlways로 설정됨
    • 이미지의 태그가 latest 가 아닌 경우: imagePullPolicyIfNotPresent로 설정됨

따라서 이미지 풀 정책을 명시하지 않아서 Always로 설정돼서 로컬에서 이미지를 가져오려고 하지 않고, 레지스트리에서 가져오려고 해서 에러가 난 것이다.
우리는 Docker Image를 로컬에서 가져와야하기 때문에 이미지 풀 정책을 수정해야한다.
더 자세한 정보는 공식문서 확인

7. spring-pod.yaml 수정

apiVersion: v1
kind: Pod
metadata:
  name: spring-pod
spec:
  containers:
    - name: spring-container
      image: spring-server
      ports:
        - containerPort: 8080
      imagePullPolicy: IfNotPresent # 수정

8. 기존 파드 삭제 후 다시 생성

kubectl delete pod spring-pod
kubectl apply -f spring-pod.yaml
kubectl get pods

9. Spring 서버에 요청

  1. 파드 내부로 직접 들어가서 요청
kubectl exec -it spring-pod -- bash 
curl localhost:8080

  1. 포트포워딩
kubectl port-forward pod/spring-pod 12345:8080 


0개의 댓글