🛠️ CI & CD

Harbor 용량 관리 및 트러블 슈팅

loose 2023. 12. 21. 17:10
반응형

Harbor 이미지 올바르게 지우기

Harbor 서버에서 용량을 관리하기 위해 과거의 이미지를 지울 수 있다.

하지만 이미지를 지우더라도 실제 서버 용량은 변함이 없으므로 Garbage Collection을 작동시켜줘야 한다.

When you delete images from Harbor, space is not automatically freed up. You must run garbage collection to free up space by removing blobs that are no longer referenced by a manifest from the file system.

관리자 계정을 들어가면 좌측 탭에 Administration 메뉴가 활성화 되며 Garbage Collection을 진행할 수 있다.

관리자 계정 ID는 admin이고 아래 명령어로 password를 조회해볼 수 있다.

find ~/ -name "harbor.yml" | xargs grep -n "harbor_admin_password"

주기적으로 GC를 실행하도록 설정할 수 있으며 꺼져있다면 설정을 해놓는 것이 좋다.

 

트러블 슈팅

위의 GC 기능을 알기전에 Harbor의 용량이 꽉차버려서 Harbor와 관련된 Redis, DB 모조리 죽어버리게 되었다.

그래서 어떻게든 빈 공간을 만들어줘야 했는데 가장 용량이 많이 차지하는 곳을 검색하기 위해 du -hx로 검색해봤다.

/data/registry/docker/registry/v2/blobs/sha256

위 경로의 폴더가 가장 용량을 많이 차지하고 있었으며 Harbor가 실제로 저장하는 이미지 바이너리 파일들이 저장되어있다.

말 그대로 blobs 폴더 내에 있는 파일들은 지우면 기존 이미지 파일들이 깨진다.(어느 파일이 깨지는 지 알 수도 없다.)

 

디스크 볼륨 하나를 추가해서 백업 시켜둘 수도 있었겠지만 당장은 급해서 과감하게 폴더 하나를 삭제했다. 물론 검색해보면 여기 있는 파일은 절대 지우면 안된다고 신신당부를 하고 있다.
하지만 별 수가 없었다. 거기 아니면 용량을 늘릴 곳이 없었기 때문이다.

그리고 용량을 비운 후에 다시 이미지를 말아 올리는 과정에서 하버 SCM에 docker push가 지속적으로 실패했다. 

Dec 21 10:23:09 172.18.0.1 registry[7221]: time="2023-12-21T10:23:09.332731234Z" level=error msg="response completed with error" auth.user.name="harbor_registry_user" err.code=unknown err.detail="filesystem: mkdir /storage/docker/registry/v2/blobs/sha256/37: permission denied" err.message="unknown error" go.version=go1.17.7 http.request.host="cmp.registry.io:29143" http.request.id=19411102-a8d5-44f4-be2a-2b254f980bec http.request.method=PUT http.request.remoteaddr=10.0.16.161 http.request.uri="/v2/cmp-

 

로그를 까보니 위와 같은 에러가 발생했고 mkdir할 때 permission denied가 발생했다.

내가 37이라는 폴더를 지웠기 때문에 발생하는 문제다. 여기서 나는 단순히 37이라는 폴더를 다시 만들어줘서 애초에 mkdir을 할 필요 없게 만들려고 했다는 점이다.

그게 아니라 permission denied가 발생했다는 것은 해당 하버 서버에서 harbor가 특정한 user로 작업을 했다라는 의미가 된다. 즉 root 권한이 아니라는 사실.

그래서 blobs 폴더 내부를 보면 

전부 루트 권한을 사용한다는 것을 할 수 있었다.

 

그렇다는 것은 첫번째로 그 user가 뭔지 유추해볼 수 있다. log 폴더를 열어보면 user와 group이 전부 10000으로 설정되어있는데 이게 바로 harbor가 사용하는 user다.

 

하지만 10000은 user명은 아니고 특정 uid 다.
여튼 10000이 해당 폴더를 관리한다는 것을 볼 수 있는데 harbor는 10000이라는 uid를 가진 사용자로 작업을 한다는 것을 알 수 있다.

그래서 이 권한을 낮추기 위해 chmod를 하거나 chown을 선택해볼 수 있다.

chown 10000:10000 test

 

blobs는 root 권한이기 때문에 blobs 폴더를 chown 10000:10000 blobs로 낮출 수 있는 것이다.

반대로 chmod도 가능하겠다.

 

그래서 난 권한 변경에 대한 생각보다 내부에서 뭔가 mkdir을 할 때 명령어 앞에 sudo를 넣어주는 방법이 없을까하다가 막힌 것이다.

권한 변경은 유저 권한 변경도 있다는 것을 알면 좋을듯 하다

 

참고로 이러한 작업을 다 진행하고 나면 도커로 재시작 해보는 것이 좋다.

docker compose -v down

docker compose -d up

728x90