10.6. 수동으로 이미지 제거

정리 사용자 정의 리소스를 사용하면 이미지를 자동으로 정리할 수 있습니다. 그러나 관리자는 기간, 상태 또는 제한 초과로 인해 시스템에서 더 이상 필요하지 않은 이미지를 수동으로 정리할 수 있습니다. 이미지를 수동으로 정리하는 방법은 다음 두 가지입니다.

  • 클러스터에서 Job 또는 CronJob으로 이미지 정리를 실행합니다.
  • oc adm prune images 명령을 실행합니다.

사전 요구 사항

  • 이미지를 정리하려면 먼저 액세스 토큰이 있는 사용자로 CLI에 로그인해야 합니다. 사용자에게 system:image-pruner 클러스터 이상의 역할(예: cluster-admin)이 있어야 합니다.
  • 이미지 레지스트리를 노출합니다.

프로세스

수명, 상태 또는 제한 초과로 인해 시스템에서 더 이상 필요하지 않은 이미지를 수동으로 정리하려면 다음 방법 중 하나를 사용합니다.

  • pruner 서비스 계정에 대한 YAML 파일을 생성하여 클러스터에서 Job 또는 CronJob으로 이미지 정리를 실행합니다. 예를 들면 다음과 같습니다.

    $ oc create -f <filename>.yaml

    출력 예

    kind: List
    apiVersion: v1
    items:
    - apiVersion: v1
      kind: ServiceAccount
      metadata:
        name: pruner
        namespace: openshift-image-registry
    - apiVersion: rbac.authorization.k8s.io/v1
      kind: ClusterRoleBinding
      metadata:
        name: openshift-image-registry-pruner
      roleRef:
        apiGroup: rbac.authorization.k8s.io
        kind: ClusterRole
        name: system:image-pruner
      subjects:
      - kind: ServiceAccount
        name: pruner
        namespace: openshift-image-registry
    - apiVersion: batch/v1beta1
      kind: CronJob
      metadata:
        name: image-pruner
        namespace: openshift-image-registry
      spec:
        schedule: "0 0 * * *"
        concurrencyPolicy: Forbid
        successfulJobsHistoryLimit: 1
        failedJobsHistoryLimit: 3
        jobTemplate:
          spec:
            template:
              spec:
                restartPolicy: OnFailure
                containers:
                - image: "quay.io/openshift/origin-cli:4.1"
                  resources:
                    requests:
                      cpu: 1
                      memory: 1Gi
                  terminationMessagePolicy: FallbackToLogsOnError
                  command:
                  - oc
                  args:
                  - adm
                  - prune
                  - images
                  - --certificate-authority=/var/run/secrets/kubernetes.io/serviceaccount/service-ca.crt
                  - --keep-tag-revisions=5
                  - --keep-younger-than=96h
                  - --confirm=true
                  name: image-pruner
                serviceAccountName: pruner

  • oc adm prune images [<options>] 명령을 실행합니다.

    $ oc adm prune images [<options>]

    --prune-registry=false를 사용하지 않는 한 이미지를 정리하면 통합 레지스트리에서 데이터가 제거됩니다.

    --namespace 플래그를 사용하여 이미지를 정리하면 이미지는 제거되지 않고 스트림만 제거됩니다. 이미지는 네임스페이스가 아닌 리소스입니다. 따라서 특정 네임스페이스로 정리를 제한하면 현재 사용량을 계산할 수 없습니다.

    기본적으로 통합 레지스트리는 스토리지에 대한 요청 수를 줄이고 요청 처리 속도를 높이기 위해 Blob의 메타데이터를 캐시합니다. 정리를 수행해도 통합 레지스트리 캐시는 업데이트되지 않습니다. 캐시에 메타데이터가 있는 정리된 계층은 내보낼 수 없기 때문에 정리 후에도 정리된 계층이 포함된 이미지는 손상됩니다. 따라서 정리 후 캐시를 지우려면 레지스트리를 재배포해야 합니다.

    $ oc rollout restart deployment/image-registry -n openshift-image-registry

    통합 레지스트리에서 Redis 캐시를 사용하는 경우 데이터베이스를 수동으로 정리해야 합니다.

    정리 후 레지스트리를 재배포하는 것이 옵션이 아닌 경우 캐시를 영구적으로 비활성화해야 합니다.

    oc adm prune images 작업에는 레지스트리 경로가 필요합니다. 레지스트리 경로는 기본적으로 생성되지 않습니다.

    이미지 CLI 구성 옵션 정리 테이블에는 oc adm prune images <options> 명령과 함께 사용할 수 있는 옵션이 설명되어 있습니다.

    표 10.4. 이미지 CLI 구성 옵션 정리

    옵션설명

    --all

    레지스트리로 내보내지 않았지만 pullthrough에 의해 미러링된 이미지를 포함합니다. 기본적으로 활성화되어 있습니다. 통합 레지스트리로 내보낸 이미지로 정리를 제한하려면 --all=false를 전달합니다.

    --certificate-authority

    OpenShift Container Platform 관리 레지스트리와 통신할 때 사용할 인증 기관 파일의 경로입니다. 기본값은 현재 사용자 구성 파일의 인증 기관 데이터입니다. 제공되는 경우 보안 연결이 시작됩니다.

    --confirm

    테스트를 실행하는 대신 정리를 수행해야 함을 나타냅니다. 이를 위해서는 통합 컨테이너 이미지 레지스트리에 대한 올바른 경로가 필요합니다. 이 명령을 클러스터 네트워크 외부에서 실행하는 경우 --registry-url을 사용하여 경로를 제공해야 합니다.

    --force-insecure

    이 옵션에는 주의가 필요합니다. HTTP를 통해 호스팅되거나 잘못된 HTTPS 인증서가 있는 컨테이너 레지스트리에 비보안 연결을 허용합니다.

    --keep-tag-revisions=<N>

    이미지 스트림별 이미지 리버전을 태그당 최대 N개(기본값 3)로 유지합니다.

    --keep-younger-than=<duration>

    현재 시간을 기준으로 <duration> 이내의 이미지를 정리하지 않습니다. 또는 현재 시간을 기준으로 <duration>(기본값 60분) 이내의 다른 오브젝트에서 참조하는 이미지를 정리하지 않습니다.

    --prune-over-size-limit

    동일한 프로젝트에 정의된 최소 제한을 초과하는 모든 이미지를 정리합니다. 이 플래그는 --keep-tag-revisions 또는 --keep-younger-than과 결합할 수 없습니다.

    --registry-url

    레지스트리에 연결할 때 사용하는 주소입니다. 이 명령에서는 관리되는 이미지 및 이미지 스트림으로 결정되는 클러스터 내부 URL을 사용하려고 합니다. 실패하는 경우(레지스트리를 해석하거나 연결할 수 없음) 이 플래그를 사용하여 작동하는 대체 경로를 제공해야 합니다. 레지스트리 호스트 이름은 특정 연결 프로토콜을 적용하는 https:// 또는 http:// 접두사로 지정할 수 있습니다.

    --prune-registry

    이 옵션은 다른 옵션에서 지정하는 조건과 함께 OpenShift Container Platform Image API 오브젝트에 해당하는 레지스트리 데이터를 정리할지 여부를 제어합니다. 기본적으로 이미지 정리 작업은 Image API 오브젝트와 레지스트리의 해당 데이터를 모두 처리합니다.

    이 옵션은 이미지 오브젝트 수를 줄이기 위해 etcd 콘텐츠만 제거하고 레지스트리 스토리지는 정리하지 않으려는 경우 또는 레지스트리의 적절한 유지보수 기간 동안 레지스트리를 하드 정리하여 이미지 정리 작업을 별도로 수행하려는 경우 유용합니다.

