정의
네트워크에 연결된 저장소(Network Attached Storage, NAS)는 데이터를 공유하기 위해 네트워크에 연결된 스토리지 장치를 말합니다. NAS는 파일 서버의 형태로 동작하며, 다양한 사용자가 파일에 접근할 수 있도록 하고, 파일을 저장하고 검색하는 기능을 제공합니다.
특징
네트워크 공유
중앙 집중화된 저장
간단한 설정과 관리
데이터 백업 및 복구
접근 권한 관리
확장성
SERVICE-B
에서 PVC 요청을 SERVICE-A
와 동일한 이름인 PVC-A로 하게 되면 SERVICE-A
가 만들어지면서 생긴 NAS-A
에 연결되어 두 서비스가 동일한 볼륨을 공유하게된다.nks-nas-csi
이름의 storage class가 있는지 확인한다. NKS에서는 클러스터 생성시 자동으로 생성되기 때문에 무조건 있을 것이다.> kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
nks-block-storage blk.csi.ncloud.com Delete WaitForFirstConsumer true 2d7h
nks-nas-csi nas.csi.ncloud.com Delete WaitForFirstConsumer true 2d7h
nks-nas-csi
Storage Class를 통해 PV를 생성할 수 있도록 PVC를 작성해준다. (storageClassName에 명시)pvc-csi.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nas-pvc
namespace: default
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 100Gi
storageClassName: nks-nas-csi
deployment-csi.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nas-deployment
namespace: default
spec:
selector:
matchLabels:
app: nas
replicas: 1
template:
metadata:
labels:
app: nas
spec:
containers:
- name: nas-container
image: hyunsoolee0506/scalaspark:3.5.0
ports:
- containerPort: 8888
volumeMounts:
- name: nas-vol
mountPath: /workspace/spark
volumes:
- name: nas-vol
persistentVolumeClaim:
claimName: nas-pvc
kubectl apply -f pvc-csi.yaml
kubectl apply -f deployment-csi.yaml
NAS > Volume
에서 아래와 같이 랜덤한 이름으로 요청한 크기의 NAS 볼륨이 생성된 것을 확인할 수 있다.[namespace]-[pvc name]-[pvc id]
명명 규칙에 따라 생성된다.nks-nas-csi 와 NFS Client의 차이점을 표로 정리하면 아래와 같다.
내용 | nks-nas-csi | NFS Client |
---|---|---|
설치 | 클러스터 생성시 자동 생성 | Helm을 통한 설치 |
최초 생성 | 자동 생성 | 수동 생성 |
볼륨 구분 | 새로운 NAS 볼륨으로 구분 | 동일한 NAS 볼륨 내 디렉토리로 구분 |
볼륨 연결 | 자동 | 자동 |
개인적인 의견 | 서비스마다 매번 새로운 NAS가 생성되어 불편 | 하나의 NAS로 여러 볼륨을 디렉토리로 나누어 구분 가능하여 편함 |
NAS > Volume > NAS 볼륨 생성
탭을 클릭하여 새로운 NAS 볼륨을 생성해줄 수 있다.nfs-subdir-external-provisioner
추가> kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
nfs-client (default) cluster.local/nfs-subdir-external-provisioner Delete Immediate true 5h
nks-block-storage blk.csi.ncloud.com Delete WaitForFirstConsumer true 2d7h
nks-nas-csi nas.csi.ncloud.com Delete WaitForFirstConsumer true 2d7h
nfs-client
Storage Class를 통해 PV를 생성할 수 있도록 PVC를 작성해준다. (default storage class일 경우 storageClassName 부분 생략 가능)pvc-nfs.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs-pvc
namespace: default
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 100Gi
storageClassName: nfs-client
deployment-nfs.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nas-deployment
namespace: default
spec:
selector:
matchLabels:
app: nfs
replicas: 1
template:
metadata:
labels:
app: nfs
spec:
containers:
- name: nfs-container
image: hyunsoolee0506/scalaspark:3.5.0
ports:
- containerPort: 8888
volumeMounts:
- name: nfs-vol
mountPath: /workspace/spark
volumes:
- name: nfs-vol
persistentVolumeClaim:
claimName: nfs-pvc
kubectl apply -f pvc-nfs.yaml
kubectl apply -f deployment-nfs.yaml
## 1) nfs 관련 패키지 설치
> apt-get install nfs-common -y
## 2) 마운트 할 디렉토리 생성
> mkdir /mnt/nas
## 3) 마운트 진행
> sudo mount -t nfs [NAS IP]:[NAS PATH] /mnt/nas
## 4) 마운트 확인
> df -Th
Filesystem Type Size Used Avail Use% Mounted on
udev devtmpfs 3.9G 0 3.9G 0% /dev
tmpfs tmpfs 793M 724K 792M 1% /run
/dev/xvda1 ext4 49G 4.5G 42G 10% /
tmpfs tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
169.254.***.***:/n009998_******* nfs4 100G 208M 100G 1% /mnt/nas
/mnt/nas
디렉토리 내부 분기 구조를 tree 명령어로 확인해보면 각 서비스별 볼륨이 NAS 내부에 디렉토리로 분리가 되어 마운트 된 것을 볼 수 있다.## 1) tree 명령어 install
> sudo apt install tree
## 2) 디렉토리 구조 확인
> tree -d /mnt/nas/
/mnt/nas/
├── archived-default-nfs-pvc-pvc-6d4cfe61-a7c7-49b3-a7b1-aceaa5b20aaf
├── jupyter-jupyter-pvc-pvc-72c5156f-96bb-4f5e-837d-c7e1ee3fe920
└── trino-mysql-pvc-pvc-e2b41553-33d5-439a-aca2-2188ecf76df3
nks-nas-csi
의 경우 YAML 리소스에 명시만 해주면 완전 자동으로 생성해준다는 장점이 있지만 일반적으로 NAS가 만들어 질때 적게는 100GB, 많게는 몇 테라까지 용량을 설정하여 생성하기 때문에 자동으로 생성되더라도 서비스별로 하나씩 생성이 되는 것은 큰 메리트가 아닐 것이라 생각된다.nfs-client
를 사용하여 PV를 생성하는 것이 관리적으로나 리소스적으로 더 현명한 선택지가 아닐까 생각된다.