k8s에서 volume mount 하는 방법에 대해 정리하고자 한다.
key-word : PersistentVolume, PersistentVolumeClaim, StorageClass
배경
유지해야 하는 Data
Application Log, DB Data ( DB를 Pod로 띄우진 않겠지만.. )
Volume Mount하는 법
가장 간단하게 host 디렉토리와 마운트해보자.
0-100 숫자를 랜덤하게 뽑아 pod의 /opt/number.out으로 저장한다.
volumes로 host의 /data에 연결되어 있다.
container alpine에 volumeMounts를 설정해 주고, /opt로 설정한다.
이제 alpine Container의 /opt와 host의 /data 디렉토리가 mount되었다.
apiVersion: v1
kind: Pod
metadata:
name: random-number-generator
spec:
containers:
- image: alpine
name: alpine
command: ["/bin/bsh". "-c"]
args: ["shuf -i 0-100 -n 1 >> /opt/number.out;"]
volumeMounts:
- mountPath: /opt
name: data-volume
volumes:
- name: data-volume
hostPath:
path: /data
type: Directory

Multi Node
이렇게 EBS에 저장할 수 있다.
volumes:
- name: data-volume
awsElasticBlockStore:
volumeID: <volume-id>
fsType: ext4
문제점
생명주기가 같다.앞서 나온 문제점을 해결할 수 있는 것이 PV이다.
Pod와 개별적으로 생명 주기가 결정된다.
hostPath와 연결되어 있는 Volume을 만들 수 있다.
pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: example-pv
spec:
capacity:
storage: 5Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
hostPath:
path: /path/to/directory/on/host
type: DirectoryOrCreate
이제 PVC ( Persistent Volume Claim )을 생성해 pvc 와 pv를 연결한다.
persistentVolumeReclaimPolicy : pvc가 삭제되었을 시 Option 정의
PV를 통해 개별적인 Volume을 만들어 놓고 PVC를 통해 필요한 PV를 사용한다고 생각하면 된다.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mycalim
spec:
accessMode:
- ReadWriteOnce
resources:
requests:
storage: 500Mi
pvc를 pod에 적용하는 방법
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mycontainer
image: nginx
volumeMounts:
- name: my-volume
mountPath: /usr/share/nginx/html
volumes:
- name: my-volume
persistentVolumeClaim:
claimName: mycalim # Claim을 설정했다.
Pod에서 PVC를 사용 중이라면, PVC를 삭제해도 삭제되지 않는다.
문제점
pv/pvc만 사용하면 사용하기 전에 필요한 용량 만큼 disk를 미리 확보해 놓고 진행해야 한다.
-> static provisioning
pvc가 필요한 용량만큼의 disk가 동적으로 생기면 더 편리하다
-> dynamic provisioning
-> storage class 등장
sc-definition.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: google-storage
provisioner: kubernets.io/gce-pd
parameters:
type: pd-standard # type에 따라 복제, SSD 옵션이 추가된다.
replication-type: none
Storage Class를 사용하면, PV가 필요없다.
-> PVC가 요구하는 목적대로 Cloud에서 생성되니
pvc.definitaion.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: myclaim
spec:
accessModes:
- ReadWriteOnce
storageClassName: google-storage
resources:
requests:
storage: 500Mi
나의 개떡같은 설명을 대신해 줄 그림이다.

출처 : https://www.kubecost.com/kubernetes-best-practices/kubernetes-storage-class/
https://kubernetes.io/ko/docs/concepts/storage/volumes/
https://kubernetes.io/ko/docs/concepts/storage/persistent-volumes/
https://kubernetes.io/ko/docs/concepts/storage/storage-classes/