본문 바로가기
Infra/Kubernetes

NFS 와 CSI

by TrendPilot 2025. 6. 5.
NFS 는 스토리지 기술이고, CSI 는 k8s 가 해당 스토리지를 연동하는 표준 방식
즉, NFS 를 k8s 에서 사용하기 위해 CSI 드라이버를 설치

 

쿠버네티스에서 애플리케이션을 운영하다 보면 데이터 영속성과 스토리지 관리가 중요한 과제로 대두됩니다. 

특히 여러 Pod 간 데이터 공유가 필요하거나 외부 스토리지 시스템과의 연동이 필요한 경우, NFS(Network File System)와 CSI(Container Storage Interface)에 대한 이해가 필수적입니다. 


1. NFS란?

NFS는 Network File System의 약자로, 네트워크를 통해 파일 시스템을 공유하는 분산 파일 시스템 프로토콜입니다. 즉, 여러 서버(혹은 컨테이너)가 동일한 스토리지 디렉토리를 마치 로컬 디렉토리처럼 공유할 수 있도록 해줍니다.

 

NFS 는 k8s에서 RWX(ReadWriteMany) 접근 모드를 지원하는 몇 안 되는 스토리지 타입 중 하나 입니다. k8s 환경에서 여러 파드가 동일한 데이터에 접근해야할 때 매우 유용하며 읽기와 동시에 쓰기가 가능합니다.

 

NFS 서버 설정 방법

# NFS 디렉토리 생성 및 권한 설정
mkdir -p /home/m1/nfs_share
chmod 755 /home/m1/nfs_share

# /etc/exports 파일에 공유 설정 추가
echo "/home/m1/nfs_share *(rw,sync,no_subtree_check)" >> /etc/exports

# NFS 서비스 재시작
sudo exportfs -a
sudo systemctl restart nfs-kernel-server

 

클라이언트에서 NFS 를 마운트

sudo apt install nfs-common

sudo mount <nfs-server-ip>:/home/m1/nfs_share /mnt

2. CSI란?

CSI는 Container Storage Interface의 약자로, 컨테이너 오케스트레이션 시스템(Kubernetes)와 다양한 스토리지 시스템(예: Ceph, NFS, Amazon EBS 등)을 연결하기 위한 표준 인터페이스입니다.

과거에는 Kubernetes마다 독자적인 스토리지 드라이버를 사용했지만, CSI 덕분에 스토리지 벤더들이 Kubernetes에 맞는 드라이버를 쉽게 제공할 수 있게 되었고, 운영자도 표준 방식으로 다양한 스토리지를 사용할 수 있게 되었습니다.

 

CSI 핵심 기능

기능 설명
볼륨 생성(Provisioning) PVC 요청에 따라 새로운 볼륨을 백엔드에 생성
볼륨 삭제(Deletion) PVC/PV 가 삭제되면 백엔드에서 실제 볼륨도 삭제
볼륨 마운트(Attach/Mount) 파드가 스케줄된 노드에 볼륨을 연결하고 마운트
볼륨 언마운트(Unmount/Detach) 파드 삭제 시 노드에서 연결 해제
스냅샷 및 복원 VolumeSnapshot API를 통해 스냅샷 생성 및 복원 지원
볼륨 확장(Expansion) 사용 중인 PVC 크기 변경 시 백엔드에서 볼륨 크기 확장

 

CSI 아키텍처

컴포넌트 설명
CSI Driver 벤더가 개발하는 실제 스토리지와 연동되는 플러그인
Node Plugin 노드에 설치되어 볼륨을 attach/mount
Controller Plugin 프로비저닝/삭제 등의 중앙 관리 역할 수행

3. NFS 사용

a. k8s 에서 가장 기본적으로 사용하는 방법은 pv 와 pvc 를 사용하는 것입니다.

pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  storageClassName: manual
  nfs:
    path: /home/m1/nfs_share
    server: <nfs-server-ip>
pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: manual
  resources:
    requests:
      storage: 10Gi

 

b. 직접 볼륨 마운트

pv 와 pvc 를 만들지 않고 파드의 볼륨으로 NFS 직접 지정

deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-example
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nfs-example
  template:
    metadata:
      labels:
        app: nfs-example
    spec:
      containers:
      - image: nginx
        name: nginx
        volumeMounts:
        - mountPath: /nfs
          name: efs-vol
      volumes:
      - name: efs-vol
        nfs:
          server: fs-f9352198.efs.ap-northeast-2.amazonaws.com
          path: /
          readOnly: false

 

c. NFS CSI 드라이버 활용

NFS CSI 드라이버를 설치하여 동적 프로비저닝을 통해 PV 를 자동으로 생성

설치

해당 명령은 클러스터 전체에 리소스를 설치하기 때문에 권한 있는 노드에서 실행해야합니다.

curl -skSL https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/v4.5.0/deploy/install-driver.sh | bash -s v4.5.0 --

 

CSI 컴포넌트 정상 동작 확인
kubectl -n kube-system get pod -o wide -l app=csi-nfs-controller
kubectl -n kube-system get pod -o wide -l app=csi-nfs-node

 

d. StorageClass 생성

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-csi
provisioner: nfs.csi.k8s.io
parameters:
  server: <nfs-server-ip>
  share: /nfs_share
reclaimPolicy: Delete
volumeBindingMode: Immediate
allowVolumeExpansion: true

 

 

storageClass 를 참조하는 pvc 생성하면 자동으로 pv 생성됩니다.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: dynamic-nfs-pvc
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: nfs-csi
  resources:
    requests:
      storage: 5Gi

마무리

Kubernetes 에서 NFS 는 공유 파일 시스템으로 활용되고, CSI 는 이러한 스토리지를 Kubernetes 에 연결해주는 표준 인터페이스 입니다.

 


https://kubernetes.io/docs/concepts/storage/persistent-volumes/

 

Persistent Volumes

This document describes persistent volumes in Kubernetes. Familiarity with volumes, StorageClasses and VolumeAttributesClasses is suggested. Introduction Managing storage is a distinct problem from managing compute instances. The PersistentVolume subsystem

kubernetes.io

https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner

 

GitHub - kubernetes-sigs/nfs-subdir-external-provisioner: Dynamic sub-dir volume provisioner on a remote NFS server.

Dynamic sub-dir volume provisioner on a remote NFS server. - kubernetes-sigs/nfs-subdir-external-provisioner

github.com

 

'Infra > Kubernetes' 카테고리의 다른 글

애플리케이션 배포 전략  (3) 2025.06.04
kube-apiserver 설정 기본 구조  (0) 2025.05.20
Kube-ApiServer 요청 처리 흐름  (0) 2025.04.25
RBAC  (0) 2025.04.25
StorageClass  (0) 2025.03.26