Kubernetes Volume - PV & PVC
목차
PV object로 Storage를 추상화하고 PVC object로 Storage를 할당받아 사용
PV(Persistent Volume)는 관리자나 StorageClass에 의해 생성되는 Volume
PVC(PV Claim)는 사용자가 Volume을 사용하기 위해 PV에 요청
Provisioning
PV를 만드는 단계
PV를 미리만들고 사용하는 정적(static)방법과 요청이 있을때 만드는 동적(dynamic)방법이 있다.
Binding
PV를 PVC와 연결하는단계
PVC는 스토리지 용량과 접근방법에따라 PV와 연결, 대응되는 PV가 없으면 대응되는 PV가 생성될때까지 Pending
PV와 PVC는 1:1 관계
Using
Pod에서 PVC를 통해 PV의 볼륨으로 인식하고 사용하는 단계
Reclaiming(회수)
사용이 끝난 PVC가 초기화 되는 단계
- Retain: PVC 삭제 → PV Status(bound → Released)로 바뀌며 다른 PVC가 연결 될 수 없는 상테 PV 속 데이터는 유지
- Delete: PVC 삭제 → PV 삭제
- Recycle: PVC 삭제 → PV Status(bound → Pending)로 바뀜, 다른 PVC 대기
accessMode
PV 생성시 설정하는 접근 권한
- ROX(ReadOnlyMany) - 일기만 가능, 모든 노드 접근 가능
- RWX(ReadWriteMany) - 읽기, 쓰기, 모든 노드 접근 가능
- RWO(ReadWriteOnce) - 읽기, 쓰기, 단일노드
- PV123.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv1
spec:
capacity:
storage: 1G
accessModes:
- ReadWriteOnce
local:
path: /data
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- {key: kubernetes.io/hostname, operator: In, values: [k8s-node1]}
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv2
spec:
capacity:
storage: 1G
accessModes:
- ReadOnlyMany
local:
path: /data
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- {key: kubernetes.io/hostname, operator: In, values: [k8s-node1]}
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv3
spec:
capacity:
storage: 2G
accessModes:
- ReadWriteMany
local:
path: /data
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- {key: kubernetes.io/hostname, operator: In, values: [k8s-node1]}- PVC1234.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc1
spec:
accessModes:
- ReadOnlyMany
resources:
requests:
storage: 1G
#PV2
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc2
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1G
#pv1
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc3
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5G
#Pending
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc4
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1G
#pv?- 테스트
$ kubectl apply -f pv123.yaml
$ kubectl apply -f pvc1234.yaml
$ kubectl get pv,pvc
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
persistentvolume/pv1 1G RWO Retain Bound default/pvc2 4m10s
persistentvolume/pv2 1G ROX Retain Bound default/pvc1 4m10s
persistentvolume/pv3 2G RWX Retain Bound default/pvc4 4m10s
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/pvc1 Bound pv2 1G ROX 3m55s
persistentvolumeclaim/pvc2 Bound pv1 1G RWO 3m55s
persistentvolumeclaim/pvc3 Pending 3m55s
persistentvolumeclaim/pvc4 Bound pv3 2G RWX 3m55s- 사용
apiVersion: v1
kind: Pod
metadata:
name: mynode-pod
spec:
containers:
- image: nginx:1.24.0
name: pv-pvc-pvccontainer
ports:
- containerPort: 80
volumeMounts:
- name: pvc-path
mountPath: /pvc-data
volumes:
- name: pvc-path
persistentVolumeClaim:
claimName: pvc1- 라벨을 사용한 지정
- 라벨을통해 직접 연결 할 수 있다.
- pv-pvc-label.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv4
labels:
name: pv4
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
local:
path: /data
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- {key: kubernetes.io/hostname, operator: In, values: [k8s-node1]}
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: label-pv
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: \"\"
selector:
matchLabels:
name: pv4- 기타 (NFS PV)
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-nfs
spec:
capacity:
storage: 1G
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
mountOptions:
- hard
nfs:
path: /DATA1
server: 10.10.10.90