Infra/k8s
[k8s] SpringBoot 서버를 pod로 띄우기
개발자 쿠키
2025. 6. 8. 12:42
1. Spring Boot 프로젝트 세팅

2. AppController 코드 작성

3. 프로젝트 실행

4. Dockerfile 작성
FROM openjdk:17-jdk
COPY build/libs/*SNAPSHOT.jar app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]
4-1. 빌드가 안되는 사람만, 잘 되면 pass
# java version 확인
java --version
# jvm version 확인
./gradlew --version
java, jvm 17로 세팅
jvm은 ctrl + alt + s -> gradle

환경변수
윈도우 검색창에 환경 변수 입력 → 시스템 환경 변수 편집 클릭

PATH=%JAVA_HOME%\bin;%PATH%
5. Spring Boot 프로젝트 빌드
./gradlew clean build
6. Dockerfile을 바탕으로 이미지 빌드하기
docker build -t spring-server .
7. 이미지 확인
docker image ls

8. spring-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: spring-pod
spec:
containers:
- name: spring-container
image: spring-server
ports:
- containerPort: 8080
9. 매니페스트 파일 기반 파드 생성
kubectl apply -f spring-pod.yaml
10. 파드 생성 확인
kubectl get pods
이미지 풀 정책
쿠버네티스가 .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: IfNotPresent
이미지의 태그가 latest or 명시하지 않으면 imagePullPolicy는 Always로 설정됨
이미지의 태그가 laters가 아닌 경우: imagePullPolicy는 IfNotPresent로 설정됨
STATUS가 ImagePullBackOff로 에러가 발생했다면?
기존에는 imagepullPolicy가 always로 작동했는데, spring-server라는 이미지는 dockerhub에 올린적이 없기 때문에 이미지를 받아 온 것이다.
기존 파드 삭제 후 다시 생성
kubectl delete pod spring-pod
kubectl apply -f spring.pod.yaml
kubectl get pods

11. Spring Boot 서버에 요청 보내 잘 응답 확인
11-1. 파드 내부로 들어가서 요청 보내기
kubectl exec -it spring-pod -- bash
curl localhost:8080
11-2. 포트 포워딩
kubectl port-forward pod/spring-pod 12345:8080

localhost:12345로 접속시 hello world 출력됨
파드 삭제
kubectl delete pod spring-pod