폐쇄망에서 ECS 1.5.4 Base → 1.5.4 SP2 업그레이드 중 파드가 ImagePullBackOff 로 멈췄다. 원인은 레지스트리 인증이나 인증서가 아니라, 인터넷 PC 에서 wget 으로 받은 이미지 tarball 이 중간에 끊겨 SP2 이미지 세트가 Harbor 에 완전히 올라가지 않은 것이었다.
kubectl get pods -A | grep -iE 'ImagePull|ErrImage'
kubectl describe pod <POD> -n <NAMESPACE>
describe 의 Failed to pull image 줄에서 에러 유형을 본다. NotFound(404) 면 그 태그가 레지스트리에 없는 것이고, unauthorized(401) 면 인증, x509 면 인증서, timeout 이면 네트워크 문제다. 이 사례는 thunderhead-iam-console:1.5.4-b78 이 NotFound 였고 Harbor 에는 1.5.2-b1727 만 있었다.
경로에 보이는 cloudera/cloudera/... 의 이중 cloudera 는 Harbor 프로젝트(cloudera) + 리포지토리(cloudera/...) 구조라 정상이다.
미러 디렉터리에 .tar.gz.asc(서명, 836 B) 만 있고 본체 .tar.gz 가 없었다. 다운로드 로그를 보면 wget 이 알파벳순으로 받다 끊겼고, copy-docker 스크립트는 없는 파일을 건너뛰어 Downloaded and pushed 225/247 로 끝난 상태였다. 또 9.5 GB 짜리 cml-runtimes-cuda 번들은 245 바이트짜리 깨진 조각 위에 -c(이어받기) 를 반복해 크기만 맞고 archive/tar: invalid tar header 가 났다.
/tmp/todo.txt) 을 만든다..netrc 로만 넘긴다.cd /mnt/mirror/cloudera/1.5.4/images
umask 177
printf 'machine archive.cloudera.com login %s password %s\n' "${CLOUDERA_USER}" "${CLOUDERA_PASS}" > ~/.netrc
chmod 600 ~/.netrc
BASE=https://archive.cloudera.com/p/cdp-pvc-ds/1.5.4/images
while read -r n; do
wget --no-verbose --tries=0 --timeout=60 --retry-connrefused -O "$n" "$BASE/$n" || echo "FAIL: $n"
done < /tmp/todo.txt
shred -u ~/.netrc
while read -r n; do
gzip -t "$n" 2>/dev/null && echo "OK $(du -h "$n" | cut -f1) $n" || echo "BAD $n"
done < /tmp/todo.txt
gzip -dc cml-runtimes-cuda-1.5.4-b99.tar.gz | tar -tf - >/dev/null && echo tarOK
-c 없이 새로 받는다. 풀다 만 잔재(/tmp/cloudera/cdp-private/...) 도 정리한다.grep -iE 'Downloaded and pushed|Failed to' <로그파일>
docker load -i thunderhead-iam-console_1.5.4-b78.tar
docker tag <IMAGE_ID> <HARBOR_HOST>:<PORT>/cloudera/cloudera/thunderhead-iam-console:1.5.4-b78
docker push <HARBOR_HOST>:<PORT>/cloudera/cloudera/thunderhead-iam-console:1.5.4-b78
kubectl delete pod <멈춘 파드> -n cdp
레지스트리 사용자·비밀번호·인증서를 고쳤다면 CM → ECS Cluster → Configuration 에서 External Container Registry 항목을 수정한 뒤 ECS Server Actions → Refresh ECS 를 실행해야 cdp-private-installer-docker-pull-secret 시크릿이 갱신된다. 그 뒤 ECS 재시작 → Resume 순서다. 노드가 Harbor 인증서를 신뢰하지 못하면 /etc/docker/certs.d/ 에 인증서를 둔다.
cml-runtimes-cuda·k8s-device-plugin 은 실사용에 불필요하지만 copy-docker 가 manifest 전체를 돌므로 받아 두는 편이 단순하다. 외장 디스크가 FAT32 면 4 GB 초과 파일을 저장할 수 없다.nvidia.com/gpu 가 <none> 이면 MIG 가 켜진 채 인스턴스가 없는 상태일 수 있다. nvidia-smi -i 0 -mig 0 으로 MIG 를 끄고 device-plugin 파드를 재생성한다.