[NKS] NKS NAS 볼륨 CSI를 사용해 두개 이상의 pod끼리 파일 공유하기

2025. 10. 27. 15:16·K8S & Docker

문제 상황

NKS를 사용하여 두개의 pod을 Replica set으로 관리하고 있다.
NKS 위에 올라간 애플리케이션은 N개의 엑셀 파일을 변환하여 한개의 엑셀파일로 만들어주는 기능을 제공한다.
분명 PVC 를 사용함에도 불구하고, 하나의 pod에는 엑셀파일이 존재하지 않는데 하나의 Pod에는 엑셀파일이 존재하고 있었다.
문제: 두개 이상의 pod에 볼륨이 공유되지 않는다!

 

 

 

PV와 PVC

해당 문제 사항을 알아보려면 K8S의 PV와 PVC를 알아봐야한다.
K8S에서 볼륨을 사용하는 구조는 PV라고 하는 Persistence Volume 과 PVC라고 하는 Persistent Volume Claim 이 있다.
PV는 볼륨을 관리하는 관리자고, PVC는 볼륨을 개발하는 개발자라고 생각하면 편하다.
k8s안에 볼륨을 사용하려면 PV에서 직접 사용하지 못한다. PVC를 통해 한번 더 추상화해서 PVC가 PV에 저장공간을 달라고 요청하는 프로세스로 구성된다.
PVC와 PVC 모두 스토리지 계층을 추상화한 것이며, 이름에서 알 수 있듯이 영구적인 볼륨이다.
하단의 글을 보는 것을 매우 추천한다. PV와 PVC의 생명주기를 꼼꼼히 설명해주셨다.
https://kimjingo.tistory.com/153
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

 

 

 

 

PV의 데이터를 pod 끼리 공유하려면?

PV의 데이터를 pod끼리 공유하기 위해 필요한 설정은 accessMode이다.
아래의 YAML을 보면서 설명 해보겠다.

apiVersion: v1
kind: PersistentVolume
metadata:
  name: [PV이름]
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  hostPath:
    path: "/mnt/data"

---

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: [PVC이름]
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

이 YAML은 기존에 관리하던 PVC,PVC yaml이다.
문제점이 두가지 있는데

  1. hostPath 방식을 사용하고 있다.
  2. accessMode가 RWO라는 것

 

 

 

이름 설명
emptyDir 파드가 생성될 때 생성되고 파드가 삭제될 때 삭제되는 임시 볼륨
hostPath 노드의 로컬 볼륨
awsElasticBlockStore 아마존 웹 서비스 EBS 볼륨
azureDisk 마이크로소프트 애져 볼륨
cephfs Ceph4 볼륨
cinder 오픈스택5 Cinder 볼륨
gcePersistentDisk 구글 컴퓨트 엔진 볼륨
glusterfs 글러스터6(오픈 소스 네트워크 파일시스템) 볼륨
iSCSI iSCSI7 볼륨
NFS NFS(네트워크 파일시스템) 볼륨

hostPath를 사용한다는 것은 pod이 각자의 로컬 볼륨을 사용하기에 절대 파일을 공유할 수 없다.
accessMode의 경우
https://kubernetes.io/ko/docs/concepts/storage/persistent-volumes/
위의 글을 읽어보길 권한다.

 
 
RWO였기에 하나의 노드만 볼륨에 마운트할 수 있었다. RWM으로 모드를 바꾼다면 다수의 노드에서 마운트 가능해진다.
Kubernetes 볼륨(Persistent Volume & Claim) 영구 스토리지 개념 이해

 

 

 

 

어디에 저장해야할까?

accessMode로 다수의 pod이 하나의 PV에 접근할 수 있게 되었다. 그러면 어디에 어떻게 저장해야할까?
확실한 것은 hostPath에 저장한다면 pod 각각의 디스크에 저장된다는 것이다.
kubectl get pv 명령어를 이용해서 쓸만한 스토리지가 있는지 확인해본다.
대부분의 CSP는 K8S를 제공할때 여러 기본기능을 제공하는데, Ingress나 스토리지 등등
NKS의 경우NAS CSI 드라이버를 기본으로 배포해준다.
관련글: https://guide.ncloud-docs.com/docs/k8s-k8suse-nascsi

# kubectl get sc
NAME                          PROVISIONER          RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
nks-block-storage (default)   blk.csi.ncloud.com   Delete          WaitForFirstConsumer   true                   43d
nks-nas-csi                   nas.csi.ncloud.com   Delete          WaitForFirstConsumer   true                   43d

CSI Driver

CSI 드라이버는 Container Storage Interface Driver인데 K8S같은 컨테이너 오케스트레이션 시스템과 스토리지를 제어하는 플러그인 사이의 인터페이스를 의미한다.
나는 간단히 K8S에서 스토리지를 사용하는 것을 관리해주는 모듈이라 이해했다.

 

 


CSI플러그인은 4가지로 구성되는데
Provisioner

  • 클러스터에 PVC가 생성되는 걸 모니터링 하고 있다가 PVC가 생성되면 PV를 생성하는 것을 담당한다.

Attacher

  • 파드가 PVC 사용하려 할때 해당 컨테이너에서 PV 마운트 하는 것을 담당한다.

