안녕하세요, 오늘은 쿠버네티스에서 다운로드 한 CNI 이미지를 정리하는 방법에 대해 알아보겠습니다.
쿠버네티스는 도커 기반으로 Pod 을 띄우기 위해 필요한 이미지를 로컬에 캐싱합니다.
시간이 지날수록 로컬에 캐싱된 이미지는 점점 많아지고 용량을 더 많이 차지하게 됩니다.
그러다 노드의 가용 용량이 꽉 차서 노드가 멈추는 상황도 발생할 수 있습니다.
쿠버네티스에는 Garbage Collection 이라는 기능을 통해 오래된 이미지를 자동으로 정리하는 기능을 제공하지만 kubelet 설정시 해당 기능을 셋업하지 않았다면 기본적으로는 오래된 이미지를 정리하지 않습니다. (관련 문서 : https://kubernetes.io/docs/concepts/architecture/garbage-collection/#image-maximum-age-gc)
하지만 추천하는 방법은 kubelet 설정을 변경하여 자동으로 Garbage Collection 하는 방법입니다.
두가지 모두 방법을 알려드리도록 하겠습니다.
1. kubelet 설정을 변경하여 자동으로 Garbage Collection 하도록 하기
현재 노드가 돌아가고 있는 상태로 가정하고 진행합니다.
일단 live config edit 을 통해 노드의 실시간 설정을 변경해줍니다.
kubectl -n kube-system edit configmap kubelet-config
# 이후 imageMaximumGCAge 을 찾아서 원하는 시간으로 변경
# 예시 : 12h30s (12시간 30초) 혹은 12h (12시간) 혹은 30s (30초)
그리고 노드에 접속하여 노드가 재시작 되어도 반영될 config 를 수정해줍니다.
vim /var/lib/kubelet/config.yaml
# 이후 imageMaximumGCAge 을 찾아서 원하는 시간으로 변경
# 예시 : 12h30s (12시간 30초) 혹은 12h (12시간) 혹은 30s (30초)
이렇게 하면 모든 설정이 적용되었고 다음 Garbage Collection 주기에 설정한 시간이 지난 미사용 이미지는 삭제됩니다.
2. 즉시 수동으로 캐싱된 Image 삭제하기
crictl 을 통해 수동으로 모든 캐싱된 Image 를 삭제하는 방법도 있지만 이 방법은 현재 살아있는 Pod 의 Image 도 삭제하기 때문에 Pod 이 재시작 되면 다시 Image 를 Pull 하게 됩니다. 그래도 원하시는 분은 아래 명령어를 사용하시면 됩니다.
# 현재 실행중인 Pod 의 이미지 포함하여 모두 삭제 (위의 설명을 읽고 실행해주세요)
crictl images —prune
하지만 프로덕션 환경에서는 언제 장애가 날지 모르기 때문에 위와 같은 방법은 권장하지 않습니다.
다음은 현재 사용되지 않는 이미지만 찾아서 삭제하는 방법입니다.
reefland 의 cri-pruge 레포지토리의 코드를 사용하여 진행합니다(https://github.com/reefland/cri-purge).
# 임시 디렉터리에서 작업합니다.
cd /tmp
curl -LO https://raw.githubusercontent.com/reefland/cri-purge/master/cri-purge.sh
# 이후 아래 명령어를 통해 삭제될 이미지 목록을 확인합니다.
sudo bash cri-purge.sh --list
# 삭제될 이미지 목록이 맞다면 아래 명령어를 통해 최종적으로 이미지를 삭제합니다.
sudo bash cri-purge.sh --purge
이미지 용량이 많을수록 시간이 더 오래걸리고 purge 명령어 실행시 로컬 저장소 용량을 사용하게 됩니다. 600GB 이미지 삭제 기준 5분 정도 소요되었고 로컬 저장소 용량은 5GB 정도 사용하였습니다.
로컬 저장소 용량이 0이라 즉시 삭제가 필요한 경우 crictl 을 통해 캐싱된 이미지 전체를 삭제하시는 방법을 사용하셔야 합니다.

읽어주셔서 감사합니다.
