STUDY/Data Engineering

15. CKA udemy 강의 정리 - Section 8 [Storage]

wonpick 2023. 1. 24. 02:45

0. Volume

컨테이너(파드)가 뜨면 컨테이너 만의 공간이 생성되고 이 공간은 임시적으로 사용된다. 만약 파드가 죽는다면 해당 공간은 사라진다. 웹 애플리케이션과 같은 Stateless한 애플리케이션인 경우에는 문제가 없지만, 애플리케이션이 특정 데이터를 저장해야 하는 경우나 파드에서 같이 실행되는 컨테이너 간에 임시 파일을 공유해야 하는 경우에 문제가 발생하게 된다.

 

컨테이너 애플리케이션이 특정 데이터를 저장해야 하는 경우에는 애플리케이션이 죽으면 쿠버네티스가 컨테이너를 다시 띄우겠지만 컨테이너 공간이 사라지기 때문에 해당 데이터는 당연히 삭제된다.

 

파드에서 같이 실행되는 컨테이너 간에 임시 파일을 공유해야 하는 경우, 파일을 저장하는 컨테이너가 죽어버리면 위와 똑같은 이유로 임시파일에 저장된 데이터는 당연히 삭제된다.

 

그래서 컨테이너 (또는 파드)의 라이프사이클에 관계없이 지속되는 공간이 필요한데 쿠버네티스는 볼륨 이라는 이름으로 해당 공간을 사용할 수 있도록 지원한다. 물론 도커에도 볼륨이라는 개념을 가지고 있지만, 쿠버네티스는 더 다양한 볼륨의 유형을 지원한다. 쿠버네티스에는 크게 두 가지 형식의 임시 볼륨 (Ephemeral Volume)과 퍼시스턴트 볼륨 (Persistent Volume) 을 지원한다.

 

쿠버네티스에서는 여러가지의 임시 볼륨 (Ephemeral Volume)을 제공한다.

  • emptyDir: 말그대로 비어있는 볼륨, 해당 스토리지는 kubelet base directory공간이나 램을 사용한다.
  • configMap, downwardAPI, secret: 여러 종류의 쿠버네티스 데이터를 파드로 주입하는 경우 사용
  • CSI ephemeral volumes: 특수목적으로 사용되며 특정 CSI driver에 의해 제공되는 볼륨
  • generic ephemeral volumes: 영구 볼륨도 지원하는 모든 스토리지 드라이버에서 제공하는 볼륨

 

1. Persistent Volume & Persistent Volume Claim

PV는 관리자에 의해 생성된 볼륨을 뜻하고, PVC는 사용자가 볼륨을 사용하기 위해 PV에 요청하는 용도이다.

임시볼륨은 PodSpec의 volumes 을 통해 정의하여 파드와 같은 라이프사이클을 가진다. 하지만 퍼시스턴트 볼륨은 파드와 같은 라이프사이클을 가지지 않는다. 파드가 죽어도 퍼시스턴트 볼륨의 데이터가 영구적으로 남아있어야 하기 때문이다.

그리고 퍼시스턴트 볼륨(PV) 을 사용하는 파드가 완전히 삭제되어도 퍼시스턴트 볼륨은 삭제되지 않는다. 쿠버네티스에서 파드와 퍼시스턴트는 직접적으로 관계가 형성되지 않고 퍼시스턴트볼륨클레임(PVC) 이라는 오브젝트를 통해 간접적으로 관계가 형성되기 때문이다.

간단히 말하면 PVC는 원하는 스펙의 PV를 바인딩하며, 파드는 PVC를 볼륨으로 사용한다.

 

영구 볼륨(Persistent Volume)

  • 영속성 영영으로 확보된 볼륨이다.
  • 일반 볼륨은 파드 정의 안에 직접 지정하는 형태로 연결되지만, 영구볼륨은 개별 리소스로 생성 후 사용 됨.
    즉, 매니페스트 이용하여 리소스 생성함.
  • 엄밀히 말하면, 컨피그 & 스토리지 리소스가 아닌 클러스터 리소스로 분류됨. 

영구 볼륨 클레임(Persistent Volume Claim)

  • 퍼시스턴트 볼륨 클레임 (Persistent Volume Claim, PVC) 은 사용자가 사용할 PV를 요청하는 명세
  •  사용할 특정 PV를 명시하여 PV를 예약하거나 StorageClass를 지정하여
    원하는 용량의 볼륨을 동적으로 프로비저닝을 받도록 할 수 있음.

 

