안녕하세요~!~!~! 요 근래 파묻혀 있던 자료 작성이 끝나서
간만에 돌아왔습니다.
오늘은 Azure Container Registry에서 오래된 이미지를 삭제하는 기능을 소개해 보도록 하겠습니다.

Azure Container Registry(ACR)가 뭐예요?

컨테이너 환경을 구축하다 보면 private registry가 필요한 경우가 생겨납니다.
(public으로...가 불가능한 건 아니겠지만 매니지드 컨테이너 레지스트리를 퍼블릭용으로 쓰면 인보이스로
자본주의의 맛을 보실 수 있습니다. 그냥 docker hub에 올리는 게..)
harbor처럼 오픈소스를 이용해서 직접 본인의 환경에 구축할 수도 있지만,
요즘은 세상이 너무 좋아져서(..) 각 CSP에서 private registry를 제공하므로,
registry 운영에 대한 어떠한 부담도(금전적 부담 제외^^;;;;) 없이 쉽게 만들 수 있습니다.
ACR은 말 그대로 Azure에서 제공하는 container registry 입니다.
요 제품의 설명서는 공식문서 https://docs.microsoft.com/ko-kr/azure/container-registry/container-registry-intro 에서 찾아보실 수 있겠습니다.
관리형 컨테이너 레지스트리 - Azure Container Registry
클라우드 기반의 관리되는 프라이빗 Docker 레지스트리를 제공하는 Azure Container Registry 서비스에 대한 소개입니다.
docs.microsoft.com
오래된, 사용하지 않는 이미지를 왜 삭제해야 하나요?
디스크를 정리하는 것과 비슷한 이유입니다.
그리고 퍼블릭 클라우드니까요, 가장 중요한 이유는 돈 입니다.
ACR은 클래스(등급)에 따라 기본 제공되는 스토리지 용량이 있지만,
용량이 초과되는 경우 추가 과금이 발생합니다. 아래의 가격 정보를 보시죠 !

