정적 프로비저닝은 관리자가 미리 볼륨을 생성해두고, 개발자가 PVC(PersistentVolumeClaim)를 통해 사용할 수 있게 하는 방식입니다.
동적 프로비저닝은 관리자가 StorageClass
를 정의하면, 개발자가 PVC를 생성할 때 자동으로 필요한 크기의 볼륨이 생성되는 방식입니다. 이 글에서는 동적 프로비저닝 방식을 사용합니다.
Kubernetes 클러스터에서 NFS를 통해 볼륨을 사용하기 위해 NFS CSI 드라이버를 설치해야 합니다. 아래 명령어로 설치할 수 있습니다.
git clone https://github.com/kubernetes-csi/csi-driver-nfs.git
cd csi-driver-nfs
./deploy/install-driver.sh v4.7.0 local
NFS 서버의 IP와 공유 폴더 경로를 지정한 StorageClass
파일을 생성합니다.
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: dev1-sc # StorageClass 이름으로, PVC 생성 시 참조할 이름입니다.
mountOptions:
- nfsvers=4.1 # NFS 버전 4.1을 사용하도록 설정합니다.
parameters:
server: 211.183.3.199 # NFS 서버의 IP 주소 또는 도메인
share: /root/shared # NFS 서버의 공유 디렉토리 경로
provisioner: nfs.csi.k8s.io # NFS CSI 드라이버를 사용하여 동적 프로비저닝을 수행합니다.
reclaimPolicy: Delete # PVC가 삭제되면, 연결된 PV도 자동으로 삭제됩니다.
volumeBindingMode: Immediate # PVC 생성 시 즉시 PV에 바인딩됩니다.
위 파일을 적용하여 StorageClass
를 생성합니다.
kubectl apply -f nfs-csi.yml
StorageClass
를 참조하여 특정 크기의 스토리지를 요청하는 PVC를 생성합니다. 이 PVC는 자동으로 NFS 볼륨을 동적으로 프로비저닝합니다.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-pvc # PVC 이름
spec:
storageClassName: dev1-sc # 앞서 생성한 StorageClass 이름을 참조합니다.
accessModes:
- ReadWriteOnce # 읽기 및 쓰기를 한 Pod에서만 허용
resources:
requests:
storage: 1Gi # 요청하는 스토리지 용량
다음 명령어로 PVC를 생성합니다.
kubectl apply -f dev1-pvc.yml
생성된 PVC는 NFS 서버의 /root/shared
디렉토리에 자동으로 매핑됩니다.
아래와 같이 NFS서버에도 볼륨이름으로 폴더가 생성된 것을 확인 할 수 있습니다
생성된 PVC를 Pod에서 사용하려면, volumeMounts
와 volumes
를 통해 PVC를 Pod에 연결합니다.
apiVersion: v1
kind: Pod
metadata:
name: myapp
spec:
containers:
- name: myapp
image: nginx
resources:
limits:
memory: "128Mi"
cpu: "500m"
ports:
- containerPort: 80
volumeMounts:
- name: myvol
mountPath: /test # Pod 내에서 볼륨을 마운트할 경로
volumes:
- name: myvol
persistentVolumeClaim:
claimName: test-pvc # 연결할 PVC 이름
위 파일을 적용하여 Pod를 생성합니다.
kubectl apply -f dev1-pod.yml
Pod가 생성되면 /test
경로에 NFS 볼륨이 마운트됩니다.
Pod 내부에서 파일을 생성하여 NFS 서버에 정상적으로 연결되었는지 확인합니다.
kubectl exec myapp -- touch /test/from_dev1.txt
NFS 서버의 /root/shared
경로에 가서 from_dev1.txt
파일이 있는지 확인하면, NFS 볼륨이 성공적으로 마운트되었는지 확인할 수 있습니다.