SAS Viya 4 를 폐쇄망에 설치할 때는 mirrormgr 로 SAS 레지스트리에서 이미지를 받아 사내 레지스트리로 올린다. 순서는 내려받기(mirror registry 또는 mirror download)와 올리기 두 단계이며, 받아 둔 저장소 디렉터리를 고객사로 반출해 거기서 올리는 방식도 쓴다.
블롭(레이어) 업로드는 끝나고 마지막 manifest 등록 단계에서 레지스트리가 400 을 돌려준다.
failed to upload manifest to https://registry.example.com:8443/v2/<project>/viya-4-x64_oci_linux_2-docker/sas-cas-server/manifests/<tag> with 400 400 Bad Request
관찰된 양상은 다음과 같다.
sas-repos 디렉터리를 통째로 지우고 다시 받아도 같은 지점에서 난다.certs.zip)의 압축 무결성과 체크섬에는 이상이 없다.Error: non Bearer tokens not supported, found "" 로 끝나는 경우도 있었다.1. 레지스트리 쪽 실제 사유를 본다. 400 은 클라이언트가 보는 껍데기이고, 거부 사유는 레지스트리 로그에 남는다. Harbor 라면 core · registry · proxy 컨테이너 로그에서 같은 시각을 본다. manifest invalid, manifest blob unknown, denied, 태그 불변성 위반 등이 찍힌다. 이 문자열이 원인을 가른다.
curl -s -u '<user>:${PASSWORD}' \
"https://registry.example.com:8443/api/v2.0/projects/<project>/repositories?page_size=100" | head
2. mirrormgr 문제인지 레지스트리 문제인지 가른다. 같은 계정으로 평범한 이미지를 직접 밀어 본다.
docker login registry.example.com:8443
docker pull busybox:latest
docker tag busybox:latest registry.example.com:8443/<project>/test-busybox:latest
docker push registry.example.com:8443/<project>/test-busybox:latest
이것이 되면 인증 · 네트워크 · 프로젝트는 정상이고, mirrormgr 이 쓰는 manifest 형식이나 요청 경로에 한정된 문제일 가능성이 크다.
3. 앞단 프록시를 의심한다. 8443 포트가 Harbor 내장 nginx 인지 별도 리버스 프록시인지 확인한다. 본문 크기 · 헤더 크기 · URL 길이 제한, 그리고 긴 push 중 토큰이 만료되는 구간에서 400 이 나올 수 있다. non Bearer tokens not supported, found "" 는 재인증 과정에서 토큰이 비어 돌아왔다는 뜻이라 이 경로를 강하게 시사한다. 프록시의 타임아웃과 버퍼 설정, Harbor 의 토큰 유효 기간을 함께 본다.
4. 프로젝트 정책을 본다. 태그 불변성 규칙, 콘텐츠 신뢰(서명 강제), 취약점 스캔 차단 정책, 프로젝트 쿼터가 걸려 있으면 특정 push 만 거부된다. 쿼터는 용량이 찰수록 발현되므로 "100개까지는 되다가 막힌다"는 양상과 맞을 수 있다.
5. mirrormgr 로그를 남긴다. 실행 디렉터리의 mirrormgr.log 에 요청별 흐름이 남는다. 도움말에서 상세 로그 옵션을 확인해 응답 본문까지 남기면 레지스트리가 돌려준 JSON 오류 코드를 직접 볼 수 있다.
./mirrormgr --help
./mirrormgr version
이 사례는 원인이 확정되지 않았다. 확인된 것과 확인되지 않은 것을 구분해 둔다.
확인된 것. 특정 이미지의 손상이 아니다(실패 대상이 매번 바뀐다). 반출 자산의 무결성 문제가 아니다. 단일 Harbor 인스턴스의 문제가 아니다(다른 서버의 최신 Harbor 에서도 재현).
확인되지 않은 것. 레지스트리 컨테이너 로그의 실제 거부 사유를 확보하지 못했다. 앞단 프록시 유무와 그 설정을 확인하지 못했다. 프로젝트 쿼터 · 태그 정책이 실제로 걸려 있었는지 확인하지 못했다.
주의. 대화 과정에서 "이 증상은 mirrormgr 구버전의 알려진 결함이며 특정 버전 이상에서 고쳐졌다"는 설명과 Viya LTS 별 mirrormgr 버전 대응표가 제시됐으나, 공개된 근거로 확인되지 않아 여기에 옮기지 않는다. mirrormgr 은 주문 번호별 배포 자산에 포함되어 배포되므로, 버전 문제를 의심한다면 SAS 기술 지원에 문의하거나 해당 주문의 배포 자산에서 최신 mirrormgr 을 다시 내려받아 대조하는 편이 확실하다. (확인 필요)
받아 둔 저장소 디렉터리는 재사용해도 된다. 이미 내려받은 블롭은 already downloaded 로 건너뛰므로, 실패했다고 해서 매번 전체를 다시 받을 필요는 없다. 반대로 부분적으로 올라간 상태에서 다시 밀면 layer already uploaded 로 넘어간다. 따라서 문제 구간만 반복해 재현시키며 레지스트리 로그를 확보하는 방식으로 접근한다.