@RestController
public class AppController {
@GetMapping("/")
public String home() {
return "Hello world";
}
}
실행 후 http://localhost:8080 접속

FROM openjdk:17-jdk
COPY build/libs/*SNAPSHOT.jar app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]
./gradlew clean build # 프로젝트 빌드
docker build -t spring-server . # Docker Image 빌드
docker image ls # 이미지 생성 됐는지 확인

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 # 해당 컨테이너가 어떤 포트를 사용하는 지 명시적으로 표현
kubectl apply -f spring-pod.yaml # yaml 파일에 적혀져있는 리소스(파드)를 생성
kubectl get pods # 파드(Pod) 조회

STATUS를 보면 ErrImagePull라고 떠있다. 이미지를 Pull 받아오는 중에 문제가 발생한 것이다. 이미지는 정상적으로 존재하는데 왜 에러가 떴을까?
이미지가 없다고 에러가 뜨는 이유 이미지 풀 정책 때문이다.
이미지 풀 정책(Image Pull Policy)이란 쿠버네티스가 yaml 파일을 읽어들여 파드를 생성할 때, 이미지를 어떻게 Pull을 받아올 건지에 대한 정책을 의미한다.
아래와 같은 정책이 있다.
Always
로컬에서 이미지를 가져오지 않고, 무조건 레지스트리(= Dockerhub, ECR과 같은 원격 이미지 저장소)에서 가져온다.
IfNotPresent
로컬에서 이미지를 먼저 가져온다. 만약 로컬에 이미지가 없는 경우에만 레지스트리에서 가져온다.
Never
로컬에서만 이미지를 가져온다.
다음과 같이 매니페스트 파일에 이미지 풀 정책을 설정할 수 있다.
apiVersion: v1
kind: Pod
metadata:
name: spring-pod
spec:
containers:
- name: spring-container
image: spring-server
ports:
- containerPort: 8080
imagePullPolicy: Always # 이미지 풀 정책
latest 이거나 명시되지 않은 경우(해당): imagePullPolicy 는 Always로 설정됨latest 가 아닌 경우: imagePullPolicy 는 IfNotPresent로 설정됨따라서 이미지 풀 정책을 명시하지 않아서 Always로 설정돼서 로컬에서 이미지를 가져오려고 하지 않고, 레지스트리에서 가져오려고 해서 에러가 난 것이다.
우리는 Docker Image를 로컬에서 가져와야하기 때문에 이미지 풀 정책을 수정해야한다.
더 자세한 정보는 공식문서 확인
apiVersion: v1
kind: Pod
metadata:
name: spring-pod
spec:
containers:
- name: spring-container
image: spring-server
ports:
- containerPort: 8080
imagePullPolicy: IfNotPresent # 수정
kubectl delete pod spring-pod
kubectl apply -f spring-pod.yaml
kubectl get pods

kubectl exec -it spring-pod -- bash
curl localhost:8080

kubectl port-forward pod/spring-pod 12345:8080

