12.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/v1
      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> 명령과 함께 사용할 수 있는 옵션이 설명되어 있습니다.

    표 12.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 콘텐츠만 제거하고 레지스트리 스토리지는 정리하지 않으려는 경우 또는 레지스트리의 적절한 유지보수 기간 동안 레지스트리를 하드 정리하여 이미지 정리 작업을 별도로 수행하려는 경우 유용합니다.

12.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를 사용하여 정리한 이미지는 레지스트리 하드 정리를 통해서만 레지스트리 스토리지에서 삭제할 수 있습니다.

12.6.2. 이미지 정리 작업 실행

프로세스

  1. 정리 작업에서 삭제하는 항목을 확인하려면 다음을 수행합니다.

    1. 태그 리버전을 3개까지 유지하고 60분 이내의 리소스(이미지, 이미지 스트림, Pod)를 유지합니다.

      $ oc adm prune images --keep-tag-revisions=3 --keep-younger-than=60m
    2. 정의된 제한을 초과하는 모든 이미지를 정리합니다.

      $ oc adm prune images --prune-over-size-limit
  2. 위 단계의 옵션을 사용하여 정리 작업을 수행하려면 다음 단계를 수행합니다.

    $ oc adm prune images --keep-tag-revisions=3 --keep-younger-than=60m --confirm
    $ oc adm prune images --prune-over-size-limit --confirm

12.6.3. 보안 또는 비보안 연결 사용

보안 연결은 선호되고 권장되는 접근 방식입니다. 필수 인증서 확인과 함께 HTTPS 프로토콜을 통해 수행됩니다. prune 명령에서는 가능한 경우 항상 필수 인증서 확인을 사용하려고 합니다. 불가능한 경우 일부 사례에서 비보안 연결로 대체할 수 있는데 이는 위험합니다. 이 경우 인증서 확인을 건너뛰거나 일반 HTTP 프로토콜을 사용합니다.

다음의 경우 --certificate-authority를 지정하지 않는 한 비보안 연결로 대체할 수 있습니다.

  1. prune 명령이 --force-insecure 옵션과 함께 실행됩니다.
  2. 제공된 registry-urlhttp:// 스키마로 시작됩니다.
  3. 제공된 registry-url이 로컬 링크 주소이거나 localhost입니다.
  4. 현재 사용자의 구성에서 비보안 연결을 허용합니다. 이는 사용자가 --insecure-skip-tls-verify를 사용하여 로그인하거나 메시지가 표시되었을 때 비보안 연결을 선택했기 때문에 발생할 수 있습니다.
중요

OpenShift Container Platform에서 사용하는 인증 기관과 다른 인증 기관에서 레지스트리를 보호하는 경우 --certificate-authority 플래그를 사용하여 지정해야 합니다. 그러지 않으면 prune 명령이 오류와 함께 실패합니다.

12.6.4. 이미지 정리 문제

이미지가 정리되지 않음

이미지가 계속 누적되고 prune 명령을 실행해도 예상한 이미지의 일부만 제거되는 경우 이미지를 정리 후보로 간주하기 위해 적용해야 하는 이미지 정리 조건을 이해하고 있는지 확인하십시오.

제거할 이미지가 각 태그 내역에서 선택한 태그 리버전 임계값보다 위에 있어야 합니다. 예를 들어 sha:abz라는 오래되고 더 이상 사용되지 않는 이미지를 고려해 보십시오. 이미지에 태그가 지정된 네임스페이스 N에서 다음 명령을 실행하면 myapp이라는 단일 이미지 스트림에서 이미지에 태그가 세 번 지정됩니다.

$ oc get is -n N -o go-template='{{range $isi, $is := .items}}{{range $ti, $tag := $is.status.tags}}'\
  '{{range $ii, $item := $tag.items}}{{if eq $item.image "'"sha:abz"\
  $'"}}{{$is.metadata.name}}:{{$tag.tag}} at position {{$ii}} out of {{len $tag.items}}\n'\
  '{{end}}{{end}}{{end}}{{end}}'

