k8s의 POD 상태가 ImagePullbackOff 일 때

안녕하세요 모코코입니다.

오늘은 K8s 의 POD 에러 중 imagePullbackOff 에러 해결방법을 설명드리겠습니다!

“kubectl -n {namespace} get pods” 로 pod 상태 조회 중에 다음과 같이 imagePullbackoff 명령어가 발생했습니다.

[k8s-admin@k8s-node1 ~]$ kubectl -n default-platform get pods
NAME                                               READY   STATUS          RESTARTS   AGE
ml-pipeline-85f5bdcc5d-qq549                       1/1       imagePullbackoff    0   5d22h
ml-pipeline-persistenceagent-749b54b6f-w789r       1/1       Running             1   5d22h
ml-pipeline-scheduledworkflow-544db8d9cf-9x2ns     1/1       Running             1   5d22h

“kubectl logs {POD_ID} -n {namespace}” 명령어로 POD 로그를 조회하고 싶지만, POD 이 아직 Creation 되기 전이므로, 아무 로그도 나타나지 않습니다.

이 때는 다음 명령어를 이용하여 POD 명세를 뒤져보면 에러의 원인이 나옵니다.
> kubectl describe pod {POD_ID} -n {namespace}

[k8s-admin@k8s-node1 ~]$ kubectl describe pod ml-pipeline-85f5bdcc5d-qq549 -n default-platform 

Events:
  FirstSeen    LastSeen    Count   From                        SubObjectPath       Type        Reason      Message
  ---------    --------    -----   ----                        -------------       --------    ------      -------
  5m        5m      1   {default-scheduler }                            Normal      Scheduled   Successfully assigned fail-1036623984-hxoas to gke-nrhk-1-default-pool-a101b974-wfp7
  5m        2m      5   {kubelet gke-nrhk-1-default-pool-a101b974-wfp7} spec.containers{fail}   Normal      Pulling     pulling image "rosskukulinski/dne:v1.0.0"
  5m        2m      5   {kubelet gke-nrhk-1-default-pool-a101b974-wfp7} spec.containers{fail}   Warning     Failed      Failed to pull image "rosskukulinski/dne:v1.0.0": Error: image rosskukulinski/dne not found
  5m        2m      5   {kubelet gke-nrhk-1-default-pool-a101b974-wfp7}             Warning     FailedSync  Error syncing pod, skipping: failed to "StartContainer" for "fail" with ErrImagePull: "Error: image rosskukulinski/dne not found"

  5m    11s 19  {kubelet gke-nrhk-1-default-pool-a101b974-wfp7} spec.containers{fail}   Normal  BackOff     Back-off pulling image "rosskukulinski/dne:v1.0.0"
  5m    11s 19  {kubelet gke-nrhk-1-default-pool-a101b974-wfp7}             Warning FailedSync  Error syncing pod, skipping: failed to "StartContainer" 
for "fail" with ImagePullBackOff: "Back-off pulling image \"rosskukulinski/dne:v1.0.0\""

“rosskukulinski/dne:v1.0.0” docker image 가 없어서 ImagePullBackOff 가 발생했는데요,

해당 이미지를 search 한다. 그러면 실제로 docker 이미지가 없는 것을 확인할 수 있습니다.

[k8s-admin@k8s-node1 ~]$ docker images | grep rossku
[k8s-admin@k8s-node1 ~]$

삭제된 이유는 여러가지 일 수 있습니다. 사용자 부주의로 이미지를 지웠을 수도 있고, 혹은 tag 번호를 최신버전으로 갱신하고, 해당 POD 버전에 맞는 docker image 를 지웠거나

k8s GC 에 의해 지워졌을 수도 있습니다. OS 디스크 가용량이 80% 이상 근접했을 시, k8s GC 는 오랫동안 참조되지 않은 docker image 를 삭제하기도 합니다.

이미지 복원은 docekr pull을 받을 수도 있고, 내부망이라면 docker save / load 명령어를 이용하여 tar 파일을 업로드하여 복원할 수도 있습니다.

docker save -o {IMAGE.tar} {IMAGE명}:{태그명}

# 현재 이미지가 삭제된 서버에 tar 파일 업로드

docker load -i {IMAGE.tar}

해당 이슈 방지를 위해 가장 좋은 방법은 docker image 앞에 url을 태그로 관리하여, 외부망에서는 docker hub 에서 자동 pull을 받고, 내부망 전용 서버는 nexus 와 같은 자체 docker registry 를 운용하여 에러 발생 시, 자동 pull을 받는 방법이 있습니다.

비슷한 글 더보기