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
에서 필요!StatefulSet
StatefulSet
등장 배경Deployment
에 속한 모든 ReplicaSet
의 Pod는 서로간 구분이 없는 복제본일 뿐임. 따라서 생성 순서도 없음.ReplicaSet
을 통해서는 Pod별로 각기 다른 PV, PVC 지정이 불가능. 이를 해결하기 위해 StatefulSet
등장(?)