상세 컨텐츠

본문 제목

동적 프로비전 (Dynamic Provisioning)

AWS CLOUD SCHOOL 9기

by AI Engineer crystal 2025. 4. 16. 16:22

본문

운영자가 미리 PV(PersistentVolume)를 만들어두는 것이 아니라, 개발자가 PVC(PersistentVolumeClaim)를 작성하면 StorageClass에 정의된 Provisioner가 해당 PVC의 요청을 처리하여 동적으로 볼륨을 생성한다. 이 방식은 리소스를 효율적으로 사용할 수 있고 운영자의 개입 없이 개발자가 필요한 만큼의 볼륨을 자동으로 확보할 수 있다는 장점이 있다.


1. CSI (Container Storage Interface)

Kubernetes에서는 다양한 CSI 드라이버를 통해 다양한 스토리지 백엔드(NFS, EBS, Ceph 등)와 연동할 수 있다. 여기서는 NFS용 CSI 드라이버를 설치하고 사용하는 방법을 소개한다.

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

2. StorageClass 생성

# nfs-csi.yml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: dev1-sc
mountOptions:
  - nfsvers=4.2
parameters:
  server: 211.183.3.99
  share: /shared
provisioner: nfs.csi.k8s.io
reclaimPolicy: Delete
k apply -f nfs-csi.yml
k get sc
NAME      PROVISIONER      RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
dev1-sc   nfs.csi.k8s.io   Delete          Immediate           false                  12s

VolumeBindingMode 설명

  • Immediate: PVC가 생성되면 바로 바인딩됨 (기본값). 단, Multi-Zone 환경에서는 권장되지 않음.
  • WaitForFirstConsumer: Pod가 스케줄된 후에 바인딩이 진행됨. → 권장 설정

3. PVC 작성 (개발팀)

# dev1-pvc.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: dev1-pvc
spec:
  storageClassName: dev1-sc
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
k apply -f dev1-pvc.yml

4. Pod 작성

# mypod2.yml
apiVersion: v1
kind: Pod
metadata:
  name: mypod2
  labels:
    app: web
spec:
  containers:
  - name: myctn2
    image: nginx
    resources:
      limits:
        cpu: 500m
        memory: 128Mi
      requests:
        cpu: 250m
        memory: 64Mi
    ports:
    - containerPort: 80
      name: http
    volumeMounts:
    - name: myvol2
      mountPath: /usr/share/nginx/html
  volumes:
    - name: myvol2
      persistentVolumeClaim:
        claimName: dev1-pvc
k apply -f mypod2.yml

5. 동작 확인

k exec -it mypod2 -- touch /usr/share/nginx/html/index.html

NFS 서버(/shared) 하위에 자동 생성된 pvc-... 디렉토리에 index.html 파일이 존재하는지 확인하면 마운트가 정상적으로 연결된 것을 알 수 있다. Pod에서의 경로(/usr/share/nginx/html)와 NFS 서버의 실제 경로(/shared/pvc-...)는 CSI 드라이버에 의해 연결되어 있다.


이렇게 개발자는 StorageClass만 알고 있으면 PVC와 Pod 설정만으로 필요한 스토리지를 간편하게 생성하고 사용할 수 있다. 이는 DevOps 관점에서도 매우 효율적인 구조이며, 특히 멀티 팀 환경에서 유용하게 활용된다.

관련글 더보기