[쿠버네티스] Volume

Manx·2025년 2월 22일
0

DevOps

목록 보기
3/5

k8s에서 volume mount 하는 방법에 대해 정리하고자 한다.
key-word : PersistentVolume, PersistentVolumeClaim, StorageClass

1. Volume

배경

  • Pod도 Docker Container와 마찬가지로 임시적인 공간을 사용한다.
  • Pod가 삭제되면 Pod 내부의 data가 삭제된다.
  • Pod의 Data들을 보존하기 위해 Volume을 연결하여 Pod가 삭제되어도 Data가 유지될 수 있도록 한다.

유지해야 하는 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

  • Single Node에서만 동작한다면 문제없다.
  • 하지만 다양한 Node에서 해당 Pod가 실행된다면, 각 Node의 /data에 결과가 저장될 테니, 결과를 보려면 각 Node에 접근해야 한다.

이렇게 EBS에 저장할 수 있다.

volumes:
- name: data-volume
  awsElasticBlockStore:
    volumeID: <volume-id>
    fsType: ext4

문제점

  • Pod 설정으로 생성한 Volume 객체는 Pod와 생명주기가 같다.
  • Pod를 삭제하면 Volume 객체도 삭제되고, 새로운 Pod를 만들 때 마다 Directory들을 설정해야 한다.

Persistent Volume (PV)

앞서 나온 문제점을 해결할 수 있는 것이 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 정의


Persistent Volume Claim

PV를 통해 개별적인 Volume을 만들어 놓고 PVC를 통해 필요한 PV를 사용한다고 생각하면 된다.

  • PV와 1:1 관계이며, accessmode, capacity가 만족해야 한다.
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 등장


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/

0개의 댓글