안녕하세요 모코코입니다.
오늘은 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을 받는 방법이 있습니다.