12.7. 레지스트리 하드 정리

OpenShift Container Registry는 OpenShift Container Platform 클러스터의 etcd에서 참조하지 않는 Blob을 누적할 수 있습니다. 따라서 기본 이미지 정리 절차를 수행할 수 없습니다. 이를 고립된 Blob이라고 합니다.

고립된 Blob은 다음과 같은 시나리오에서 발생할 수 있습니다.

  • etcd의 이미지만 제거하고 레지스트리 스토리지의 이미지는 제거하지 않는 oc delete image <sha256:image-id> 명령을 사용하여 이미지를 수동으로 삭제합니다.
  • 데몬 오류로 인해 시작된 레지스트리로 내보내서 일부 Blob은 업로드되지만 (최종 구성 요소로 업로드되는) 이미지 매니페스트는 업로드되지 않습니다. 모든 고유 이미지 Blob이 고립됩니다.
  • OpenShift Container Platform에서 할당량 제한 때문에 이미지를 거부합니다.
  • 표준 이미지 정리기에서 이미지 매니페스트를 삭제하지만 관련 Blob을 삭제하기 전에 중단됩니다.
  • 의도한 Blob을 제거하지 못하는 레지스트리 정리기 버그로 인해 해당 Blob을 참조하는 이미지 오브젝트가 제거되고 Blob이 고립됩니다.

기본 이미지 정리와 별도의 절차인 레지스트리 하드 정리를 수행하면 클러스터 관리자가 고립된 Blob을 제거할 수 있습니다. OpenShift Container Registry의 스토리지 공간이 부족하고 고립된 Blob이 있다고 생각되면 하드 정리를 수행해야 합니다.

이 작업은 드물게 수행해야 하며 상당한 수의 고립이 새롭게 생성되었다는 증거가 있는 경우에만 필요합니다. 이러한 경우가 아니라면 생성되는 이미지 수에 따라 하루에 한 번과 같이 일정한 간격으로 표준 이미지를 정리하면 됩니다.

프로세스

레지스트리에서 고립된 Blob을 하드 정리하려면 다음을 수행합니다.

  1. 로그인합니다.

    CLI를 사용하여 kubeadmin 또는 openshift-image-registry 네임스페이스에 액세스할 수 있는 권한이 있는 다른 사용자로 클러스터에 로그인합니다.

  2. 기본 이미지 정리를 실행합니다.

    기본 이미지 정리에서는 더 이상 필요하지 않은 추가 이미지를 제거합니다. 하드 정리는 이미지를 자체적으로 제거하지 않습니다. 레지스트리 스토리지에 저장된 Blob만 제거합니다. 따라서 하드 정리 전에 기본 이미지 정리를 실행해야 합니다.

  3. 레지스트리를 읽기 전용 모드로 전환합니다.

    레지스트리가 읽기 전용 모드로 실행되지 않는 경우 정리 작업과 동시에 발생하는 모든 내보내기 작업에서 다음 중 하나를 수행합니다.

    • 실패 및 새로운 고립 발생
    • 이미지를 가져올 수 없지만 성공(참조된 Blob 중 일부가 삭제되었기 때문에)

    내보내기 작업은 레지스트리가 다시 읽기-쓰기 모드로 전환될 때까지 실패합니다. 따라서 하드 정리는 신중하게 계획해야 합니다.

    레지스트리를 읽기 전용 모드로 전환하려면 다음을 수행합니다.

    1. configs.imageregistry.operator.openshift.io/cluster에서 spec.readOnlytrue로 설정합니다.

      $ oc patch configs.imageregistry.operator.openshift.io/cluster -p '{"spec":{"readOnly":true}}' --type=merge
  4. system:image-pruner 역할을 추가합니다.

    일부 리소스를 나열하는 데에는 레지스트리 인스턴스를 실행하는 데 사용하는 서비스 계정에 추가 권한이 필요합니다.

    1. 서비스 계정 이름을 가져옵니다.

      $ service_account=$(oc get -n openshift-image-registry \
          -o jsonpath='{.spec.template.spec.serviceAccountName}' deploy/image-registry)
    2. system:image-pruner 클러스터 역할을 서비스 계정에 추가합니다.

      $ oc adm policy add-cluster-role-to-user \
          system:image-pruner -z \
          ${service_account} -n openshift-image-registry
  5. 선택 사항: 시험 실행 모드에서 정리기를 실행합니다.

    제거되는 Blob 수를 보려면 시험 실행 모드에서 하드 정리기를 실행합니다. 실제로는 변경되지 않습니다. 다음 예제에서는 image-registry-3-vhndw라는 이미지 레지스트리 Pod를 참조합니다.

    $ oc -n openshift-image-registry exec pod/image-registry-3-vhndw -- /bin/sh -c '/usr/bin/dockerregistry -prune=check'

    또는 정리 후보에 대한 정확한 경로를 가져오도록 로깅 수준을 높입니다.

    $ oc -n openshift-image-registry exec pod/image-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

  6. 하드 정리를 실행합니다.

    image-registry Pod에서 실행 중인 하나의 인스턴스 내에서 다음 명령을 실행하여 하드 정리를 실행합니다. 다음 예제에서는 image-registry-3-vhndw라는 이미지 레지스트리 Pod를 참조합니다.

    $ oc -n openshift-image-registry exec pod/image-registry-3-vhndw -- /bin/sh -c '/usr/bin/dockerregistry -prune=delete'

    출력 예

    Deleted 13374 blobs
    Freed up 2.835 GiB of disk space

  7. 레지스트리를 다시 읽기-쓰기 모드로 전환합니다.

    정리가 완료되면 레지스트리를 다시 읽기-쓰기 모드로 전환할 수 있습니다. configs.imageregistry.operator.openshift.io/cluster에서 spec.readOnlyfalse로 설정합니다.

    $ oc patch configs.imageregistry.operator.openshift.io/cluster -p '{"spec":{"readOnly":false}}' --type=merge