카테고리 없음

이미지가 없다고 에러가 뜨는 이유 (이미지 풀 정책)

몽자비루 2025. 2. 23. 01:13

저번 포스팅 마지막에 Spring boot 프로젝트를 이미지로 빌드 후 파드로 띄웠는데,

마지막에 ImagePullBackOff 에러가 발생하는 것을 볼 수 있었다.

 

이번 포스팅은 이미지가 없다고 에러가 뜨는 이유에 대해서 작성하려고 한다.


  1. 이미지가 없다고 에러가 뜨는 이유.
    1. 이미지 풀 정책
      • 쿠버네티스가 yaml 파일을 읽어들여 podf를 생성할 때,
        이미지를 어떻게 Pull을 받아올 건지에 대한 정책을 의미한다.
        • Always : 로컬에서 이미지를 가져오지 않고, 무조건 레지스토리(=Dockerhub, ECR 과 같은 원격 이미지 지정소) 에서 가져온다.
        • IfNotPresent : 로컬에서 이미지를 먼저 가져온다. 로컬에 이미지가 없는 경우에만 레지스트리에서 가져온다.
        • Never : 로컬에서만 이미지를 가져온다.
      • 매니페스트 파일에 이미지 풀 정책 설정 방법
        • spec/containers 하위에 `imagePulPolicy : Always` 를 입력한다.
      • 매니페스트 파일에 이미지 풀 정책을 설정하지 않은 경우
        • 이미지 태그가 ` latest` 이거나 명시되지 않은 경우 : Always
        • 이미지 태그가 `latest` 가 아닌 경우 : IfNotPreset 
          # pod 로 생성한다
          apiVersion: v1
          kind: Pod
          
          # pod 에 대한 기본 정보 생성
          metadata :
            name : spring-pod
          
          # spec에 대한 세부 정보 지정.
          spec : 
            containers :
            - name : spring-container
              # spring-server image를 활용하여 image 를 띄울 것
              image : spring-server
              ports:
                - containerPort: 8080
        • 위와 같이 설정된 경우에는, image 뒤에 tag 가 적혀있지 않아 Always로 설정되어 있음.
        • 즉, 내가 만들었던 이미지는 local image 인데, 레지스트에서만 파일을 가져오므로,
          `ImagePullBackOff` 에러가 발생했던 것.
        • sprin-server 을 dockerhub 에 올리거나, imagePulPolicyIfNotPresent혹은 Never 로 설정하면 에러가 발생하지 않는다. 
  2. 에러 없이 이미지 가져오기
    1. 이미지 풀 정책 변경하기.
      • spring-pod.yaml 파일 아래와 같이 수정하기
        # pod 로 생성한다
        apiVersion: v1
        kind: Pod
        
        # pod 에 대한 기본 정보 생성
        metadata :
          name : spring-pod
        
        # spec에 대한 세부 정보 지정.
        spec : 
          containers :
          - name : spring-container
            # spring-server image를 활용하여 image 를 띄울 것
            image : spring-server
            ports:
              - containerPort: 8080
            imagePullPolicy : IfNotPresent
      • 기존의 pod 삭제 후 새로 생성하기
        • pod 삭제하기
        • pod 생성하기
    2. Pod 프로그램에 접속하기
      • pod 내부에서 직접 요청 보내기
      • 포트 포워딩 사용하기
        • localhost:8080 으로 접속하면 아무것도 나오지 않음
          localhost:12345로 접속해야 함.(pod 내부의 spring boot 프로젝트가 응답함)