10.6.1. 이미지 정리 조건

수동으로 정리한 이미지에 조건을 적용할 수 있습니다.

  • OpenShift Container Platform에서 관리하는 이미지 또는 주석 openshift.io/image.managed가 있는 이미지를 제거하려면 다음을 수행합니다.

    • 최소 --keep-younger-than분 이내에 생성했으며 다음 중 어느 것도 현재 이 이미지를 참조하지 않습니다.

      • --keep-younger-than분 이내에 생성한 Pod
      • --keep-younger-than분 이내에 생성한 이미지 스트림
      • 실행 중인 Pod
      • 보류 중인 Pod
      • 복제 컨트롤러
      • 배포
      • 배포 구성
      • 복제본 세트
      • 빌드 구성
      • 빌드
      • stream.status.tags[].items--keep-tag-revisions 최근 항목
    • 동일한 프로젝트에 정의된 최소 제한을 초과하고 현재 다음 항목에서 참조하지 않습니다.

      • 실행 중인 Pod
      • 보류 중인 Pod
      • 복제 컨트롤러
      • 배포
      • 배포 구성
      • 복제본 세트
      • 빌드 구성
      • 빌드
  • 외부 레지스트리에서 정리를 지원하지 않습니다.
  • 이미지를 정리하면 status.tags에 이미지에 대한 참조가 있는 모든 이미지 스트림에서 이미지에 대한 참조가 모두 제거됩니다.
  • 이미지에서 더 이상 참조하지 않는 이미지 계층이 제거됩니다.
참고

--prune-over-size-limit 플래그는 --keep-tag-revisions 플래그 또는 --keep-younger-than 플래그와 결합할 수 없습니다. 해당 플래그를 결합하면 이 작업을 수행할 수 없다는 정보가 반환됩니다.

--prune-registry=false를 사용하여 OpenShift Container Platform Image API 오브젝트와 레지스트리의 이미지 데이터를 제거하는 작업을 분리한 후 레지스트리를 하드 정리하면 타이밍 기간이 줄어들고 하나의 명령을 사용하여 정리할 때보다 더 안전합니다. 그러나 시차가 완전히 제거되지는 않습니다.

예를 들어 정리 작업에서 정리할 이미지를 확인하는 동안 이미지를 참조하는 Pod를 계속 생성할 수 있습니다. 삭제된 콘텐츠에 대한 참조를 줄일 수 있도록 정리 작업 중 생성되어 해당 이미지를 참조할 수 있는 API 오브젝트를 계속 추적해야 합니다.

--prune-registry 옵션을 사용하지 않거나 --prune-registry=true옵션을 사용하여 다시 정리하면 이전에 --prune-registry=false를 사용하여 정리한 이미지의 이미지 레지스트리와 연결된 스토리지가 정리되지 않습니다. --prune-registry=false를 사용하여 정리한 이미지는 레지스트리 하드 정리를 통해서만 레지스트리 스토리지에서 삭제할 수 있습니다.