19.7. 레지스트리 하드 정리
OpenShift Container Registry는 OpenShift Container Platform 클러스터의 etcd에서 참조하지 않는 Blob을 누적할 수 있습니다. 따라서 기본 이미지 정리 절차를 수행할 수 없습니다. 이를 고립된 Blob이라고 합니다.
고립된 Blob은 다음과 같은 시나리오에서 발생할 수 있습니다.
-
etcd의 이미지만 제거하고 레지스트리 스토리지의 이미지는 제거하지 않는
oc delete image <sha256:image-id>
명령을 사용하여 이미지를 수동으로 삭제합니다. - docker 데몬 오류로 인해 시작된 레지스트리로 내보내 일부 Blob이 업로드되지만 (최종 구성 요소로 업로드되는) 이미지 매니페스트는 업로드되지 않습니다. 모든 고유 이미지 Blob이 고립됩니다.
- OpenShift Container Platform에서 할당량 제한 때문에 이미지를 거부합니다.
- 표준 이미지 정리기에서 이미지 매니페스트를 삭제하지만 관련 Blob을 삭제하기 전에 중단됩니다.
- 의도한 Blob을 제거하지 못하는 레지스트리 정리기 버그로 인해 해당 Blob을 참조하는 이미지 오브젝트가 제거되고 Blob이 고립됩니다.
기본 이미지 정리와 별도의 절차인 레지스트리 하드 정리를 사용하면 고립된 Blob을 제거할 수 있습니다. OpenShift Container Registry의 스토리지 공간이 부족하고 고립된 Blob이 있다고 생각되면 하드 정리를 수행해야 합니다.
이 작업은 드물게 수행해야 하며 상당한 수의 고립이 새롭게 생성되었다는 증거가 있는 경우에만 필요합니다. 이러한 경우가 아니라면 생성되는 이미지 수에 따라 하루에 한 번과 같이 일정한 간격으로 표준 이미지를 정리하면 됩니다.
레지스트리에서 고립된 Blob을 하드 정리하려면 다음을 수행합니다.
- 로그인: 액세스 토큰이 있는 사용자로 CLI 를 사용하여 로그인합니다.
기본 이미지 정리를 실행합니다. 기본 이미지 정리에서는 더 이상 필요하지 않은 추가 이미지를 제거합니다. 하드 정리는 이미지를 자체적으로 제거하지 않습니다. 레지스트리 스토리지에 저장된 Blob만 제거합니다. 따라서 하드 정리 전에 기본 이미지 정리를 실행해야 합니다.
단계는 이미지 정리를 참조하십시오.
레지스트리를 읽기 전용 모드로 전환: 레지스트리가 읽기 전용 모드로 실행되지 않는 경우 정리 작업과 동시에 발생하는 모든 내보내기 작업에서 다음 중 하나를 수행합니다.
- 실패 및 새로운 고립 발생
- 이미지를 가져올 수 없지만 성공합니다(참조된 Blob 중 일부가 삭제되었기 때문에).
내보내기 작업은 레지스트리가 다시 읽기-쓰기 모드로 전환될 때까지 실패합니다. 따라서 하드 정리는 신중하게 계획해야 합니다.
레지스트리를 읽기 전용 모드로 전환하려면 다음을 수행합니다.
다음 환경 변수를 설정합니다.
$ oc set env -n default \ dc/docker-registry \ 'REGISTRY_STORAGE_MAINTENANCE_READONLY={"enabled":true}'
기본적으로 이전 단계가 완료되면 레지스트리가 자동으로 다시 배포되어야 합니다. 계속하기 전에 재배포가 완료될 때까지 기다립니다. 그러나 이러한 트리거를 비활성화한 경우 새 환경 변수가 선택되도록 수동으로 레지스트리를 재배포해야 합니다.
$ oc rollout -n default \ latest dc/docker-registry
system:image-pruner 역할을 추가합니다. 일부 리소스를 나열하는 데에는 레지스트리 인스턴스를 실행하는 데 사용하는 서비스 계정에 추가 권한이 필요합니다.
서비스 계정 이름을 가져옵니다.
$ service_account=$(oc get -n default \ -o jsonpath=$'system:serviceaccount:{.metadata.namespace}:{.spec.template.spec.serviceAccountName}\n' \ dc/docker-registry)
system:image-pruner 클러스터 역할을 서비스 계정에 추가합니다.
$ oc adm policy add-cluster-role-to-user \ system:image-pruner \ ${service_account}
(선택 사항) 시험 실행 모드에서 정리기를 실행합니다 : 제거되는 Blob 수를 보려면 시험 실행 모드에서 하드 정리기를 실행합니다. 실제로는 변경되지 않습니다.
$ oc -n default \ exec -i -t "$(oc -n default get pods -l deploymentconfig=docker-registry \ -o jsonpath=$'{.items[0].metadata.name}\n')" \ -- /usr/bin/dockerregistry -prune=check
또는 정리 후보에 대한 정확한 경로를 가져오도록 로깅 수준을 높입니다.
$ oc -n default \ exec "$(oc -n default get pods -l deploymentconfig=docker-registry \ -o jsonpath=$'{.items[0].metadata.name}\n')" \ -- /bin/sh \ -c 'REGISTRY_LOG_LEVEL=info /usr/bin/dockerregistry -prune=check'
잘린 샘플 출력
$ oc exec docker-registry-3-vhndw \ -- /bin/sh -c 'REGISTRY_LOG_LEVEL=info /usr/bin/dockerregistry -prune=check' time="2017-06-22T11:50:25.066156047Z" level=info msg="start prune (dry-run mode)" distribution_version="v2.4.1+unknown" kubernetes_version=v1.6.1+$Format:%h$ openshift_version=unknown time="2017-06-22T11:50:25.092257421Z" level=info msg="Would delete blob: sha256:00043a2a5e384f6b59ab17e2c3d3a3d0a7de01b2cabeb606243e468acc663fa5" go.version=go1.7.5 instance.id=b097121c-a864-4e0c-ad6c-cc25f8fdf5a6 time="2017-06-22T11:50:25.092395621Z" level=info msg="Would delete blob: sha256:0022d49612807cb348cabc562c072ef34d756adfe0100a61952cbcb87ee6578a" go.version=go1.7.5 instance.id=b097121c-a864-4e0c-ad6c-cc25f8fdf5a6 time="2017-06-22T11:50:25.092492183Z" level=info msg="Would delete blob: sha256:0029dd4228961086707e53b881e25eba0564fa80033fbbb2e27847a28d16a37c" go.version=go1.7.5 instance.id=b097121c-a864-4e0c-ad6c-cc25f8fdf5a6 time="2017-06-22T11:50:26.673946639Z" level=info msg="Would delete blob: sha256:ff7664dfc213d6cc60fd5c5f5bb00a7bf4a687e18e1df12d349a1d07b2cf7663" go.version=go1.7.5 instance.id=b097121c-a864-4e0c-ad6c-cc25f8fdf5a6 time="2017-06-22T11:50:26.674024531Z" level=info msg="Would delete blob: sha256:ff7a933178ccd931f4b5f40f9f19a65be5eeeec207e4fad2a5bafd28afbef57e" go.version=go1.7.5 instance.id=b097121c-a864-4e0c-ad6c-cc25f8fdf5a6 time="2017-06-22T11:50:26.674675469Z" level=info msg="Would delete blob: sha256:ff9b8956794b426cc80bb49a604a0b24a1553aae96b930c6919a6675db3d5e06" go.version=go1.7.5 instance.id=b097121c-a864-4e0c-ad6c-cc25f8fdf5a6 ... Would delete 13374 blobs Would free up 2.835 GiB of disk space Use -prune=delete to actually delete the data
하드 정리를 실행합니다. docker-registry Pod에서 실행 중인 하나의 인스턴스 내에서 다음 명령을 실행하여 하드 정리를 실행합니다.
$ oc -n default \ exec -i -t "$(oc -n default get pods -l deploymentconfig=docker-registry -o jsonpath=$'{.items[0].metadata.name}\n')" \ -- /usr/bin/dockerregistry -prune=delete
샘플 출력
$ oc exec docker-registry-3-vhndw \ -- /usr/bin/dockerregistry -prune=delete Deleted 13374 blobs Freed up 2.835 GiB of disk space
레지스트리를 읽기-쓰기 모드로 다시 전환합니다. 정리가 완료되면 다음을 실행하여 레지스트리를 다시 읽기-쓰기 모드로 전환할 수 있습니다.
$ oc set env -n default dc/docker-registry REGISTRY_STORAGE_MAINTENANCE_READONLY-