본문 바로가기

쿠버네티스

Storage 3대장 이해하기 (3/4) - File Storage

File Storage는 쿠버네티스에서 컨테이너가 데이터를 저장하고 관리할 때 가장 흔하게 사용하는 스토리지입니다. 

 

 



 

 

일반적으로 우리가 컴퓨터에서 파일을 저장하듯, 쿠버네티스에서도 파일 형태로 데이터를 다룰 수 있게 해주는 방식입니다.  이를 위해 쿠버네티스는 Volume(볼륨)이라는 오브젝트를 제공하는데, 이 볼륨을 통해 컨테이너가 데이터를 저장하거나 서로 데이터를 공유할 수 있습니다. 

 

이번 글에선 File Storage에 대해 자세히 소개합니다. 

 

 

쿠버네티스 파일 스토리지

 

 

목 차

 

File Storage란?

File Storage란 데이터를 파일과 디렉터리로 저장하는 방식을 뜻합니다. 파일 스토리지를 사용하면 여러 사용자가 네트워크를 통해 파일을 공유할 수 있다는 장점이 있습니다. 

 

컨테이너는 기본적으로 일시적인 성격을 가지고 있어서, 컨테이너가 종료되면 내부에 저장된 데이터도 사라집니다. 하지만 File Storage를 사용하면 데이터를 영구적으로 보존하거나, 여러 컨테이너 간에 공유할 수 있는 방법을 마련할 수 있습니다.

 

쿠버네티스에서 사용하는 대표적인 File Storage 방식으로는 NFS(Network File System), emptyDir, hostPath, 그리고 클라우드 제공 업체의 파일 스토리지(예: AWS EFS)가 있습니다. 

 

 

File Storage 활용 예시

실제 업무에서 File Storage는 다양한 상황에 사용됩니다. 특히 데이터를 영구적으로 보관하거나, Pod/Container 간 파일 공유 및 협업이 필요한 상황에 사용할 수 있습니다. 주요 활용 예시는 다음과 같습니다. 


1. 웹 애플리케이션의 정적 파일 저장

웹 서버(예: Nginx)가 이미지, CSS, HTML 같은 정적 파일을 제공해야 할 때, 여러 Pod에서 이 파일들을 공유해야 할 경우가 있습니다. 즉, 여러 Pod가 동시에 동일한 이미지 파일에 접근해야 하는 경우에 FileStorage를 사용하면 여러 Pod 간 파일 공유를 쉽게 구현할 수 있습니다. 

 

2. 로그 파일 관리

애플리케이션이 생성하는 로그 파일을 저장하고, 이를 분석 도구(예: ELK 스택)로 보내기 전 임시로 보관할 때 File Storage를 사용할 수 있습니다. 이렇게 하면 pod가 재시작되더라도 로그가 사라지지 않습니다.


3. 개발 및 테스트 환경에서의 데이터 공유

개발 중 여러 컨테이너가 동일한 설정 파일이나 테스트 데이터를 공유해야 할 때, File Storage를 통해 간단히 연결할 수 있습니다. 예를 들어, `emptyDir`를 사용하면 pod 내에서만 데이터를 공유할 수 있습니다.


4. 데이터베이스 백업

   데이터베이스 pod에서 생성된 백업 파일을 다른 pod나 외부 시스템으로 옮기기 위해 File Storage를 활용할 수 있습니다. NFS나 클라우드 스토리지를 연결하면 훨씬 수월하게 작업할 수 있습니다. 

 

 

(실습) 쿠버네티스에서 File Storage 활용하기

File Storage를 쿠버네티스에서 사용하는 방법을 두 가지 대표적인 방식인 `emptyDir`와 `NFS`를 YAML 파일로 설정하는 방법에 대해 알아보겠습니다. 

 

 


1. emptyDir: Pod 내에서 임시 파일 저장하기

`emptyDir`는 pod가 실행 중일 때만 존재하는 임시 저장소로 pod가 삭제되면 데이터도 함께 사라집니다. 주로 단일 pod 내에서 컨테이너 간 데이터를 공유할 때 사용합니다.

 

사용 예제:

apiVersion: v1
kind: Pod
metadata:
  name: emptydir-example
spec:
  containers:
  - name: writer
    image: busybox
    command: ["/bin/sh", "-c", "echo 'Hello Kubernetes!' > /data/message.txt && sleep 3600"]
    volumeMounts:
    - mountPath: "/data"
      name: shared-data
  - name: reader
    image: busybox
    command: ["/bin/sh", "-c", "cat /data/message.txt && sleep 3600"]
    volumeMounts:
    - mountPath: "/data"
      name: shared-data
  volumes:
  - name: shared-data
    emptyDir: {}


