정리 정책

정리 정책은 사용자가 설정한 일부 매개변수에 따라 자동으로 객체를 제거하는 주기적인 백그라운드 프로세스입니다.

컨테이너 레지스트리

컨테이너 레지스트리의 정리 정책은 단일 프로젝트에 호스팅된 모든 컨테이너 저장소에서 작동합니다. 정리 매개변수와 일치하는 모든 태그가 제거됩니다.

매개변수

ContainerExpirationPolicy에는 컨테이너 레지스트리 정리 정책의 모든 매개변수가 포함되어 있습니다.

매개변수는 두 그룹으로 나뉘어집니다.

  • 유지할 태그를 정의하는 매개변수:
    • keep_n. 가장 최근의 n개의 태그를 유지합니다.
    • name_regex_keep. 이 정규 표현식과 일치하는 태그를 유지합니다.
  • 제거할 태그를 정의하는 매개변수:
    • older_than. 이 타임스탬프보다 오래된 태그를 제거합니다.
    • name_regex. 이 정규 표현식과 일치하는 태그를 제거합니다.

나머지 매개변수는 정책이 실행되는 시점에 영향을 미칩니다.

  • enabled. 정책이 활성화되었는지 여부를 정의합니다.
  • cadence. 정책의 실행 리듬을 정의합니다.
  • next_run_at. 다음 실행이 발생해야 하는 시점을 정의합니다.

실행

우리가 처리해야 하는 정책의 수가 많기 때문에 GitLab.com에서 실행은 이 설계를 따릅니다.

  • 정책 실행은 시간으로 제한됩니다.
  • 정책 실행은 완전히 또는 부분적으로 실행됩니다.
  • 백그라운드 작업은 다음 작업이 두 가지 우선순위 중 하나에 따라 실행되어야 할 것으로 고려합니다:
    • next_run_at이 과거인 정책.
    • 부분적으로 실행된 정책.

컨테이너 저장소의 정리 정책 상태를 추적하기 위해 ContainerRepository 모델에 expiration_policy_cleanup_status가 있습니다.

이 실행을 위한 백그라운드 작업은 다음과 같이 구성됩니다.

  • 매 시간 실행되는 크론 백그라운드 작업.
  • 정책 실행이 필요한 컨테이너 저장소를 순환하는 일련의 백그라운드 작업.

크론 백그라운드 작업

크론 백그라운드 작업은 꽤 간단합니다. 주요 작업은 다음과 같습니다.

  1. 정리가 필요한 컨테이너 저장소가 있는지 확인합니다. 있을 경우, 필요한 만큼 한정된 용량의 작업을 제한 이내로 enqueue합니다.
  2. 정리 정책에 대한 메트릭을 계산하고 로깅합니다.

한정된 용량 작업

작업한정된 용량(concern)을 기반으로 합니다.

이 작업은 특정 용량(설정)까지 병렬로 실행됩니다.

이 작업의 주요 책임은 다음에 청소가 필요한 다음 컨테이너 저장소를 선택하고 관련 서비스를 호출하는 것입니다.

여기서 두 가지 우선순위를 평가하여 순서대로 실행됩니다. 컨테이너 저장소가 발견되면 정리 서비스가 호출됩니다.

특정 컨테이너 저장소에서 한 번에 한 번 청소만 실행되도록 하기 위해 데이터베이스 락과 expiration_policy_cleanup_status 열을 사용합니다.

이 작업은 더 이상 청소가 필요하지 않을 때까지 자체를 재진열합니다.

서비스

한정된 용량 작업에서 발생하는 서비스 호출은 다음과 같습니다.

flowchart TD job[한정된 용량 작업] --> 정리([ContainerExpirationPolicies::CleanupService]) 정리 --> 정리_태그([Projects::ContainerRepository::CleanupTagsService]) 정리_태그 --> 태그_제거([Projects::ContainerRepository::DeleteTagsService])

정리 태그 서비스는 특정한 실행 순서를 사용하여 제거할 태그 목록을 작성합니다.

마지막으로, 정리 태그 서비스와 태그 제거 서비스는 퍼사드를 사용하여 작동합니다. 실제 구현은 연결된 컨테이너 레지스트리의 유형에 따라 다릅니다. GitLab 컨테이너 레지스트리가 연결되어 있는 경우, 컨테이너 레지스트리 API의 더 나은 활용과 같은 여러 개선이 가능하며 정리 정책 실행 중에 사용됩니다.

과거 참조 링크