/엔지니어/트러블슈팅/Kubernetes ImagePullBackOff
트러블슈팅중급linuxkubernetesimagepullbackofferrimagepull

Kubernetes ImagePullBackOff 진단 — Events·체크리스트·명령

ImagePullBackOff·ErrImagePull을 Events로 분류하고, 태그/인증/네트워크/레이트 리밋을 체크리스트와 노드 pull 명령으로 좁히는 진단형 런북입니다.

ImagePullBackOff 진단 런북

ImagePullBackOff / ErrImagePull은 Pod가 컨테이너 이미지를 가져오지 못해 기동에 실패한 상태입니다. CrashLoopBackOff와 달리 컨테이너 프로세스가 한 번도 뜨지 않은 경우가 많습니다.

30초 체크리스트

  1. kubectl get pod <name> -o wide — STATUS가 ImagePullBackOff / ErrImagePull인지 확인
  2. kubectl describe pod <name> — Events 맨 아래 Failed / BackOff 메시지 복사
  3. 이미지 문자열 확인: registry/repo:tag 오타, digest, latest 의존
  4. 프라이빗 레지스트리면 imagePullSecrets / 노드 IAM / 네트워크(방화벽·DNS) 점검
  5. 워커 노드에서 동일 이미지 crictl pull 또는 ctr images pull로 재현

Events에서 원인 분류

Bash
kubectl describe pod <pod> -n <ns> | sed -n '/Events:/,$p'
kubectl get events -n <ns> --field-selector involvedObject.name=<pod> --sort-by=.lastTimestamp
Events 키워드의미다음 액션
not found / manifest unknown태그·이름 없음레지스트리에서 태그 존재 확인, CI 푸시 여부
unauthorized / denied / 401 / 403인증·권한Secret, IRSA/Workload Identity, robot account
i/o timeout / no such host / TLS네트워크·DNS·인증서노드 DNS, 프록시, 사설 CA
toomanyrequests / 429레이트 리밋미러, pull-through cache, 재시도 백오프
rpc error / context deadline런타임·디스크노드 disk-pressure, containerd 로그

진단 명령

Bash
# 이미지 참조 확인
kubectl get pod <pod> -n <ns> -o jsonpath='{range .spec.containers[*]}{.name}{"\t"}{.image}{"\n"}{end}'

# imagePullSecrets
kubectl get pod <pod> -n <ns> -o jsonpath='{.spec.imagePullSecrets[*].name}{"\n"}'
kubectl get sa default -n <ns> -o yaml | sed -n '/imagePullSecrets/,/^[^ ]/p'

# 노드에서 직접 pull (containerd 예시)
IMAGE=$(kubectl get pod <pod> -n <ns> -o jsonpath='{.spec.containers[0].image}')
NODE=$(kubectl get pod <pod> -n <ns> -o jsonpath='{.spec.nodeName}')
kubectl debug node/$NODE -it --image=busybox -- chroot /host crictl pull "$IMAGE"

원인별 수정

1) 잘못된 태그·레지스트리

YAML
# before
image: ghcr.io/acme/api:v1.2.3
# after — 실제 존재하는 태그/digest
image: ghcr.io/acme/api@sha256:…

2) 프라이빗 레지스트리 인증

Bash
kubectl create secret docker-registry regcred \
  --docker-server=ghcr.io \
  --docker-username=<user> \
  --docker-password=<token> \
  -n <ns>

# Pod 또는 ServiceAccount에 연결
YAML
spec:
  imagePullSecrets:
    - name: regcred

EKS라면 노드 역할 / IRSA가 ECR GetAuthorizationToken·BatchGetImage를 갖는지 확인하세요.

3) 네트워크·DNS

  • 노드에서 getent hosts registry.example.com
  • HTTP 프록시 환경이면 containerd의 proxy 설정
  • 사설 HTTPS면 노드 신뢰 저장소에 CA 추가

4) 레이트 리밋

Docker Hub 익명 pull 한도에 걸리면 인증 pull, 미러, 또는 사내 pull-through cache로 이동하세요.

재발 방지

  • 배포 이미지에 mutable latest 금지, digest 고정
  • CI에서 crane digest / skopeo inspect로 존재 확인 후 롤아웃
  • imagePullPolicy: IfNotPresent는 태그 재사용 시 위험 — digest면 안전
  • 클러스터에 레지스트리 미러/캐시

빠른 판정표

증상첫 수정
manifest unknown태그·푸시 확인
unauthorizedpull secret / 클라우드 IAM
timeout / no such hostDNS·방화벽·프록시
429인증·미러
특정 노드만 실패그 노드 디스크·런타임·네트워크

ImagePullBackOff는 앱 버그가 아니라 이미지 공급 경로 문제입니다. Events 한 줄만 제대로 읽어도 대부분 5분 안에 갈래가 갈립니다.

#kubernetes#imagepullbackoff#errimagepull#troubleshooting#kubectl
편집 안내 · Editorial Note

이 가이드는 AI 도구를 활용해 초안을 구성하고 사람이 명령어·문맥을 검토해 발행했습니다. 운영체제와 도구 버전에 따라 결과가 달라질 수 있으므로 적용 전 공식 문서를 함께 확인하세요. 오류를 발견하시면 이메일로 제보해 주세요. 이메일로 제보

관련 공식 문서Kubernetes 공식 문서

질문 & 답변 (Q&A)

이 가이드에 대해 궁금한 점을 질문해보세요. 확인 후 답변드립니다.