[Docker] 퍼시스턴트 볼륨(PV)과 퍼시스턴트 볼륨 클레임(PVC)
업데이트:
- 퍼시스턴트 볼륨은 워커 노드들이 네트워크상에서 스토리지를 마운트해 영속적으로 데이터를 저장할 수 있는 볼륨
- 포드에 장애가 생겨 다른 노드로 옮겨가더라도 해당 노드에서 퍼시스턴트 볼륨에 네트워크로 연결해 데이터를 계속해서 사용할 수 있음
9.1 로컬 볼륨 : hostPath, emptyDir
9.1.1 워커 노드의 로컬 디렉터리를 볼륨으로 사용 : hostPath
- 호스트의 디렉터리를 포드와 공유해 데이터를 저장
- 바람직하지 않은 방법임
- 디플로이먼트의 포드에 장애가 생겨 다른 노드로 옮겨갔ㅇ르 경우 이전 노드에 저장된 데이터를 사용할 수 없음
- 스케줄링을 이용해 특정 노드에만 포드를 배치하는 방법 사용할 수 있지만 호스트 서버에 장애가 생기면 데이터를 잃게 된다는 단점 존재
- 모든 노드에 배치해야 하는 특수한 포드의 경우 유용하게 사용 가능
- 모니터링 툴
9.1.2 포드 내의 컨테이너 간 임시 데이터 공유: emptyDir
- 포드가 실행되는 도중에만 필요한 휘발성 데이터를 각 컨테이너가 함꼐 사용할 수 있도록 임시 저장 공간 생성
- 데이터를 영속적으로 보존하지 않음
- 비어있는 상태로 생성되고 포드가 삭제되면 저장되어 있던 데이터도 함께 삭제됨
- 한 컨테이너가 파일을 관리하고 한 컨테이너가 그 파일을 사용하는 경우에 유용하게 사용 가능
9.2 네트워크 볼륨
- 별도의 플러그인 설치없이 다양한 종류의 네트워크 볼륨을 포드에 마운트 할 수 있음
- NFS, iSCSI, GlusterFS, Ceph, AWS-EBS, GCP-gcePersistentDisk
- 네트워크 볼륨의 위치는 특별히 정해진 것 없음
- 네트워크로 접근할 수만 있으면 쿠버네티스 클러스터 내부, 외부 어느 곳에 존재해도 크게 상관 없음
- 단 AWS의 EBS와 같은 클라우드에 종속적인 볼륨을 사용하려면 AWS에서 쿠버네티스 클러스터를 생성할 때 특정 클라우드를 위한 옵션이 별도로 설정돼 있어야 함
NFS를 네트워크 볼륨으로 사용하기
- 대부분의 운영체제에서 사용할 수 있는 네트워크 스토리지
- 여러 개의 클라이언트가 동시에 마운트해 사용할 수 있음
- 여러 개의 스토리지를 클러스터링하는 다른 솔루션에 비해 안정성이 떨어질 수는 있으나 하나의 서버만으로 간편하게 로컬 스토리지처럼 사용할 수 있다는 장점 있음
- NFS 서버와 NFS 클라이언트가 각각 필요
- NFS 서버는 영속적인 데이터가 실제로 저장되는 네트워크 스토리지 서버
- NFS 클라이언트는 워커 노드의 기능을 사용. 따로 준비 필요하지 않음
- 포드가 다른 노드로 옮겨가거나 포드를 재시작해도 삭제되지 않음
9.3 PV, PVC를 이용한 볼륨 관리
9.3.1 퍼시스턴트 볼륨과 퍼시스턴트 볼륨 클레임을 사용하는 이유
- YAML 파일에 한 타입의 네트워크 볼륨을 명시하면 다른 타입을 명시하는 별도의 YAML파일을 여러 개 만들어서 배포해야함
- Persistent Volumn과 Persistent Volumn Claim이라는 오브젝트를 통해 포드가 볼륨의 세부적인 사항을 몰라도 볼륨을 사용할 수 있도록 추상화해줌
- 사용자가 디플로이먼트의 포드에 볼륨을 마운트해 사용하기 위한 과정
- 인프라 관리자가 네트워크 볼륨의 정보를 이용해 퍼시스턴트 볼륨 리소스를 미리 생성.
- NFS나 iSCSI와 같은 스토리지 서버에 마운트하기 위한 엔드포인트 포함
- 사용자(개발자)는 포드를 정의하는 YAML 파일에 ‘이 포드는 데이터를 영속적으로 저장해야 하므로 마운트할 수 있는 외부 볼륨이 필요하다’라는 의미의 퍼시스턴트 볼륨 클레임 명시하고 해당 퍼시스턴트 볼륨 클레임 생성
- 쿠버네티스는 기존에 인프라 관리자가 생성해 뒀던 퍼시트턴트 볼륨의 속성과 사용자가 요청한 퍼시스턴트 볼륨 클레임의 요구 사항이 일치한다면 두 개의 리소스를 매핑시켜 바인드
- 포드가 이 퍼시스턴트 볼륨 클레임을 사용함으로써 포드의 컨테이너 내부에 볼륨이 마운트 된 상태로 생성
- 인프라 관리자가 네트워크 볼륨의 정보를 이용해 퍼시스턴트 볼륨 리소스를 미리 생성.
- 사용자는 디플로이먼트의 YAML 파일에 볼륨의 상세한 스펙을 정의하지 않아도 됨
- 이 디플로이먼트에 볼륨을 마운트할 수 있어야 한다는 의미의 퍼시스턴트 볼륨 클레임을 명시. 실제로 마운트 되는 볼륨이 무엇인지 알 필요 없음
- YAML 파일에도 볼륨정의가 필요없기 때문에 좀 더 보편적인 방식으로 작성 가능
9.3.2 퍼시스턴트 볼륨과 퍼시스턴트 볼륨 클레임 사용하기
AWS에서 EBS를 퍼시스턴트 볼륨으로 사용하기
- AWS에서 EBS 볼륨 생성. 볼륨 ID 기록
- 1번에서 생성한 EBS 볼륨을 쿠버네티스 퍼시스턴트 볼륨으로 등록
- awsElasticBlockStore 항목에 EBS의 볼륨 ID 명시
- 볼륨의 읽기 및 쓰기 속성, 볼륨의 크기 별도 설정
- 퍼시스턴트 볼륨 클레임을 먼저 정의해 생성
- 원하는 볼륨의 조건 나열
- 2번에서 생성한 퍼시스턴트 볼륨의 속성이 3번에서 생성한 퍼시스턴트 볼륨 클레임의 조건과 일치하기 때문에 두 리소스가 연결됨
- 리소스 상태가 Bound 상태로 바뀜
- 최종적으로 EBS 볼륨이 컨테이너 내부에 마운트됨
9.3.3 퍼시스턴트 볼륨을 선택하기 위한 조건 명시
- 퍼시스턴트 볼륨 클레임을 사용하면 실제로 볼륨의 상세 스펙을 알 필요는 없지만 사용하려의 볼륨이 애플리케이션에 필요한 최소조건을 맞출 필요는 있음
- Accessmode나 볼륨의 크기 등
accessModes와 볼륨 크기, 스토리지클래스, 라벨 셀렉터를 이용한 퍼시스턴트 볼륨 선택
- accessModes: 볼륨에 대해 읽기 및 쓰기 작업이 가능한지, 여러 개의 인스턴스에 의해 마운트 될 수 있는지 등
- ReadWriteOnce
- ReadOnlyMany
- ReadWriteMany
- 볼륨의 크기
- accessModes나 볼륨의 크기는 해당 볼륨의 메타데이터일 뿐 볼륨이 실제로 그러한 속성을 가지도록 강제하지 않음
- 스토리지 클래스나 라벨 셀렉터를 이용해 퍼시스턴트 볼륨의 선택을 좀 더 세분화 할 수 있음
- 스토리지 클래스는 볼륨의 대표 속성을 나타냄
- 퍼시스턴트 볼륨을 생성할 때 클래스를 설정하면 해당 클래스를 요청하는 퍼시스턴트 볼륨 클레임과 연결해 바인드
- storageClassName을 별도로 YAML 파일에 명시하지 않으면 똑같이 스토리지 클래스가 설정되지 않은 퍼시스턴트 볼륨 또는 퍼시스턴트 볼륨 클레임과 매칭됨
9.3.4 퍼시스턴트 볼륨의 라이프사이클과 Reclaim Policy
- Available -> Bound -> Released
- Reclaim policy에 따라 Released된 후 퍼시스턴트 볼륨의 상태가 결정됨
- Retain인 경우 퍼시스턴트 볼륨은 연결된 퍼시스턴트 볼륨 클레임을 삭제한 뒤에 Released 상태로 전환됨. 스토리지에 저장된 실제 데이터는 그대로 보존됨
- Delete인 경우 퍼시스턴트 볼륨의 사용이 끝난 뒤에 자동으로 퍼시스턴트 볼륨이 삭제됨
- Recycle은 Delete와 같지만 외부 스토리지 자체를 삭제하지 않는다는 점에서 다름. 쿠버네티스에서 deprecated됨.
9.3.5 StorageClass와 Dynamic Provisioning
- 다이나믹 프로비저닝: 퍼시스턴트 볼륨 클레임이 요구하는 조건과 일치하는 퍼시스턴트 볼륨이 존재하지 않는다면 자동으로 퍼시스턴트 볼륨과 외부 스토리지를 함꼐 프로비저닝하는 기능
- 외부 스토리지를 미리 생성해 둘 필요가 없음
- 단계별 예시
- ‘fast’라는 이름의 스토리지 클래스에는 SDD를 생성하라는 설정을 ‘slow’라는 클래스에는 HDD를 생성하라는 설정을 미리 정의했다고 가정
- 퍼시스턴트 볼륨 클레임에 특정 스토리지 클래스를 명시해 생성. 하지만 AccessMode나 Capacity 등 조건과 일치하는 퍼시스턴트 볼륨이 존재하지 않는 상태.
- 조건에 일치하는 퍼시스턴트 볼륨을 새롭게 만들기 위해 스토리지 클래스에 정의된 속성에 따라서 외부 스토리지를 생성함.
- 새롭게 생성된 외부 스토리지는 쿠버네티스의 퍼시스턴트 볼륨으로 등록되고 퍼시스턴트 볼륨 클레임과 바인딩됨.
- 단, 다이나믹 프로비저닝은 모든 쿠버네티스 클러스터에서 범용적으로 사용할 수 있는 것은 아니고 다이나믹 프로비저닝 기능이 지원되는 스토리지 프로비저너가 미리 활성화 돼 있어야 함
- Reclaim Policy가 자동으로 Delete로 설정됨
- Retain 정책을 사용하고 싶다면 스토리지 클래스를 정의하는 YAML 파일에 reclaimPolicy: Retain 명시하거나 kubectl edit 또는 patch 등의 명령어로 퍼시스턴트 볼륨의 속성을 직접 변경
- 다이나믹 프로비저닝을 사용할 떄 기본적으로 사용할 스토리지 클래스를 annotation을 추가해 설정 가능
댓글남기기