비전공자도 이해할 수 있는 쿠버네티스 입문/실전
image-pull-policy-error-explanation
✅ 이미지가 없다고 에러가 뜨는 이유 이전에 Spring Boot 프로젝트를 이미지로 빌드해서 파드로 띄웠다. 하지만 ImagePullBackOff라는 에러가 발생했다. 이 문제는 이미지 풀 정책(Image Pull Policy) 때문에 발생한 것이다. 이미지 풀 정책이 뭔지 알아보자.
✅ 이미지 풀 정책 (Image Pull Policy) 이미지 풀 정책(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
✅ 기존 매니페스트 파일 다시 살펴보기 spring-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: spring-pod
spec:
containers:
- name: spring-container
image: spring-server
ports:
- containerPort: 8080위의 매니페스트 파일에서는 이미지 풀 정책을 따로 설정하지 않았다. 이럴 때는 아래와 같이 작동한다.
이미지의 태그가 latest이거나 명시되지 않은 경우 : imagePullPolicy는 Always로 설정됨 이미지의 태그가 latest가 아닌 경우 : imagePullPolicy는 IfNotPresent로 설정됨
따라서 기존 매니페스트 파일은 imagePullPolicy가 Always로 작동했던 것이다. 즉, 로컬에서 이미지를 가져오지 않고 레지스트리에서 가져오려고 했다. 하지만 spring-server라는 이미지는 Dockerhub에 올린 적이 없기 때문에 이미지를 못 받아온 것이다. 따라서 아래와 같이 에러가 떴다.
그러면 어떻게 해야 로컬에 있는 이미지를 가져올 수 있을까?
spring-pod.yaml
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
Spring Boot 서버에 요청을 보내서 잘 응답하는 지도 알아보자.
방법 1. 파드 내부로 들어가서 요청보내기
$ kubectl exec -it spring-pod -- bash
$ curl localhost:8080
방법 2. 포트 포워딩 활용하기
# 포트
$ kubectl port-forward pod/spring-pod 12345:8080
✅ 파드 삭제하기 $ kubectl delete pod spring-pod