title: "**Kubernetes StatefulSet - Volume, PV, PVC, StorageClass**"
description: "Kubernetes StatefulSet, Volume, PV, PVC, StorageClass 구조 검토"
cleanUrl: /sw-engineer/kubernetes-statefulset-volume-pv-pvc-storageclass
ogImage: "<https://oopy.lazyrockets.com/api/v2/notion/image?src=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbC20VC%2FbtrMJ1xOxHO%2F4VSzlEwGxCMkkjJMQMT76k%2Fimg.png&blockId=bfa42e7a-2d6d-4536-9a4b-e32f16ff618c>"
floatFirstTOC: right

pod가 위치한 host node내의 storage. pod 정의부의 spec.volumes에 정의
spec:
containers:
...
volumeMounts:
- name: my-volume
mountPath: /pod-volume
volumes:
- name: my-volume
hostPath:
path: /some/path/in/host/node
PersistentVolume (PV)storage에 대한 추상화된 k8s resource. spec.storageClassName가 이 저장소에 대한 식별자임. 아래에서는 hostPath를 통해 Host Volume을 사용함을 지정했는데, NFS, AWS EBS, configMap, emptyDir, secret 등 다양한 형태를 정의 가능함
apiVersion: v1
kind: PersistentVolume
metadata:
name: my-volume
spec:
storageClassName: mystorage
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
hostPath:
path: /some/path
PersistentVolumeClaim (PVC)PV를 사용하기 위한 요청(claim)을 나타내는 k8s resource. PV와는 storageClassName을 통해 연결됨 (여기서는 mystorage).
PV의 관리 주체는 Storage 관리자인 반면, PVC의 관리 주체는 해당 storage의 사용자(아마도 Pod 관리자). 이로 인해 PV와 PVC 생명주기도 달라질 수 있음.
PV와는 달리 PVC는 특정 namespace에 속함(왜냐하면 Pod 관리자가 관리하므로)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-claim
spec:
storageClassName: mystorage
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 2Gi
상기 예에서 PersistentVolumeClaim 사용하기 위해서는 pod manifest의 spec.volumes내 hostPath 부분을 persistentVolumeClaim으로 변경하면 됨.
...
volumes:
- name: my-volume
#hostPath:
# path: /some/path/in/host/node
persistentVolumeClaim:
claimName: my-claim
StatefulSet에서 필요!
StatefulSetStatefulSet 등장 배경Deployment에 속한 모든 ReplicaSet의 Pod는 서로간 구분이 없는 복제본일 뿐임. 따라서 생성 순서도 없음.ReplicaSet을 통해서는 Pod별로 각기 다른 PV, PVC 지정이 불가능. 이를 해결하기 위해 StatefulSet 등장(?)