설명: 

  • 두 개의 컨테이너(`writer`와 `reader`)를 가진 pod를 생성합니다. 
  • `writer` 컨테이너는 `/data/message.txt` 파일에 메시지를 쓰고, `reader` 컨테이너는 그 파일을 읽어 출력합니다.
  • `emptyDir` 볼륨(`shared-data`)을 통해 두 컨테이너가 동일한 데이터를 공유할 수 있습니다.
  • 활용 예시 : 테스트 환경에서 설정 파일을 공유하거나, 임시 로그를 저장할 때 활용할 수 있습니다. 

실행결과:

# Pod가 running 상태인지 확인
~ $ kubectl get pod
NAME               READY   STATUS    RESTARTS   AGE
emptydir-example   2/2     Running   0          13m

# reader container에서 /data/message.txt 확인
~ $ kubectl exec -it emptydir-example -c reader -- /bin/sh
/ # cat /data/message.txt
Hello Kubernetes!

 

  • pod가 runing 상태인지 확인합니다.
  • reader container에 접속하여 /data/message.txt 에 "Hello Kubernetes!"가 write 되어 있는 것을 확인합니다.


2. NFS: 영구적인 파일 저장과 pod 간 공유

NFS는 네트워크를 통해 파일을 저장하고, 여러 pod에서 동시에 접근할 수 있는 영구 저장소입니다. 실무에서는 주로 NFS 타입의 File Storage를 생성하여 Pod 간 데이터 공유를 위해 사용합니다. 

먼저, NFS 서버가 설정되어 있어야 합니다. (예: IP가 `192.168.1.100`이고 경로가 `/nfs/share`라고 가정). 이제 이를 쿠버네티스에서 사용해 봅시다.

 

사용 예제:

apiVersion: v1
kind: Pod
metadata:
  name: nfs-example
spec:
  containers:
  - name: app
    image: nginx
    volumeMounts:
    - mountPath: "/usr/share/nginx/html"
      name: nfs-storage
  volumes:
  - name: nfs-storage
    nfs:
      server: 192.168.1.100  # NFS 서버 IP
      path: "/nfs/share"     # NFS 서버의 공유 경로



설명 : 

  • Nginx 웹 서버를 실행하는 pod를 생성합니다.
  • `/usr/share/nginx/html` 경로에 NFS 볼륨을 마운트 해서, NFS 서버에 저장된 파일(예: HTML 파일)을 제공합니다.
  • NFS는 pod가 종료되더라도 데이터를 유지하여 영구 저장에 적합합니다.
  • 활용 예시: 여러 웹 서버 pod가 동일한 정적 파일을 제공하거나, 로그를 중앙에서 관리할 때 활용할 수 있습니다. 

 

3. PersistentVolume과 PersistentVolumeClaim 사용하기

PersistentVolume(PV)와 PersistentVolumeClaim(PVC)를 사용하면 스토리지를 동적으로 관리할 수 있어 NFS를 더욱 유연하게 사용할 수 있습니다. 

 

사용 예제:

# PersistentVolume (PV) 정의
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteMany
  nfs:
    server: 192.168.1.100
    path: "/nfs/share"

---
# PersistentVolumeClaim (PVC) 정의
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 5Gi

---
# Pod에서 PVC 사용
apiVersion: v1
kind: Pod
metadata:
  name: nfs-pvc-example
spec:
  containers:
  - name: app
    image: nginx
    volumeMounts:
    - mountPath: "/usr/share/nginx/html"
      name: nfs-volume
  volumes:
  - name: nfs-volume
    persistentVolumeClaim:
      claimName: nfs-pvc


설명: 

  • PV는 NFS 서버의 스토리지를 정의하고, PVC는 그 스토리지를 요청합니다.
  • Pod는 PVC를 통해 NFS 스토리지를 마운트 해서 사용할 수 있습니다.
  • PVC의 AccessModes 중, ReadWriteMany 모드는 여러 pod가 동시에 읽고 쓸 수 있게 할 수 있습니다.
  • 활용 예시 : 대규모 애플리케이션에서 스토리지를 중앙 관리하거나, 동적 프로비저닝이 필요한 경우에 적합합니다.

 

요약정리

  • File Storage는 쿠버네티스에서 Pod 간 데이터를 저장하고 관리하기 위해 일반적으로 사용하는 스토리지입니다.
  • File Storage를 사용하면 네트워크를 통해 파일 공유를 쉽게 할 수 있습니다.
  • Pod에서 임시 파일 저장을 위해 emptyDir를 사용합니다.
  • NFS를 사용하면 파드 간 파일공유 및 영구적인 데이터 저장을 할 수 있습니다.