카테고리 없음

persistentVolume & persistenVolumeClaim

pioneerxj 2023. 9. 10. 01:11

Kubernetes 볼륨 구조는 PersistentVolume, PersistentVolumeClaim 2개로 구성된다.
PV는 볼륨 자체를 의미하며 클러스터내에서 리소스로 존재한다. Pod와 별도로 관리되고 별도의 생명주기를 가진다. 
PVC는 사용자가 PV에게 보내는 요청이다. 사용하고 싶은 용량은 얼마인지 읽기 쓰기는 어떤 모드로 설정하는 지등을 결정해서 요청한다. 
Kubernetes는 볼륨을 Pod에 직접 할당하는 방식이 아니라 중간에 PVC를 둠으로 Pod와 Pod가 사용할 스토리지를 분리했다.
이런 구조는 각각의 상황에 맞게 다양한 스토리지를 사용할 수 있게 한다.

 

NFS 서버 설치

$ yum -y install nfs-utils
$ vi /etc/idmapd.conf
5 Domain = example.com

$ vi /etc/exports
$ /volume-nfs 172.16.0.0/24(rw,no_root_squash)
$ mkdir /volume-nfs
$ systemctl enable --now rpcbind nfs-server
$ exportfs

1. PV 생성하기

$ vi pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
spec:
  capacity:
    storage: 100Mi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  nfs:
    path: /volume-nfs
    server: 172.16.0.201
    readOnly: false

$ k apply -f pv.yaml
$ k get pv

사용자가 볼륨을 다 사용하면 리소스를 반환할 수 있는 API를 사용하여 PVC 오브젝트를 삭제 할 수 있다. 
퍼시스턴트 볼륨의 반환 정책은 볼륨에서 Claim을 해제한 후 
볼륨에 수행할 작업을 클러스터에 알려준다.

 

Lifecycle Reclaiming 정책

Retain: pvc와 pv가 Released이면 (끊어진상태) 데이터가 pv에 남아있다. 그런데 새로운 pvc와는 연결이 안된다.

Delete: Delete정책을 지원하는 볼륨 플러그인의 경우, pv와 외부 스토리지 자체를 모두 삭제한다.

 

accessModes의 종류

  • ReadWriteOnce: 한 노드에서 볼륨을 읽기 쓰기로 마운트
  • ReadOnlyMany: 여러 노드에서 볼륨을 읽기 전용으로 마운트
  • ReadWriteMany : 여러 노드에서 볼륨을 읽기 쓰기로 마운트

 

2. PVC 생성하기

$ cat > pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 100Mi

$ k apply -f pvc.yaml
$ k get pvc

PV는 Bound 상태, PVC도 Bound 상태이다. PVC의 경우 nft-pv 볼륨과 연결되었음을 알 수 있다.

 

3. Pod와 PV&PVC 연결하기

$ cat > nginx-pv.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx-nfs
  labels:
    name: nginx-nfs
spec:
  containers:
  - name: nginx-nfs
    image: fedora/nginx
    ports:
    - name: web
      containerPort: 80
    volumeMounts:
    - name: nfs-share
      mountPath: /usr/share/nginx/html
  volumes:
  - name: nfs-share
    persistentVolumeClaim:
      claimName: nfs-pvc

$ k apply -f nginx-pv.yaml

 

pvc -> storageClass -> aws -> pv

pvc는 accessModes와 resources로 pv를 찾는다.

여러개의 pv가 있으면 그 중 랜덤하게 연결되어 Bound상태가 된다. 

pod -> pvc -> pv -> disk

파드가 마운트시키는 대상은 pvc이다.

 

pv 생성 -> pvc 생성 -> pod 생성