✔️ PV, PVC
- PersistentVolume : 스토리지 볼륨 정의
- PersistentVolumeClaim : PV를 요청
vagrant@k8s-node1 ~/volume/hostpath kubectl api-resources | grep pv
persistentvolumeclaims pvc v1 true PersistentVolumeClaim
persistentvolumes pv v1 false PersistentVolum
pv
, pvc
모두 core
그룹의 v1
이며 pv
는 네임스페이스를 사용하지 않아 Global
하고 pvc
는 네임스페이스를 사용한다.
✔️ PV, PVC의 철학
쿠버네티스를 설계하고 pv
, pvc
라는 개념을 만든 사람은 파드나 파드보다 상위 레벨의 컨트롤러는 개발자들도 잘 알고 사용할 수 있지만 아래쪽의 스토리지에 대해서는 잘 모른다고 생각했다.
또한 전통적인 네트워크 스토리지인 NFS
, icsi
, fc
는 연결하고 설정하는 것이 매우 복잡하므로 개발자는 스토리지를 잘 모른다고 생각했다.
엔지니어는 인프라를 잘 알고 스토리지를 잘 알기 때문에 엔지니어가 스토리지를 담당하고 개발자는 파드와 컨트롤러를 담당하는 것이 좋다고 생각했다.
즉, 개발자와 엔지니어의 역할을 나누고 PV와 PVC라는 개념으로 기능을 분리하였다.
파드가 있고 스토리지가 있다고 하자
스토리지를 정의하는 리소스가 pv
이며 해당 영역은 엔지니어의 영역이다.
개발자는 파드에서 바로 스토리지를 선언하는 것이 아니라 pvc
라는 리소스를 만들어 연결시킨다.
pvc
리소스는 pv
의 이름만을 가지고 지칭한다.
파드가 볼륨을 사용하기 위해서 pv
라는 리소스와 pvc
라는 리소스를 사용하게 되며 pvc
는 pv
를 claim
(요청)한다.
일반적으로 파드에 스토리지를 직접 붙여 사용하는 경우는 거의 없다.
따라서 엔지니어라면 해당 구성을 잘 아는 것이 중요하다.
✔️ PV, PVC 사용법
vagrant@k8s-node1 ~/volume/hostpath kubectl explain pv.spec
vagrant@k8s-node1 ~/volume/hostpath kubectl explain pv.spec.hostPath
vagrant@k8s-node1 ~/volume/hostpath kubectl explain pvc.spec
selector <Object>
A label query over volumes to consider for binding.
storageClassName <string>
Name of the StorageClass required by the claim. More info:
https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1
volumeMode <string>
volumeMode defines what type of volume is required by the claim. Value of
Filesystem is implied when not included in claim spec.
volumeName <string>
VolumeName is the binding reference to the PersistentVolume backing this
claim.
pvc
의 목적은 pv
를 가리키는 것이다. 3가지 방식이 존재한다.
selector
방식을 이용하면pvc
에는 셀렉터가 있고pv
에는 레이블이 있어 셀렉터로 셀렉팅한다.volumeName
은pv
의 이름을 지칭한다.storageClassName
: 관리자가 제공하는 스토리지의classes
를 설명할 수 있는 방법을 제공한다.
vagrant@k8s-node1 ~/volume/hostpath kubectl explain pod.spec.containers.volumeMounts
컨테이너가 볼륨을 마운팅(volumeMounts
) 해야한다.
vagrant@k8s-node1 ~/volume/hostpath kubectl explain pod.spec.volumes
persistentVolumeClaim <Object>
PersistentVolumeClaimVolumeSource represents a reference to a
PersistentVolumeClaim in the same namespace. More info:
https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims
그리고 pod.spec.volumes
에 persistentVolumeClaim
를 선언한다.
vagrant@k8s-node1 ~/volume/hostpath kubectl explain pod.spec.volumes.persistentVolumeClaim
claimName
: pvc
의 이름이다.
이로써 알 수 있는 것은 파드는 pvc
를 지칭하고 pvc
는 pv
를 지칭하고 pv
는 실제 스토리지를 사용한다는 것이다.
✔️ PV, PVC 예제
Pod
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mypod
image: httpd
volumeMounts:
- name: myvol
mountPath: /tmp
volumes:
- name: myvol
persistentVolumeClaim:
name: mypvc
파드를 정의할 때 파드의 볼륨은 무조건 pvc
로 정의한다.pvc
는 mypvc
(pv
)를 가리키고 있다.volumes.name
과 volumes.persistentVolumeClaim.name
은 같아도 상관없으며 myvol
을 /tmp
에 마운트시킨다.
PV
apiVersion: v1
kind: PersistentVolume
metadata:
name: mypv # 매핑
spec:
hostPath:
path: /web_contents
type: DirectoryOrCreate
PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mypvc
spec:
volumeName: mypv # 매핑
...
pvc
와 pv
의 관계를 다시 정의한다.spec.volumeName
이 mypv
이며 실제로 pv
의 이름이 mypv
이다.
mypv의 실제 스토리지와 관련된 부분이 spec에 들어가 있다.
최종적으로 스토리지를 사용하는 사람은 mypv의 이름만 알면 된다.
✔️ PV, PVC 생명주기
- 프로비저닝
- 바인딩
- 사용
- 회수/반환(Reclaim)
- Retain: 보존 - PV를 삭제하지 않음(Release ← PVC가 연결 X)
- Delete: 삭제 - PV를 삭제 / 실제 스토리지 내용 삭제
- Recycle: 재사용(X) - 실제 스토리지 내용을 비우고, PV를 사용 가능한 상태(Available)
- 프로비저닝
스토리지를 만들어야 한다.pv
와 연결할 스토리지를 미리 준비해야 한다. - 바인딩
pv
와pvc
를 만들어서 연결(Binding
)해야 한다. - 사용
일반적으로 바인딩하면 문제가 없는 이상 계속 사용할 수 있다. - 회수/반환(Reclaim)
파드,pvc
,pv
, 볼륨이 있을 때pv
와pvc
의 관계를 보면 된다.
파드가 삭제되더라도 복제본에 의해서 새로운 파드와pvc
를 연결시키면 된다.
더이상pv
와pvc
가 필요없어pv
를 삭제한다면pvc
를 어떻게 해야하는가 ?
어떻게 회수(Reclaim)할 것이냐 ? -> 회수 정책이 존재한다.
✔️ 회수/반환(Reclaim) 정책
📌 pv
← 1 : 1 → pvc
pv
와 pvc
는 1:1 연결만이 가능하다.
pvc
를 여러 파드가 연결할 수는 있다. 해당 스토리지가 네트워크 기반의 스토리지라면 문제없다.
- Retain : 보존
pvc
를 삭제하면pv
를 그대로 둔다.
왜 그대로 둘까 ? 혹시pvc
를 새롭게 만들어서 연결시키면 가능하지 않을까 ?
하지만 가능하지 않다.
한번 연결됐던 pv
는 기존에 연결됐던 pvc
가 삭제되고 pv
가 살아있더라도 다른 pvc
가 연결하지 못한다.
심지어 기존에 연결됐다가 끊어진 pvc
도 다시 연결하지 못한다.
- Delete : 삭제
pvc
를 지우면pv
가 삭제된다.pv
가 삭제된다는 것은 실제 스토리지가 삭제된다는 것을 의미한다.
정확하게는 스토리지의 데이터가 삭제된다.
예를 들어 EBS 볼륨을 연결해뒀다면 EBS 볼륨은 삭제된다.
만약 클라우드 스토리지를 사용한다면 기본 반환 정책은 Delete
이다.
즉, pvc
를 삭제하면 pv
가 삭제되는데 pv
를 삭제하는 것은 스토리지를 삭제하는 것이므로 pvc
를 삭제함으로써 스토리지까지 삭제하는 것이다.
- Recycle : 재사용(X)
pvc
를 삭제하면 Retain : 보존 정책의 경우pv
의 상태가Release
상태가 된다.Release
는 연결 상태를 놓는다는 뜻으로 사용된다.
이 상태에서pvc
를 다시 만들어서 연결해도 연결되지 않는다.pv
를 재사용 하기 위해 즉, 사용이 가능한 상태로 만들기 위해서는 스토리지의 데이터를 지운다. 그리고 새롭게 비어있는 스토리지를 만들어서pv
를 재생성한다.
데이터를 삭제하는 것이 재사용이며 삭제해서 pv
를 다시 사용 가능한 상태(Available
)로 만들어준다.
왜 재사용 방식을 사용하지 않는가 ?
스토리지를 삭제하는 방법이 스토리지마다 모두 다르기 때문이다.
대부분 Retain(보존)
정책을 많이 사용한다.pvc
를 삭제하더라도 pv
가 살아있으면 스토리지에 데이터가 살아있다는 뜻이다.pv
를 삭제하지 않는다는 것은 실제 스토리지를 삭제하지 않는다는 것이며 데이터가 남아있으므로 필요하면 Backup
해서 사용할 수 있다.
pv
를 남겨놓고 다른 pvc
와 연결할 수 있는 것이 아니며 해당 목적으로 사용하지 않는다.
✔️ 접근 모드(Access Mode)
- ReadWriteOnce: RWO
- ReadWriteMany: RWX
- ReadOnlyMany: ROW
ReadWriteOnce: RWO
하나의 노드에서 해당 볼륨이 읽기-쓰기로 마운트 될 수 있다. ReadWriteOnce 접근 모드에서도 파드가 동일 노드에서 구동되는 경우에는 복수의 파드에서 볼륨에 접근할 수 있다.
ReadOnlyMany
볼륨이 다수의 노드에서 읽기 전용으로 마운트 될 수 있다.
ReadWriteMany
볼륨이 다수의 노드에서 읽기-쓰기로 마운트 될 수 있다.
ReadWriteOncePod
볼륨이 단일 파드에서 읽기-쓰기로 마운트될 수 있다. 전체 클러스터에서 단 하나의 파드만 해당 PVC를 읽거나 쓸 수 있어야하는 경우 ReadWriteOncePod 접근 모드를 사용한다. 이 기능은 CSI 볼륨과 쿠버네티스 버전 1.22+ 에서만 지원된다.
스토리지 유형에 따라서 지원되는 영역이 다르다.
- Block (DAS)
- Network (NAS)
- File →
Share
의 기능 - SAN
- File →
DAS
와 SAN
은 블록 장치를 제공하며 SAN
만 네트워크를 지원한다.
블록 장치는 공유가 안된다. 대부분 Many
가 안된다.
파일 스토리지, 공유의 개념을 갖는 것들은 대부분 Many
가 된다.
NFS에는 Lock Manager가 있는데 동시에 파일에 쓰기를 못하게 한다.
동시에 쓰기를 못하도록 할 수 있어야 Sharing
이 가능하다.
'DevOps > Kubernetes' 카테고리의 다른 글
[Kubernetes] Storage Classes (스토리지 클래스) (0) | 2022.05.29 |
---|---|
[Kubernetes] 정적 프로비저닝 (Static Provisioning) ( + NFS 정적 프로비저닝) (0) | 2022.05.29 |
[Kubernetes] Volume (emptyDir, gitRepo, initContainer, hostPath) (0) | 2022.05.29 |
[Kubernetes] Readiness Probe (준비성 프로브) (0) | 2022.05.29 |
[Kubernetes] Ingress Challenge (0) | 2022.05.29 |
영차영차 성장 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!