사용하지도 않는 오래된 이미지들 때문에 과금이 계속된다?
재무팀이 함박웃음을 지으며 달려올 이야기입니다.
물론 스토리지 비용이 정말... 낮기는 합니다만, 굳이 쓰지도 않을 이미지 저장에 돈을 계속해서 낼 필요는 없죠.
그래서 오래된, 사용하지 않는 이미지를 삭제해서 레지스트리를 정리해 주도록 하겠습니다.
이 작업의 전제 조건은 다음과 같습니다.
전제 1. acr을 사용하고 있다(당연함)
전제 2. azure acr cli가 사용 가능한 환경이고, service principal 또는 계정을 통해 acr 이미지 삭제가 가능하다.(권한)
전제 3. crontab으로 하든 다른 방식으로든 스케쥴 설정이 가능하다. (acr task를 통해서도 설정 가능)
전제 4. azure cli(acr cli 말고 azure cli)가 사용 가능한 환경이다.
설명은 shellscript를 기준으로 작성되었습니다~^^b
어떻게 삭제하나요?
사실, 그 전까지만 해도 전체 untagging 작업을 하고 삭제하는 작업을 하는
두 번의 작업이 필요했는데요, Azure에서 acr용 cli를 만들어 주셨습니다.
아직 preview 단계이긴 한데... 뭐 preview라도 동작 자체는 간단하기 때문에 문제가 없겠습니다.
(만약 acr cli를 정말 쓰기 싫고 순정 azure cli만 써야 하는 경우 아래를 참조하시기 바랍니다.
하지만..번거로워요ㅠㅠ https://docs.microsoft.com/ko-kr/azure/container-registry/container-registry-delete)
말이 길었는데 이제 시작해 보겠습니다!
단계 1. acr cli 설치
요거는 MS에서 제공하는데 아직 preview라 깃헙에 있거든요.. 깃헙 보시고 설치하시면 됩니다.
https://github.com/Azure/acr-cli
GitHub - Azure/acr-cli: Command Line Tool for interacting with Azure Container Registry Images
Command Line Tool for interacting with Azure Container Registry Images - GitHub - Azure/acr-cli: Command Line Tool for interacting with Azure Container Registry Images
github.com
단계 2. acr login
acr에 접근하려면 로그인해야겠죠? 로그인합니다.
acr login
의도한 동작이겠지만, azure cli의 인증 정보로도 같이 사용이 가능합니다.
acr login보다는 azure cli에서 로그인하고, 그 인증 정보를 끌어다 쓰는 경우가 더 일반적일 것 같아
az login을 해 보겠습니다. az login을 하고 사용하면 굳이 acr login은 칠 일이 없습니다.
이후 이미지를 가져올 때도 azure cli를 이용해서 정보를 가져올 거라, az login으로 하시면 되겠습니다.
az login
로그인이 되었다면, 아래와 같은 방식으로 오래된 이미지를 삭제할 수 있습니다.
az login --service-principal -u $CLIENT_ID -p $CLIENT_SECRET -t $TENANT_ID
# 앞서 말씀드림 대로, az login을 먼저 수행합니다.
# 저는 service principal을 이용해서 로그인하므로, --service-principal 옵션을 사용했습니다.
# 개인 계정으로 로그인하실거면 그거에 맞게 작성하시면 되겠습니다~
# 아래의 내용은
# shellscript 기준으로 작성되었습니다.
for i in \$(az acr repository list -n {삭제를 수행할 acr 이름} -o tsv); do
acr purge -u $CLIENT_ID -p $CLIENT_SECRET --ago 30d --untagged --keep 4 --registry \
{acr이름}.azurecr.io --filter \$i:.*;
done
보시면 감이 오시겠지만, acr purge 명령어를 이용합니다.
관련 설명: https://docs.microsoft.com/ko-kr/azure/container-registry/container-registry-auto-purge
태그 및 매니페스트 제거 - Azure Container Registry
제거 명령을 사용하여 연령 및 태그 필터를 기준으로 Azure 컨테이너 레지스트리에서 여러 태그와 매니페스트를 삭제하고 필요에 따라 제거 작업을 예약합니다.
docs.microsoft.com
그리고 위의 예제를 보시면 ??? 뭐야 az login 하고 purge 뒤에 또 인증정보가 있는데? 로그인 왜함?
이라고 생각을 하실 수도 있는데, 버그인지 의도된 건진 모르겠지만 purge 뒤의 인증정보가 없어도 잘 동작합니다^^;;
그런데 어찌 되었든 az acr repository list 로 이미지를 가져와야 해서, azure cli로 로그인은 예제에선 필수적이고
acr purge는 preview이다 보니 변경이 있을 수도 있다고 생각해서, 굳이굳이 다시 인증정보를 넣어 주었습니다.
그리고 이제 저 명령어를 하나씩 살펴보겠습니다.
for i in \$(az acr repository list -n {삭제를 수행할 acr 이름} -o tsv); do
--> az acr repository list -n 이름 -o tsv를 통해 acr 내 각각의 이미지들의 정보를 불러옵니다.
acr purge -u $CLIENT_ID -p $CLIENT_SECRET --ago 30d
--> 30일보다 더 전에 올라온 이미지를 purge합니다. 이 --ago의 입력값은 go스타일로 뭐 365d든 240h든 편하신대로 주시면 되겠습니다.
--untagged --keep 3
--> untagged는 이미지를 완전히 "삭제" 하는 경우 꼭 필요한 옵션입니다. 이 옵션이 없으면
태그만 해제되고 바이너리가 삭제되지 않아 레지스트리에서는 보이지 않지만 저장공간을 차지합니다.
keep의 경우, 남겨둘 개수를 지정하는 부분입니다. 예제처럼 30일 지났다고 짤없이 다 지워 버리면
배포가 뜸하게 일어나는 애플리케이션의 이미지가 남아나지 않겠죠^^;;; 지우되 3개는 남겨 두겠다는 소리입니다.
--registry {acr이름}.azurecr.io --filter \$i:.*;
--> registry 이름을 지정하는 부분이고, 필터는 정규표현식이 적용되는 부분입니다.
한 이미지 안에 git commit id의 일부 등으로 여러 태그가 존재하게 되는데요,(회사마다 다름)
태그 이름과 관계없이 날릴 것이기 때문에 .*가 적용되었습니다.
예를 들어 shipping-svc 라는 이미지 아래 develop, aaaa77dd, bbbbccdd 라는 태그로 이미지가 존재하는 경우
요거같은경우엔 전체 이미지에 적용되겠죠..
뭐 요런 식으로 purge가 적용되게 됩니다.
요것만 해 주시면 쓱싹 이미지가 지워지고, 클린해진 저장 공간이 님을 맞이하게 됩니다.
저는 요걸 매 주마다 동작하도록 스케쥴을 걸고 사용했는데요,
제 경우에는 시각화된 형태로 스케쥴 성공/실패 여부를 확인하고 로그를 남겨야 해서
외부에 스케쥴을 걸어 두었지만
아래와 같은 형태로 azure cli에서 제공하는 task를 통해서도 스케쥴 등록이 가능합니다.
PURGE_CMD="사용하실 purge command의 내용"
az acr task create --name purgeOldImages \
--cmd "$PURGE_CMD" \
--schedule "crontab 표현" \
--registry acr이름 \
--context /dev/null
언제 GA가 될 지는 모르겠지만, 아무튼 제공되는 기능을 이용해서
클린한 ACR을 사용하시기 바랍니다d^^b
주의사항
- preview 기능이기 때문에 acr cli의 동작이 언제든 변경될 수 있습니다. 저는 책임이 없구요, 마소에 물어보셔용d^^b
- acr cli 설치에 문제가 있다면, 설치된 go 버전을 먼저 확인해 보시기 바랍니다. os 기본 패키지매니저로 설치하면
버전이 1.11.1 아래 버전인 경우가 많아요.
- 저 스케쥴을 외부 통신 제한된 머신에서 거시면 당연히 안 됩니다... acr 443포트 여셔야..
- 권한에러시 ACR의 IAM 정보를 확인하시고 인증에 사용하신 계정/SP 등에 삭제 권한을 주시면 되겠습니다.
이상입니다! 즐거운 클라우드 생활 보내세요~