Controller

  • K8S 컨테이너에서 사용할 볼륨을 스토리지 서버에서 생성 및 삭제하는 것을 담당한다.

Node Server

  • pod가 배포될 노드에서 스토리지 볼륨에 마운트 할 수 있게 환경 만드는 것을 담당한다.

https://tech.gluesys.com/blog/2022/06/21/CSI.html
https://nice-engineer.tistory.com/entry/Kubernetes-EBS-for-CSI-드라이버-CSI란-무엇인가
https://kubernetes.io/blog/2019/01/15/container-storage-interface-ga/

 

Container Storage Interface (CSI) for Kubernetes GA

The Kubernetes implementation of the Container Storage Interface (CSI) has been promoted to GA in the Kubernetes v1.13 release. Support for CSI was introduced as alpha in Kubernetes v1.9 release, and promoted to beta in the Kubernetes v1.10 release. The GA

kubernetes.io

 

 

 

 

 

 

YAML을 수정해보자

기존에 설정한 PV는 삭제하고 PVC만 새로 설정한다.
PVC를 새로 설정하려면 Deployment들을 모두 지워야 설정된다.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: [PVC 이름]
spec:
  storageClassName: nks-nas-csi    
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 5Gi

여기서 중요한 것은 storage class name이다! 이제 이 친구가 나의 PV가 될거다 👍😁

 


[쿠버네티스 교과서]라는 책에서는 이렇게 스토리지 클래스를 지정하는 것을 동적 프로비저닝이라 하고, PV/PVC만 설정하는 것을 정적 프로비저닝이라고 한다.

어떤 스토리지를 사용하는게 좋을까?

NCP에서는 Ncloud Storage, NAS, Block Storage등을 제공하는데
나의 요구사항에는 네트워크를 통해 파일을 공유해야하기에 NAS를 선택하게 되었다.
사실 NCP를 쓰고 + 여러 pod끼리 데이터를 공유하려면 파일 스토리지를 써야만한다.

 

 


왜냐면 NCP 블록스토리지는 AccessMode를 RWO만 지원하기 때문이다.
관련글: https://guide.ncloud-docs.com/docs/k8s-k8suse-bscsi

AccessMode: 네이버 클라우드 플랫폼에서는 ReadWriteOnce 모드만 지원됩니다. 단일 노드가 볼륨에 대해 읽기/쓰기 작업을 수행할 수 있도록 마운트합니다.

NCP에서 블록 스토리지, NAS 확인하기

블록 스토리지

[Compute] → [Server] →[Storage]
 

NAS

[storage] → [NAS]
 

Appendix

https://guide.ncloud-docs.com/docs/k8s-k8suse-bscsi
https://guide.ncloud-docs.com/docs/k8s-k8suse-nascsi
https://aws.amazon.com/ko/blogs/tech/persistent-storage-for-kubernetes/
https://kubernetes.io/ko/docs/concepts/storage/storage-classes/
https://aws.amazon.com/ko/blogs/tech/persistent-storage-for-kubernetes/
https://www.netapp.com/ko/blog/difference-between-nas-and-san/

'K8S & Docker' 카테고리의 다른 글

[NKS] NKS + Prometheus + Loki + Promtail로 로그 수집하고 Ncloud Storage(또는 Object Storage) 에 로그 보관하기  (0) 2025.11.06
[NKS] K8S + uvicorn 에서 표준출력을 활용해 custom log를 남겨보기  (1) 2025.10.27
[NKS] K8S Cron Job으로 PVC 청소하기 🫧🧽  (0) 2025.10.17
'K8S & Docker' 카테고리의 다른 글
  • [NKS] NKS + Prometheus + Loki + Promtail로 로그 수집하고 Ncloud Storage(또는 Object Storage) 에 로그 보관하기
  • [NKS] K8S + uvicorn 에서 표준출력을 활용해 custom log를 남겨보기
  • [NKS] K8S Cron Job으로 PVC 청소하기 🫧🧽
jjungking
jjungking
쩡킹의 고상한 코딩 이야기
  • jjungking
    jjungking
    jjungking
  • 전체
    오늘
    어제
    • 분류 전체보기 (19)
      • Cloud (2)
      • K8S & Docker (4)
      • Linux (3)
      • Next.js & React (3)
      • SpringBoot (2)
      • OS (0)
      • Network (1)
      • AWS (1)
      • Git (1)
      • OpenSource (1)
      • 회고록 (1)
      • 기술세션 공부하기 (0)
      • Certi (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 깃허브
  • 공지사항

  • 인기 글

  • 태그

    controlledInput
    githook
    네이버클라우드
    ec2느릴때
    promtail
    AWS
    Husky
    ReactHookForm
    HikariCP
    ec2
    Nclouder
    네이버클라우드플랫폼
    rds이관
    k8s
    cronjob
    리눅스시스템프로그래밍
    NCP
    aws이관
    springboot
    uncontrolledinput
    Grafana
    objectstorage
    RDS
    uvicorn
    오픈소스기여
    ncloud
    Loki
    nks
    Helm
    http응답느릴때
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
jjungking
[NKS] NKS NAS 볼륨 CSI를 사용해 두개 이상의 pod끼리 파일 공유하기
상단으로

티스토리툴바