오늘도 한 뼘 더
[Storage] EC2 Storage가 계속 늘어나는 문제를 해결한다 본문
# 배경
현재 회사에서 CI/CD 툴로 Jenkins를 사용 중이다.
최근 Jenkins가 올라가 있는 EC2서버의 스토리지가 차서 Jenkins에서 빌드, 배포가 제대로 동작하지 않는 문제가 발생했다.
EC2 스토리지를 임시방편으로 늘리고 스토리지가 계속 늘어나는 원인을 찾다가 docker registry를 사용하는데 여기서 스토리지를 차지한다는 것을 알게 되었다.
# 문제
/registy 볼륨에 쌓이는 데이터들이 지워지지 않아서 스토리지가 계속 차고 있었다.
# 원인 및 해결 방법
## 원인
도커 이미지는 여러 개의 태그를 가질 수 있고, 각 이미지는 고유한 다이제스트 값을 갖는다.
registry에 같은 이미지로 계속 푸시하게 되면 registry의 이미지넌 여러 개의 다이제스트를 갖게 된다.
태그는 여러 개의 레이어로 구성되어 있는 데 특정 다이제스트를 위한 레이어 목록을 매니페스트라고 한다. 각 레이어에는 이에 해당하는 블롭이 있는 데 사용되지 않는 레이어들을 garbage collector가 삭제를 해야 하는데 제대로 동작하지 않아서 공간이 계속 차고 있었던 것으로 이해할 수 있을 것 같다.
https://betterprogramming.pub/cleanup-your-docker-registry-ef0527673e3a
## 해결 방법
레지스트리 하위의 레포지토리에서 사용하지 않는 tags의 index와 revisions에 포함된 sha256을 삭제처리하고 garbage collector로 정리를 해주는 방법을 사용하였다.
정리 전 스토리지 용량
1. repositories 디렉터리의 tags의 index와 revisions에 포함된 sha256 중 오래된 레이어들을 삭제 처리한다.
# 레포지토리 tags의 index에 있는 sha256
$ cd /data/registry/v2/repositories/[repo_name]/_manifests/tags/latest/index/sha256
# 60일 이상된 폴더를 찾아 삭제한다.
$ find . -type d -ctime +60 -exec sudo rm -r {} +
$ cd /data/registry/v2/repositories/[repo_name]/_manifests/revisions/sha256
$ find . -type d -ctime +60 -exec sudo rm -r {} +
2. docker의 garbage collector를 사용하여 정리한다.
# 밑의 명령어를 수행할때는 docker registry로 push가 발생하면 안된다.
$ docker exec registry bin/registry garbage-collect /etc/docker/registry/config.yml
정리 후 스토리지 용량
'DevOps & Infra > DevOps' 카테고리의 다른 글
[MySQL | ShellScript] 특정 컬럼만 백업해서 복원하는 스크립트 생성하기 (0) | 2024.04.05 |
---|---|
[DevOps] 무중단 배포 전략 이해하기 (0) | 2023.11.23 |
[Terraform] 테라폼 AWS Provider 설정하기 (0) | 2023.08.24 |
[Terraform] Terraform 설치하기 (0) | 2023.07.31 |
[Terraform] 테라폼 시작하기 (0) | 2023.07.24 |