1-1. PV, PVC Lifecycle

  • 프로비저닝 (provisioning)
    • 정적(static) 또는 동적(dynamic)의 pv를 생성하는 단계
    • pv 생성(= 프로비저닝)
    • 정적 프로비저닝은 매니페스트 파일 등을 통해 특정 용량을 가진 PV를 미리 생성해두고,
      요청이 있을 시 미리 생성한 PV을 할당하여 사용한다.
    • 정상적으로 성공하면 Available 상태
  • 바인딩 (binding)
    • PV를 PVC에 연결시키는 단계
    • 사용자가 요청하는 볼륨을 PV에 요청하고 PV는 그에 맞는 볼륨이 있으면 할당해 줌.
    • PVC가 요청하는 볼륨이 PV에 없다면 해당 요청은 무한정 남아있게 되고,
      PVC가 요청하는 볼륨이 PV에 생성되면 그 요청은 받아들여져 할당 됨.
    • PVC와 PV는 ClaimRef를 사용하는 1:1 관계 이며 바인딩이 정상적으로 완료될 경우 bound 상태
  • 사용 (using)
    • Pod는 PVC를 볼륨으로 사용
    • 클러스터는 PVC를 확인하여 바인딩된 PV를 찾고 해당 볼륨을 Pod에서 사용할 수 있게 함.
    • Pod가 사용중인 PVC를 삭제하려고 하면 Storage Object in Use Protection에 의해 삭제되지 않으며,
       Pod가 PVC를 사용하지 않을때까지 삭제 요청은 연기 된다.
  • 회수 (Reclamiming)
    • PV는 기존에 사용했던 PVC가 아니더라도 다른 PVC로 재활용이 가능하다.
    • 때문에 사용이 종료된 PVC를 삭제할 때, 사용했던 PV의 데이터를 어떻게 처리할지 설정 함.
      1. Retain : PV의 데이터를 그대로 보존 합니다.
      2. Recycle : 재사용하게될 경우 기존의 PV 데이터들을 모두 삭제 후 재사용 합니다.
      3. Delete : 사용이 종료되면 해당 볼륨을 삭제 합니다.

1-2.  PV, PVC 생성하기

 

#PV
apiVersion: v1
kind: PersistentVolume
metadata:
  name:pv-voll
spec:
  accessModes:
  - ReadWriteOnce
  capacity:
  	storage: 1Gi #사용할 용량 1G 설정
  awsElasticBlockStore:
  	volumeID: <volume-id>
    fsType: ext 4

PV 리소스에서 정의할 주요 필드는 다음과 같습니다.

  • .spec.capacity.storage: 스토리지 용량 지정
  • .spec.accessMode: 접근 방식 관련 옵션 (스토리지에 따라 옵션이 다릅니다)
  • .spec.accessModes : 특정 접근 모드 선택
    • ReadWriteOnce: 하나의 노드에서 읽기/쓰기 가능 (RWO)
      ReadWriteMany: 여러 노드에서 읽기/쓰기 가능 (RWM)
      ReadOnlyMany: 여러 노드에서 읽기만 가능 (ROM)
  • .spec.persistentVolumeReclaimPolicy: 회수 정책 (Retain, Delete, Recycle)
  • emptyDir, hostPath : 이러한 볼륨을 지정볼륨에 따른 하위 필드는 달라짐, 노드에 저장되는 디렉토리 설정
#PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name:myclaim
spec:
  accessModes:
  - ReadWriteOnce
 resources:
 	requests:
    	storage: 500Mi

PVC를 생성하고 kubectl get pv,pvc로 조회하면 PV와 PVC가 연결(binding) 되었으므로 상태가 Available 상태에서 Bound으로 변경 된 것을 확인 할 수 있다. 

삭제하는 방법

관리자가 수동으로 삭제할 때까지 PV는 유지된다.  클레임이 삭제되더라도 영구 볼륨 상태를 spec.persistentVolumeReclaimPolicy로 설정할 수 있다. Retain으로 설정하면 유지되도록 하는 것임. Delete하면 즉시 삭제되며, Recycle 옵션을 쓰면 다른 클레임이 쓰기 전에 데이터 볼륨의 데이터가 스크러빙됨.  (데이터 스크러빙: 잘못되거나 완료되지 않은 스토리지 풀의 데이터를 수정 또는 제거하는 데이터 유지 관리 기능)