출력 예

myapp:v2 at position 4 out of 5
myapp:v2.1 at position 2 out of 2
myapp:v2.1-may-2016 at position 0 out of 1

기본 옵션을 사용하면 myapp:v2.1-may-2016 태그 기록의 위치 0에서 이미지 정리가 수행되지 않으므로 이미지가 정리되지 않습니다. 정리할 이미지에 대해 관리자는 다음 중 하나를 수행해야 합니다.

  • oc adm prune images 명령을 사용하여 --keep-tag-revisions=0을 지정합니다.

    주의

    이 작업에서는 태그가 지정된 임계값 미만이거나 지정된 임계값 미만의 오브젝트에서 참조하는 경우를 제외하고 기본 이미지가 있는 모든 네임스페이스에서 태그를 모두 제거합니다.

  • 위치가 리버전 임계값 미만인 istags를 모두 삭제합니다. 즉 myapp:v2.1myapp:v2.1-may-2016을 삭제합니다.
  • 새 빌드를 동일한 istag로 내보내거나 다른 이미지에 태그를 지정하여 내역에서 이미지를 더 이동합니다. 이전 릴리스 태그에는 이 작업이 적절하지 않을 수 있습니다.

이미지를 정의되지 않은 시간 동안 보존해야 하는 경우를 제외하고 이름에 특정 이미지 빌드의 날짜 또는 시간이 포함된 태그는 사용하지 않도록 합니다. 이러한 태그는 내역에 하나의 이미지만 있어 정리되지 않습니다.

비보안 레지스트리에 대한 보안 연결 사용

oc adm prune images 명령 출력에 다음과 유사한 메시지가 표시되면 레지스트리가 안전하지 않은 것이며 oc adm prune images 클라이언트에서 보안 연결을 사용하려고 합니다.

error: error communicating with registry: Get https://172.30.30.30:5000/healthz: http: server gave HTTP response to HTTPS client
  • 해결책은 레지스트리를 보호하는 것이 좋습니다. 또는 명령에 --force-insecure를 추가하여 클라이언트에서 비보안 연결을 사용하도록 할 수 있지만 이 방법은 권장되지 않습니다.
보안 레지스트리에 대해 비보안 연결 사용

oc adm prune images 명령 출력에 다음 오류 중 하나가 표시되면 연결 확인을 위해 oc adm prune images 클라이언트에서 사용하는 인증 기관이 아닌 다른 인증 기관에서 서명한 인증서를 사용하여 레지스트리를 보호하고 있음을 나타냅니다.

error: error communicating with registry: Get http://172.30.30.30:5000/healthz: malformed HTTP response "\x15\x03\x01\x00\x02\x02"
error: error communicating with registry: [Get https://172.30.30.30:5000/healthz: x509: certificate signed by unknown authority, Get http://172.30.30.30:5000/healthz: malformed HTTP response "\x15\x03\x01\x00\x02\x02"]

기본적으로 사용자의 구성 파일에 저장된 인증 기관 데이터가 사용됩니다. Master API와의 통신도 마찬가지입니다.

--certificate-authority 옵션을 사용하여 컨테이너 이미지 레지스트리 서버에 대한 올바른 인증 기관을 제공합니다.

잘못된 인증 기관 사용

다음 오류는 보안 컨테이너 이미지 레지스트리의 인증서에 서명하는 데 사용하는 인증 기관이 클라이언트에서 사용하는 기관과 다르다는 것을 나타냅니다.

error: error communicating with registry: Get https://172.30.30.30:5000/: x509: certificate signed by unknown authority

--certificate-authority 플래그를 사용하여 올바른 정보를 제공하십시오.

해결 방법으로 --force-insecure 플래그를 대신 추가할 수도 있습니다. 하지만 이 방법은 권장되지 않습니다.

추가 리소스