외부 이미지 저장소 문제를 Nexus 미러로 정리한 MinIO 교체기
MinIO 이미지 pull 실패를 외부 저장소 주소 변경으로만 넘기지 않고, Nexus에 이미지를 복제한 뒤 Deployment·CronJob·Dockerfile을 한 번에 바꾼 과정이다. 이미지 인증을 빼먹어 ImagePullBackOff가 난 과정도 함께 기록한다.
외부 이미지 저장소에서 이미지를 받지 못하면 매니페스트의 주소 한 줄을 바꾸고 끝내기 쉽다. 실제로는 같은 이미지를 쓰는 Deployment, CronJob, Dockerfile을 모두 찾아야 한다. 새 주소에서 파드를 만들 때 필요한 인증도 따로 확인해야 한다.
이번에는 MinIO 서버와 mc 이미지를 Nexus Docker registry에 복제하고, 클러스터가 외부 저장소 대신 Nexus만 바라보도록 바꿨다.
배경 — 이미지가 필요한 곳이 세 군데였다
기존 설정에는 다음 외부 이미지 참조가 남아 있었다.
| 위치 | 용도 |
|---|---|
| MinIO Deployment | 객체 저장소 서버 실행 |
| 버킷 이벤트 등록 CronJob | mc로 알림 대상 등록 |
| 백업 Dockerfile | COPY --from로 mc 바이너리 복사 |
서버 이미지와 mc 이미지는 서로 다른 위치에서 사용되지만, 둘 중 하나라도 받지 못하면 해당 작업이 멈춘다. 외부 저장소를 다른 외부 저장소로 바꾸는 대신, 운영 클러스터가 이미 사용 중인 Nexus에 두 이미지를 복제했다.
적용 — 이미지와 참조를 함께 바꿨다
먼저 원본 이미지를 받은 뒤 Nexus에 고정 태그로 올렸다. 태그 이름만 맞추지 않고 manifest와 layer가 모두 있는지 확인했다.
docker pull <external-registry>/minio/minio:<server-tag>
docker tag <external-registry>/minio/minio:<server-tag> \
<nexus-registry>/minio/minio:<server-tag>
docker push <nexus-registry>/minio/minio:<server-tag>
mc도 같은 방식으로 복제했다. 그다음 저장소 전체에서 외부 이미지 참조를 검색했다.
rg -n "minio|mc|quay.io|docker.io" .
최종적으로 바꾼 곳은 세 군데였다.
- MinIO Deployment의 서버 이미지
- 버킷 이벤트 등록 CronJob의
mc이미지 - 백업 Dockerfile의
COPY --from이미지
이미지 주소는 공개 글에서 실제 주소를 가렸지만, 운영 매니페스트에서는 모두 같은 Nexus registry 경로를 사용한다.
실수한 것들
Deployment만 고쳤다
처음에는 실행 중인 MinIO Deployment만 바꾸면 된다고 생각했다. 그러나 다음 예약 실행에서 mc CronJob이 옛 이미지 주소를 계속 사용할 수 있었다. 백업 이미지를 다시 만들 때도 Dockerfile의 COPY --from가 외부 저장소를 조회한다.
원인: 실행 중인 파드만 검색하고 예약 작업과 빌드 파일을 검색하지 않았다.
해결: 저장소 전체에서 이미지 이름을 검색하고, 실행·예약·빌드 세 경로를 모두 바꿨다.
이미지 주소만 바꾸고 pull 인증을 빼먹었다
Nexus 주소로 바꾼 뒤 새 파드가 ImagePullBackOff가 됐다. 노드의 containerd가 이미지를 받을 수 있다는 사실만으로는 새 파드의 registry 인증이 보장되지 않는다.
원인: 파드는 스케줄된 노드에서 registry에 다시 인증해야 한다.
해결: MinIO Deployment와 mc CronJob에 동일한 imagePullSecrets를 추가했다. Deployment에만 secret을 넣으면 다음 CronJob 실행에서 다시 실패한다.
spec:
imagePullSecrets:
- name: <registry-pull-secret>
이미지 복제를 데이터 백업으로 착각할 수 있었다
Nexus에 이미지가 있다는 것은 컨테이너를 실행할 재료가 있다는 뜻이지, MinIO 객체가 복사됐다는 뜻은 아니다. 이번 변경에서는 이미지와 PVC를 분리해서 확인했다.
결과
| 항목 | 변경 전 | 변경 후 |
|---|---|---|
| MinIO 서버 이미지 | 외부 registry | Nexus registry |
mc CronJob 이미지 | 외부 registry | Nexus registry |
| 백업 Dockerfile | 외부 COPY --from | Nexus COPY --from |
| registry 인증 | 외부 pull 방식 | Kubernetes imagePullSecrets |
| MinIO PVC | 기존 PVC | 변경 없음 |
| 객체 데이터 | 기존 데이터 | 변경 없음 |
이미지 manifest와 layer를 Nexus에서 확인한 뒤, 새 주소로 파드를 만들고 MinIO readiness를 확인했다. 버킷 이벤트 등록 작업도 같은 Nexus의 mc 이미지로 실행하도록 맞췄다.
남는 것
이미지 저장소를 바꿀 때는 주소 치환보다 참조 목록과 인증 경로가 더 중요하다.
- Deployment, CronJob, Dockerfile을 함께 검색한다.
- 태그뿐 아니라 manifest와 layer를 확인한다.
- Deployment와 CronJob에 pull secret이 모두 있는지 확인한다.
- 이미지 백업과 객체 데이터 백업을 별도 항목으로 관리한다.
- 파드 상태의 이미지 이름만 보지 말고 실제
Pulled이벤트를 확인한다.
이번 변경은 MinIO 데이터를 옮긴 작업이 아니다. 외부 저장소에 의존하던 컨테이너 이미지를 Nexus로 고정한 작업이다. 객체 데이터의 복구 가능성은 기존 PVC와 별도의 MinIO 백업 절차로 계속 보장해야 한다.