-
쿠버네티스 환경 스프링 어플리케이션에서 Files.copy를 했을 때의 저장 위치카테고리 없음 2021. 4. 15. 15:27
쿠버네티스 환경에서 스프링 애플리케이션을 실행할 때, Files.copy 메서드를 이용해 파일을 복사하는 경우 해당 파일이 어디에 저장되는지에 대해 알아본다.
컨테이너 파일 시스템
쿠버네티스는 컨테이너화된 애플리케이션을 관리하고 배포하는 시스템이다. 컨테이너는 독립된 파일 시스템을 가지며, 이는 쿠버네티스 노드의 디스크에 저장된다. 스프링 애플리케이션이 실행되는 동안 Files.copy를 통해 파일을 복사하면, 이 파일은 컨테이너 파일 시스템 내의 특정 경로에 저장된다. 이는 실제로 노드의 디스크에 저장되는 것이다.
파일 복사의 기본 저장 위치
- 기본 저장 위치: 애플리케이션이 실행 중에 Files.copy를 통해 파일을 복사하면, 이 파일은 기본적으로 컨테이너 파일 시스템에 저장된다. 이는 쿠버네티스 노드의 디스크에 저장되는 것이다. 컨테이너 파일 시스템은 컨테이너 이미지의 읽기-쓰기가 가능한 레이어를 사용하므로, 파일이 컨테이너 내부의 특정 경로에 저장된다.
- 임시 파일 저장: 파일이 복사되는 경로가 컨테이너 내부의 임시 디렉토리(/tmp 등)라면, 해당 파일은 컨테이너가 종료되기 전까지 유지된다. 컨테이너가 종료되면 임시 파일들은 사라진다. 이는 임시 디렉토리에 저장된 파일들이 컨테이너의 라이프사이클에 따라 관리됨을 의미한다.
그럼 특정 시간대에서 여러 어플리케이션이 Files.copy를 한다면 쿠버네티스 노드 디스크가 꽉 차는 문제가 발생할 수 있을 것 같은데 여러 방법을 고려해볼 수 있다.
해결 방안
- Persistent Volume 사용:
- 배치 작업에서 생성되는 데이터나 임시 파일을 노드의 로컬 디스크가 아닌 외부 스토리지에 저장하도록 설정한다.
- 이를 위해 Persistent Volume (PV)과 Persistent Volume Claim (PVC)를 사용하여 외부 스토리지(예: NFS, AWS EBS, GCE Persistent Disks 등)에 데이터를 저장할 수 있다.
- Temporary Storage 사용 최소화:
- 배치 작업 중 필요한 임시 파일이나 중간 데이터를 최소화하고, 가능하면 스트리밍 방식으로 데이터를 처리한다.
- 데이터를 메모리 내에서 처리하고, 필요할 때만 디스크에 기록하도록 설계한다.
- 노드 디스크 모니터링 및 알림:
- 쿠버네티스에서 노드의 디스크 사용량을 지속적으로 모니터링하고, 특정 임계값에 도달하면 알림을 받도록 설정한다.
- Prometheus와 Grafana 같은 모니터링 툴을 사용하여 디스크 사용량을 시각화하고 경고를 설정할 수 있다.
- 디스크 청소 작업 자동화:
- 배치 작업이 완료된 후 불필요한 임시 파일이나 중간 데이터를 자동으로 삭제하는 스크립트를 작성한다.
- 이를 크론잡(CronJob)으로 설정하여 정기적으로 디스크를 청소하도록 할 수 있다.
- 파일 분할 및 순차적 처리:
- 파일을 여러 개의 작은 청크로 분할하여 순차적으로 처리합니다. 이를 통해 한 번에 많은 디스크 공간을 차지하는 것을 방지할 수 있다.
- 각 청크가 처리된 후, 해당 데이터를 외부 스토리지로 옮기고 임시 파일을 삭제한다.
- 리소스 요청 및 제한 설정:
- 쿠버네티스의 리소스 요청과 제한을 설정하여 각 파드가 사용할 수 있는 디스크 공간을 제어한다.
- 이를 통해 파드가 무제한으로 디스크 공간을 사용하지 못하도록 방지할 수 있다.
Persistent Volume을 사용한 영구 저장
파일을 영구적으로 저장하고 싶다면, Persistent Volume(PV)과 Persistent Volume Claim(PVC)를 사용하여 외부 스토리지를 마운트할 수 있다. PV와 PVC를 설정하여 특정 디렉토리를 외부 스토리지에 연결하면, 파일을 해당 디렉토리에 복사할 때 노드의 디스크가 아니라 외부 스토리지에 저장된다. 이를 통해 파드가 재시작되더라도 파일을 지속적으로 유지할 수 있다.
DFS(Hadoop Distributed File System) 같은 분산 파일 시스템을 사용하는 것도 좋은 방법이 될 수 있다. 특히 대용량 데이터를 처리하고 저장할 때 HDFS는 많은 장점을 제공한다.
HDFS를 사용하는 장점
- 확장성: HDFS는 수백 대 이상의 노드에 걸쳐 데이터를 분산 저장할 수 있어 대용량 데이터 처리에 적합.
- 고가용성: HDFS는 데이터 복제 및 장애 조치를 통해 고가용성을 제공.
- 비용 효율성: 저렴한 하드웨어를 사용하여 대규모 데이터를 저장할 수 있어 비용 효율적
- 데이터 처리 통합: HDFS는 Hadoop 생태계와 통합되어 있어 MapReduce, Spark 등의 데이터 처리 엔진과 함께 사용할 수 있다.
요약
- 기본 저장 위치: 애플리케이션이 실행 중에 Files.copy를 통해 파일을 복사하면, 이 파일은 기본적으로 컨테이너 파일 시스템에 저장된다. 이는 실제로 쿠버네티스 노드의 디스크에 저장되는 것이다.
- 임시 저장: 임시 디렉토리에 저장되는 파일들은 컨테이너가 종료될 때 삭제된다.
- 영구 저장: 파일을 영구적으로 저장하려면 외부 스토리지에 연결하는 방법도 있다.