Work/개발 노트
[Kubernetes] Overlay 파일시스템으로 이미지 중복 제거
★용호★
2024. 8. 30. 15:36
이 글은 if(kakao)2022에서 발표된 "이게 돼요? 도커 없이 컨테이너 만들기" 발표 내용 중 이미지 중복 내용을 참고해서 정리했습니다.
컨테이너 환경의 파일시스템은 격리를 위해 prviot_root해서 완전히 독립된 root 파일 시스템을 갖게 되기 때문에 필요한 코드나 라이브러리를 패키징해서 관리할 수 있다는 장점이 있습니다. 하지만 OS는 동일한 ubuntu를 사용하고 그 위에 nginx를 설치한 환경과, web app까지 설치된 환경을 각각 운영한다고 했을 때 패키징 된 파일시스템이 여러개 존재해야 합니다. 이 경우에는 스토리지 용량도 많이 사용하게 되고, 패키징된 파일들을 네트워크를 통해 각각 내려 받는다고 생각하면 네트워크 비용도 만만치 않습니다.
컨테이너 이미지 내 패키징된 파일들의 중복 문제를 해결하기 위해 이미지를 레이어로 구성하는 시도를 하게 됩니다. 이를 오버레이 파일시스템이라고 하고, 여러 이미지 레이어를 하나로 마운트하는 것을 의미합니다. 여기서 Lower 레이어는 읽기 가능한 ReadOnly로 유지하고, Upper 레이어만 쓰기 가능한 Writable로 유지합니다. 만약 Lower 레이어의 파일에 변경이 필요한 경우에는 CoW(copy-on-write) 방식을 사용해서 Lower 레이어의 파일을 Upper 레이어로 복사한 후에 파일을 수정합니다. 즉, 원본 데이터는 변경되지 않고 유지되기 때문에 다른 컨테이너 이미지에서도 참조할 수 있게 됩니다.
아래와 같이 오버레이 파일 시스템을 직접 실습해볼 수 있습니다.
# which 복사
mkdir tools
which which
ldd /usr/bin/which
mkdir -p tools/usr/bin;
cp /usr/bin/which tools/usr/bin/;
# rm 복사
which rm;
ldd /bin/rm;
mkdir -p tools/{bin,lib64,lib/x86_64-linux-gnu};
cp /bin/rm tools/bin;
cp /lib/x86_64-linux-gnu/libc.so.6 tools/lib/x86_64-linux-gnu/;
cp /lib64/ld-linux-x86-64.so.2 tools/lib64;
# 오버레이 마운트 준비
# container: upper 레이어, merge: lower와 upper 레이어를 병합 (마운트 포인트), work: upper 레이어에 atomic한 write를 보장하기 위해 필요한 파일 기록
mkdir -p rootfs/{container,work,merge}
tree rootfs
# 오버레이 마운트
mount -t overlay overlay -o lowerdir=tools:myroot,upperdir=rootfs/container,workdir=rootfs/work rootfs/merge
tree -L 2 myroot/{bin,usr};
tree -L 2 rootfs/merge/{bin,usr}
# CoW
rm rootfs/merge/escape_chroot
tree -L 2 rootfs
# 초기화
unmount /tmp/rootfs/merge
결과적으로 아래와 같이 이미지 레이어 단위로 파일을 저장하게 되면서 이미지의 중복 문제를 해결할 수 있습니다.