퍼시스턴트 볼륨(PV), 퍼시스턴트 볼륨 클레임(PVC)
- 퍼시스턴트 볼륨은 워커 노드들이 네트워크상에서 스토리지를 마운트해 영속적으로 데이터를 저장할 수 있는 볼륨이다.
- 따라서 파드에 장애가 생겨 다른 노드로 옮겨가더라도 해당 노드에서 PV에 네트워크로 연결해 데이터를 계속 사용할 수 있다.
- NFS, AWS의 EBS, Ceph, GlusterFS…
로컬볼륨: hostPath, emptyDir
# hostPath
apiVersion: v1
kind: Pod
metadata:
name: hostpath-pod
spec:
containers:
- name: my-container
image: busybox
args: ["tail", "-f", "/dev/null"]
volumeMounts:
- name: my-hostpath-volume
mountPath: /etc/data
volumes:
- name: my-hostpath-volume
hostPath:
path: /tmp
- hostPath는 호스트와 볼륨을 공유하기 위해 사용한다.
- 위 예시는 볼륨에 hostPath를 정의해 호스트의 /tmp를 파드의 /etc/data에 마운트했다.
- 파드를 생성한 뒤 파드의 컨테이너 내부로 들어가 /etc/data 디렉터리에 파일을 생성하면 호스트의 /tmp 디렉터리에 파일이 저장된다.
- 이제 파드 컨테이너의 /etc/data와 호스트의 /tmp는 동일한 디렉터리로써 사용된다.
- 그러나 파드에 장애가 생겨 다른 노드로 파드가 옮겨갔을 경우 문제가 있을 수 있다. 로컬의 개념
apiVersion: v1
kind: Pod
metadata:
name: emptydir-pod
spec:
containers:
- name: content-creator
image: alicek106/alpine-wget:latest
args: ["tail", "-f", "/dev/null"]
volumeMounts:
- name: my-emptydir-volume
# 1. 이 컨테이너가 /data 에 파일을 생성하면
mountPath: /data
- name: apache-webserver
image: httpd:2
volumeMounts:
- name: my-emptydir-volume
# 2. 아파치 웹 서버에서 접근 가능합니다.
mountPath: /usr/local/apache2/htdocs/
volumes:
- name: my-emptydir-volume
# 포드 내에서 파일을 공유하는 emptyDir
emptyDir: {}
- emptyDir은 파드의 컨테이너 간에 볼륨을 공유하기 위해 사용한다.
- emptyDir 볼륨은 파드의 데이터를 영속적으로 보존하기 위해 외부 볼륨을 사용하지 않고, 파드가 실행되는 도중에만 필요한 휘발성 데이터를 각 컨테이너가 함께 사용할 수 있도록 임시 저장 공간을 생성한다.
emptyDir를 브릿지 개념으로 보고, 두 컨테이너를 서로 마운트해주는 그런 느낌으로 이해하자.
네트워크 볼륨
- 클라우드 플랫폼의 볼륨을 파드에 마운트할 수도 있다.
NFS는 그냥 파일 시스템 서버이고,
외부에 있는 파일시스템을 로컬 OS가 외부에 있는 파일 시스템을 가져와서 로컬에 있는 것처럼 쓸 수 있게 해주는 것
마운팅한다는 것은 로컬의 공간을 차지하지 않고 외부의 시스템을 로컬에 있는 것처럼 쓸 수 있게 해주는 것이다.
ex. 파일을 저장할 때 외부의 시스템을 마운트한 상태이면, 내 로컬이 아니라 그 마운팅한 시스템의 컴퓨터 공간을 쓴다.
우리는 애져 스토리지 붙일 것임
PV, PVC 사용하는 이유
- NFS 서버를 yaml 파일에 네트워크 볼륨으로 고정적으로 명시하면, 이를 관리해야 하는 불편이 있다.
- 게다가 데이터 보관을 위해 iSCSI나 GlusterFS를 사용하려면 해당 네트워크 볼륨 타입을 명시하는 별도 yaml을 여러 개 만들어 배포해야 한다.
- 즉, 볼륨과 애플리케이션의 정의가 서로 밀접하게 연관돼 있어 서로 분리할 수 없게 된다.
- PV, PVC 오브젝트를 사용하면 파드가 볼륨의 세부적인 사항을 몰라도 볼륨을 사용할 수 있도록 추상화해준다.
파드를 생성하는 yaml 입장에서 네트워크 볼륨이 NFS인지, EBS인지 상관없이 볼륨을 사용할 수 있게 해줌
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-ebs-pvc # 1. my-ebs-pvc라는 이름의 pvc 를 생성합니다.
spec:
storageClassName: ""
accessModes:
- ReadWriteOnce # 2.1 속성이 ReadWriteOnce인 퍼시스턴트 볼륨과 연결합니다.
resources:
requests:
storage: 5Gi # 2.2 볼륨 크기가 최소 5Gi인 퍼시스턴트 볼륨과 연결합니다.
---
apiVersion: v1
kind: Pod
metadata:
name: ebs-mount-container
spec:
containers:
- name: ebs-mount-container
image: busybox
args: ["tail", "-f", "/dev/null"]
volumeMounts:
- name: ebs-volume
mountPath: /mnt
volumes:
- name: ebs-volume
persistentVolumeClaim:
claimName: my-ebs-pvc # 3. my-ebs-pvc라는 이름의 pvc를 사용합니다.
- 개발자는
PVC
, 데브옵스는PV
의 관점으로 보자. - 개발자는 PVC를 사용해 추상화된 명세 언어로 실제 볼륨이 어떻게 구성되어 있는지 자세히 몰라도 된다.
- 데브옵스가 작성하는 PV에만 볼륨의 상세가 기술되어있다.
PVC가 추상화 개념이고 PV는 인스턴스 개념으로 이해하자. - 퍼시스턴트 볼륨은 데브옵스 관리자가 요구사항이 오면 그때그때 만들면 된다.
- 개발자 입장에서는 어떻게 보면 러프하게 볼륨의 요구사항을 작성하면 그와 일치하는 PV를 알아서 바인딩한다.
우리 입장에서는 이걸 잘 작성하면 될듯!
퍼시스턴트 볼륨의 라이프사이클
-
Avaliable -> Bound -> Released
-
PVC를 삭제하면 PV 상태가 Released가 된다.
-
Released 상태는 해당 PV 사용이 끝났음을 의미해서, 이 상태의 PV는 다시 사용할 수 없다.
-
그러나 실제 데이터는 볼륨 안에 있기 때문에 PV를 삭제한 뒤 다시 생성하면 Available 상태 볼륨을 다시 사용할 수 있다.
-
ReclaimPolicy
: PVC를 삭제했을 때 PV의 데이터를 어떻게 처리할 것인지 별도 정의할 수 있다.
디폴트 ReclaimPolicy는 Retain 상태이다.다이나믹 프로비저닝
- PVC가 요구하는 조건과 일치하는 PV가 존재하지 않는다면 자동으로 PV와 외부 스토리지를 함께 프로비저닝(띄우는)하는 기능이다.
- 모든 쿠버네티스 클러스터에서 범용적으로 사용할 수 있는 것은 아니다.
- AWS 쿠버네티스를 사용하고 있다면 aws-ebs-csi-driver를, GKE에서는 GcePersistentDiskCsiDriver를 설치하면 자동으로 다이나믹 프로비저닝을 사용할 수 있다.
- 하드웨어까지(인프라까지) 다 준비하는 과정이
프로비저닝 시킨다
고 말한다.