목차

Kubernetes Volume - PV & PVC

  • PV object로 Storage를 추상화하고 PVC object로 Storage를 할당받아 사용
  • PV(Persistent Volume)는 관리자나 StorageClass에 의해 생성되는 Volume
  • PVC(PV Claim)는 사용자가 Volume을 사용하기 위해 PV에 요청

  • PV를 만드는 단계
  • PV를 미리만들고 사용하는 정적(static)방법과 요청이 있을때 만드는 동적(dynamic)방법이 있다.
  • PV를 PVC와 연결하는단계
  • PVC는 스토리지 용량과 접근방법에따라 PV와 연결, 대응되는 PV가 없으면 대응되는 PV가 생성될때까지 Pending
  • PV와 PVC는 1:1 관계
  • Pod에서 PVC를 통해 PV의 볼륨으로 인식하고 사용하는 단계
  • 사용이 끝난 PVC가 초기화 되는 단계
    • Retain: PVC 삭제 → PV Status(bound → Released)로 바뀌며 다른 PVC가 연결 될 수 없는 상태. PV 속 데이터는 유지
    • Delete: PVC 삭제 → PV 삭제
    • Recycle: PVC 삭제 → PV Status(bound → Pending)로 바뀜, 다른 PVC 대기
  • 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