영속적 볼륨 클레임
1. 개요
1. 개요
영속적 볼륨 클레임(PersistentVolumeClaim, PVC)은 쿠버네티스에서 스토리지 리소스를 요청하고 사용하기 위한 추상화 계층이다. 사용자 또는 애플리케이션은 물리적 스토리지 디바이스의 세부 사항을 알 필요 없이, 필요한 스토리지 용량과 접근 방식을 선언적으로 정의하여 사용할 수 있다.
이는 퍼시스턴트 볼륨(PersistentVolume, PV)이라는 실제 스토리지 리소스와 쌍을 이루어 동작한다. PVC는 스토리지에 대한 "요구사항"을 나타내는 반면, PV는 클러스터에 프로비저닝된 실제 스토리지 단위이다. 쿠버네티스 시스템은 PVC의 요구 사항을 충족하는 적절한 PV를 찾아 자동으로 바인딩하는 매커니즘을 제공한다.
PVC의 주요 목적은 스토리지 사용의 편의성과 유연성을 높이는 것이다. 개발자는 인프라의 구체적인 스토리지 타입이나 위치를 고려하지 않고, 애플리케이션에 필요한 스토리지 특성만 정의하면 된다. 이는 애플리케이션 배포의 이식성을 크게 향상시키며, 특히 상태 저장 애플리케이션을 쿠버네티스에서 운영하는 데 필수적인 요소이다.
2. PVC의 개념과 필요성
2. PVC의 개념과 필요성
퍼시스턴트 볼륨 클레임(PersistentVolumeClaim, PVC)은 쿠버네티스 사용자(또는 애플리케이션)가 스토리지 리소스를 요청하기 위해 생성하는 API 오브젝트이다. 사용자는 PVC를 통해 원하는 스토리지의 용량, 접근 방식, 성능 특성(스토리지 클래스)을 명시한다. 이는 사용자가 실제 스토리지 인프라의 세부 사항을 알 필요 없이, 추상화된 방식으로 스토리지를 요청하고 사용할 수 있게 해주는 핵심 메커니즘이다.
PVC는 항상 퍼시스턴트 볼륨(PersistentVolume, PV)과 쌍을 이루어 동작한다. PV는 클러스터 관리자가 프로비저닝하거나 스토리지 클래스를 통해 동적으로 생성된 실제 스토리지 리소스이다. 반면 PVC는 사용자가 PV를 사용하기 위한 '요구서' 또는 '청구권'에 해당한다. 쿠버네티스 컨트롤 플레인은 사용자가 제출한 PVC의 요구 사항(용량, 액세스 모드 등)을 만족하는 적절한 PV를 찾아 양자를 바인딩한다. 이 바인딩이 성립되면 해당 PVC는 바인딩된 PV를 독점적으로 사용할 수 있는 권한을 얻는다.
PVC를 사용하는 주된 이유는 스토리지 관리의 관심사를 분리하기 위함이다. 인프라 팀(클러스터 관리자)은 다양한 종류와 용량의 PV를 클러스터에 준비하는 역할을 담당한다. 반면 애플리케이션 개발 팀은 자신의 애플리케이션 매니페스트에 필요한 스토리지 사양(예: "5Gi의 빠른 SSD 스토리지")만 PVC로 정의하면 된다. 이는 다음과 같은 이점을 제공한다.
* 자율성: 개발자는 인프라 세부 사항 없이 셀프 서비스 방식으로 스토리지를 요청하고 사용할 수 있다.
* 이식성: PVC 정의는 특정 노드나 스토리지 백엔드에 종속되지 않으므로, 애플리케이션 매니페스트의 이식성이 높아진다.
* 추상화: 실제 스토리지 기술(로컬 디스크, NFS, 클라우드 디스크 등)이 변경되더라도 PVC를 사용하는 애플리케이션은 수정할 필요가 없다.
2.1. PVC의 정의
2.1. PVC의 정의
퍼시스턴트 볼륨 클레임(PersistentVolumeClaim, PVC)은 쿠버네티스 사용자가 스토리지 리소스를 요청하는 선언적 API 오브젝트이다. 사용자는 파드가 필요로 하는 스토리지의 용량, 접근 방식, 성능 특성 등을 PVC 명세에 정의한다. PVC는 추상화된 스토리지 요청서 역할을 하여, 사용자가 실제 물리적 스토리지 인프라의 세부 사항을 알 필요 없이 스토리지를 소비할 수 있게 한다.
PVC는 일반적으로 다음과 같은 핵심 사양을 정의한다.
* 용량 (Storage): 요청하는 스토리지의 크기(예: 10Gi)를 지정한다.
* 액세스 모드 (Access Modes): 볼륨이 어떻게 마운트되어 사용될지 정의한다. 주요 모드로는 단일 노드 읽기-쓰기(ReadWriteOnce), 다수 노드 읽기 전용(ReadOnlyMany), 다수 노드 읽기-쓰기(ReadWriteMany) 등이 있다.
* 스토리지 클래스 (StorageClass): 요구하는 스토리지의 '클래스' 또는 프로비저닝 방식을 지정한다. 이는 성능, 백업 정책 등을 결정하는 프로파일이다.
PVC가 생성되면 쿠버네티스 컨트롤 플레인, 특히 퍼시스턴트볼륨 컨트롤러는 사용 가능한 퍼시스턴트 볼륨(PersistentVolume, PV) 리소스 중 PVC의 요구 사항을 만족하는 것을 찾아 양자를 바인딩한다. PV는 실제 스토리지 리소스(예: AWS EBS 볼륨, NFS 공유, 로컬 디스크)를 나타내는 클러스터 수준의 리소스이다. 이 매커니즘을 통해 사용자는 특정 디스크나 볼륨을 직접 관리하지 않고도 일관된 방식으로 스토리지를 할당받고 사용할 수 있다.
2.2. 퍼시스턴트 볼륨(PV)과의 관계
2.2. 퍼시스턴트 볼륨(PV)과의 관계
퍼시스턴트 볼륨(PV)은 클러스터에 의해 프로비저닝된 스토리지 자원 그 자체를 가리킨다. 이는 NFS, iSCSI와 같은 네트워크 스토리지 시스템이나 클라우드 제공자의 블록 스토리지, 로컬 스토리지 등 물리적 스토리지 자원을 추상화한 API 오브젝트이다. 반면, 퍼시스턴트 볼륨 클레임(PVC)은 사용자(또는 파드)가 PV에 대해 하는 스토리지 요청서이다. PVC는 필요한 스토리지의 용량, 접근 모드 등의 사양을 정의한다.
PV와 PVC의 관계는 전통적인 컴퓨팅 자원 할당 모델과 유사하다. PV는 클러스터 관리자가 미리 준비해 놓은 '스토리지 풀'에 속한 개별 디스크와 같다. PVC는 애플리케이션 개발자가 그 풀에서 특정 요구사항(예: 10Gi 용량, 읽기-쓰기 가능)을 명시하여 디스크를 '요청'하는 행위이다. 쿠버네티스 컨트롤 플레인, 정확히는 퍼시스턴트볼륨 컨트롤러는 사용자의 PVC와 사용 가능한 PV를 매칭시켜 바인딩한다. 이 매칭은 PVC에 명시된 스토리지 용량과 액세스 모드 등을 기준으로 이루어진다.
이 관계를 통해 스토리지 사용의 추상화 계층이 생성된다. 개발자는 복잡한 백엔드 스토리지 인프라의 세부 사항을 알 필요 없이, PVC라는 표준화된 인터페이스를 통해 스토리지를 요청하고 사용할 수 있다. 인프라 관리자는 다양한 종류의 스토리지를 PV로 생성해 관리하며, PVC 요청에 따라 적절한 스토리지를 동적으로 할당할 수 있다. PVC는 PV에 대한 '클레임'(요구권)을 나타내므로, 하나의 PV는 하나의 PVC에만 바인딩될 수 있다. 반면, 하나의 PVC는 하나의 PV에 바인딩된다.
PV와 PVC의 라이프사이클은 다음 단계를 따른다.
단계 | PV 상태 | PVC 상태 | 설명 |
|---|---|---|---|
프로비저닝 | Available | - | 스토리지가 클러스터에 PV로 생성되어 사용 가능한 상태 |
바인딩 | - | Pending | PVC가 생성되어 적합한 PV를 찾는 중인 상태 |
바인딩 완료 | Bound | Bound | PVC의 요구사항을 만족하는 PV가 찾아져 서로 연결된 상태 |
사용 중 | Bound | Bound | 바인딩된 PVC가 파드에 마운트되어 사용되는 상태 |
릴리즈 | Released | - | 사용이 끝난 PVC가 삭제되면, PV는 데이터 보존 정책에 따라 Released 상태가 됨 |
반환 | Available / Failed | - | Released 상태의 PV가 재사용을 위해 정리(Available)되거나, 정리 실패 시(Failed) 상태가 됨 |
2.3. PVC를 사용하는 이유
2.3. PVC를 사용하는 이유
퍼시스턴트 볼륨 클레임(PVC)은 쿠버네티스에서 스토리지 리소스를 추상화하고 관리 효율성을 높이기 위해 도입된 핵심 메커니즘이다. PVC를 사용하는 주된 이유는 애플리케이션 개발자와 인프라 관리자의 책임을 명확히 분리하여, 각자가 스토리지의 세부 구현보다는 자신의 관심사에 집중할 수 있게 하기 위함이다. 개발자는 필요한 스토리지의 용량, 성능, 접근 모드와 같은 요구사항만 정의하면 되며, 실제로 어떤 스토리지 클래스나 물리적 디스크가 할당되는지는 신경 쓸 필요가 없다. 이는 애플리케이션 매니페스트를 특정 인프라 환경에 종속되지 않게 만들어 이식성을 크게 향상시킨다.
PVC는 스토리지 리소스의 동적이고 효율적인 프로비저닝을 가능하게 한다. 인프라 관리자가 미리 많은 수의 퍼시스턴트 볼륨(PV)을 생성해 놓지 않아도, 개발자가 PVC를 생성하는 시점에 요구 사항에 맞는 스토리지가 자동으로 할당되는 동적 프로비저닝을 지원한다. 이는 클라우드 환경에서 특히 유용하며, 필요할 때 즉시 스토리지를 확보하고 사용 후 반납하는 유연한 리소스 관리 모델을 실현한다. 결과적으로 스토리지 활용도를 최적화하고 관리 오버헤드를 줄일 수 있다.
또한 PVC는 상태 저장 애플리케이션의 데이터 지속성을 보장하는 데 필수적이다. 파드의 생명주기는 일시적이며, 파드가 재시작되거나 다른 노드로 이동하면 로컬에 저장된 데이터는 사라진다. PVC를 통해 파드 외부의 지속적 스토리지에 데이터를 저장하면, 파드의 스케줄링이나 장애와 무관하게 데이터를 안전하게 유지할 수 있다. 이는 데이터베이스, 파일 서버, 메시지 큐와 같은 상태 저장 워크로드를 쿠버네티스에서 안정적으로 운영하기 위한 토대를 제공한다.
마지막으로, PVC는 스토리지 정책과 생명주기를 체계적으로 관리할 수 있는 통제 지점을 제공한다. PVC를 통해 특정 액세스 모드(예: 단일 노드 읽기-쓰기, 다중 노드 읽기 전용 등)를 명시하거나, 데이터 보존 정책(삭제 시 보존 또는 삭제)을 설정할 수 있다. 이는 데이터의 무결성과 보안 요구사항을 충족시키는 동시에, 스토리지 비용을 관리하는 데도 도움이 된다.
3. PVC 생성 및 명세
3. PVC 생성 및 명세
PVC를 생성하려면 YAML 또는 JSON 형식의 매니페스트 파일을 정의해야 한다. 이 매니페스트는 쿠버네티스 API 서버에 제출되어 PVC 오브젝트를 생성하는 데 사용된다. 주요 구성 요소는 다음과 같다.
필드 | 설명 | 필수 여부 |
|---|---|---|
| 사용하는 쿠버네티스 API 버전 (예: | 예 |
| 리소스 종류 ( | 예 |
| PVC의 이름, 네임스페이스, 라벨 등을 정의하는 메타데이터 | 예 |
| PVC의 사양을 정의하는 핵심 부분 | 예 |
spec 센션 내에는 다음과 같은 주요 필드가 포함된다.
accessModes: PVC가 요구하는 액세스 모드를 지정한다.resources.requests.storage: 요청하는 스토리지의 최소 용량을 지정한다 (예:10Gi).storageClassName: PVC가 바인딩될 스토리지 클래스의 이름을 지정한다. 동적 프로비저닝의 핵심이다.selector: 정적 프로비저닝 시, 특정 레이블을 가진 퍼시스턴트 볼륨을 선택적으로 요청할 수 있다.
액세스 모드는 PVC가 파드에 의해 어떻게 마운트되어 사용될지 정의한다. 주요 모드는 다음과 같다.
ReadWriteOnce(RWO): 볼륨이 단일 노드에서 읽기-쓰기 모드로 마운트될 수 있다.ReadOnlyMany(ROX): 볼륨이 여러 노드에서 읽기 전용 모드로 마운트될 수 있다.ReadWriteMany(RWX): 볼륨이 여러 노드에서 읽기-쓰기 모드로 마운트될 수 있다.
스토리지 클래스는 프로비저닝되는 스토리지의 종류와 매개변수를 정의한다. 관리자는 성능, 백업 정책, 볼륨 유형(예: SSD, HDD) 등이 다른 다양한 스토리지 클래스를 미리 정의할 수 있다. PVC 매니페스트에서 storageClassName을 지정하면, 해당 클래스와 연결된 프로비저너가 동적으로 PV를 생성하여 PVC에 바인딩한다. storageClassName을 빈 문자열("")로 설정하면 스토리지 클래스가 없는 PV만 바인딩 대상이 되며, 필드를 완전히 생략하면 클러스터의 기본 스토리지 클래스가 사용된다[1].
3.1. PVC 매니페스트 구성 요소
3.1. PVC 매니페스트 구성 요소
PVC 매니페스트는 일반적으로 YAML 형식으로 작성되며, 사용자가 원하는 스토리지의 속성을 정의합니다. 주요 구성 요소로는 API 버전, 종류, 메타데이터, 그리고 스펙(명세)이 포함됩니다. 스펙은 PVC의 핵심 요구 사항을 기술하는 부분입니다.
스펙(spec) 내에는 다음과 같은 필드들이 정의됩니다.
* accessModes: 액세스 모드를 지정합니다. 예를 들어 ReadWriteOnce, ReadWriteMany 등이 있습니다.
* resources: 요청하는 스토리지의 양을 정의합니다. requests.storage 필드에 기가바이트(Gi) 또는 메가바이트(Mi) 단위로 용량을 명시합니다.
* storageClassName: 사용할 스토리지 클래스의 이름을 지정합니다. 이는 동적 프로비저닝 시 어떤 유형의 스토리지를 생성할지 결정합니다. 생략하거나 빈 문자열("")로 두면 클러스터의 기본 스토리지 클래스가 사용됩니다.
* selector: 정적 프로비저닝 시, 사전에 생성된 특정 퍼시스턴트 볼륨(PV)을 선택하기 위한 라벨 셀렉터를 정의합니다. matchLabels 또는 matchExpressions를 사용하여 PV를 필터링할 수 있습니다.
* volumeName: PVC를 클러스터 내 존재하는 특정 PV 이름에 직접 바인딩하고자 할 때 사용합니다. 이 필드를 사용하면 selector는 무시됩니다.
다음은 PVC 매니페스트의 간단한 예시입니다.
```yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-data-pvc
spec:
accessModes:
ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: fast-ssd
```
이 매니페스트는 fast-ssd라는 스토리지 클래스를 통해 10GiB 용량의 스토리지를 요청하며, 단일 노드에서 읽기-쓰기 모드로 마운트될 수 있도록 정의합니다.
3.2. 액세스 모드 (Access Modes)
3.2. 액세스 모드 (Access Modes)
액세스 모드는 퍼시스턴트 볼륨 클레임(PVC)이 요청하는 스토리지에 대한 접근 방식을 정의합니다. 이는 PVC가 생성될 때 명시해야 하는 필수 사양 중 하나이며, 퍼시스턴트 볼륨(PV)의 실제 능력과 일치해야 바인딩이 성공합니다. 주로 단일 노드의 단일 파드 접근, 다중 노드의 읽기 전용 접근, 다중 노드의 읽기/쓰기 접근과 같은 시나리오를 구분합니다.
주요 액세스 모드는 다음과 같습니다.
액세스 모드 | 약어 | 설명 |
|---|---|---|
ReadWriteOnce | RWO | 볼륨이 단일 노드에서 읽기-쓰기 모드로 마운트될 수 있습니다. 해당 노드에서 실행되는 여러 파드가 동일한 PVC를 사용할 수 있습니다. |
ReadOnlyMany | ROX | 볼륨이 여러 노드에서 읽기 전용 모드로 마운트될 수 있습니다. |
ReadWriteMany | RWX | 볼륨이 여러 노드에서 읽기-쓰기 모드로 마운트될 수 있습니다. |
이 모드들은 스토리지 공급자의 기술적 능력에 의해 제한됩니다. 예를 들어, 대부분의 블록 스토리지(예: AWS EBS, GCE PD)는 ReadWriteOnce 모드만 지원합니다. 반면, NFS나 일부 클라우드 파일 스토리지 서비스(예: AWS EFS, Azure Files)는 ReadWriteMany 모드를 지원하여 웹 서버 팜이나 콘텐츠 관리 시스템과 같은 공유 데이터가 필요한 애플리케이션에 적합합니다. 사용자는 애플리케이션의 요구 사항과 클러스터의 스토리지 인프라를 고려하여 적절한 액세스 모드를 선택해야 합니다.
3.3. 스토리지 클래스 (StorageClass)
3.3. 스토리지 클래스 (StorageClass)
스토리지 클래스는 퍼시스턴트 볼륨 클레임이 요청하는 스토리지의 '종류' 또는 '등급'을 정의하는 프로비저닝 방법이다. 사용자는 PVC 명세에서 특정 스토리지 클래스의 이름을 지정하여, 원하는 성능, 가용성, 비용 정책을 가진 스토리지를 동적으로 요청할 수 있다. 이는 클라우드 환경의 다양한 스토리지 옵션(예: 표준 HDD, 고성능 SSD, 로컬 SSD)이나 온프레미스 환경의 다른 스토리지 백엔드를 추상화하고 구분하는 역할을 한다.
스토리지 클래스의 핵심 구성 요소는 provisioner, parameters, reclaimPolicy이다. provisioner는 실제 볼륨을 생성할 스토리지 플러그인(예: kubernetes.io/aws-ebs, kubernetes.io/gce-pd, ceph.com/rbd)을 결정한다. parameters는 프로비저너에 따라 다르며, 디스크 유형, 존, 파일 시스템 타입 등의 상세 설정을 제공한다. reclaimPolicy는 PVC가 삭제된 후 연결된 PV를 어떻게 처리할지(Retain, Delete, Recycle) 정의한다.
클러스터 관리자는 애플리케이션 팀의 요구에 맞게 다양한 스토리지 클래스를 미리 정의할 수 있다. 일반적인 예시는 다음과 같다.
스토리지 클래스 이름 | 프로비저너 | 설명 | 주요 파라미터 예시 |
|---|---|---|---|
|
| 표준 성능의 영구 디스크 |
|
|
| 고성능 SSD 볼륨 |
|
|
| 노드에 직접 연결된 SSD | - |
|
| Ceph RBD 블록 스토리지 |
|
PVC에서 storageClassName 필드를 생략하거나 빈 문자열("")로 설정하면, 클러스터 관리자가 지정한 기본 스토리지 클래스가 사용된다. 이는 사용자가 복잡한 스토리지 인프라를 알 필요 없이 간단히 PVC를 생성할 수 있게 한다. 반면, 특정 요구사항이 있을 때는 명시적으로 스토리지 클래스를 지정하여, 애플리케이션에 적합한 스토리지 리소스를 보장받을 수 있다.
4. PVC 바인딩과 라이프사이클
4. PVC 바인딩과 라이프사이클
퍼시스턴트 볼륨 클레임의 라이프사이클은 주로 사용 가능한 퍼시스턴트 볼륨을 찾아 바인딩하는 과정과 그 후의 상태 변화로 정의된다. PVC의 생성 방식에 따라 정적 프로비저닝과 동적 프로비저닝으로 구분된다. 정적 프로비저닝은 클러스터 관리자가 미리 PV를 생성해 놓은 상태에서, 사용자가 생성한 PVC가 해당 PV의 명세(접근 모드, 용량 등)와 일치하는 것을 찾아 바인딩하는 방식이다. 반면, 동적 프로비저닝은 사용자가 PVC를 생성할 때, 미리 정의된 스토리지클래스를 지정하면, 스토리지클래스에 연동된 프로비저너가 자동으로 새로운 PV를 생성하고 PVC에 바인딩하는 방식이다. 동적 프로비저닝은 관리 부담을 줄이고 온디맨드 방식의 스토리지 할당을 가능하게 한다.
PVC는 생성 후 바인딩 프로세스를 거치며 여러 상태를 거친다. 주요 상태는 다음과 같다.
상태 | 설명 |
|---|---|
| PVC가 생성되었으나, 아직 사용 가능한 PV를 찾지 못하거나 동적 프로비저닝이 완료되지 않은 상태이다. |
| PVC가 적합한 PV에 성공적으로 바인딩된 상태이다. 이제 파드에서 해당 PVC를 볼륨으로 사용할 수 있다. |
| PVC가 바인딩되었던 PV가 클러스터에서 삭제된 경우 나타나는 상태이다. 데이터 복구가 불가능할 수 있다. |
| PVC를 사용하던 파드가 PVC를 해제했지만, 아직 PV가 재활용 정책에 따라 처리되지 않은 중간 상태이다. |
바인딩 프로세스는 PVC의 요구 사항(스토리지클래스, 접근 모드, 용량 요청, 레이블 셀렉터 등)과 PV의 명세를 비교하여 가장 적합한 PV를 선택하는 방식으로 진행된다. 동적 프로비저닝 시에는 이 요구 사항을 바탕으로 새로운 PV가 생성된다. 바인딩이 일단 완료(Bound 상태)되면, 해당 바인딩은 배타적이며 PVC와 PV는 1:1 관계를 유지한다.
PVC가 삭제되면, 바인딩된 PV의 운명은 PV에 설정된 persistentVolumeReclaimPolicy에 따라 결정된다. 일반적인 재활용 정책은 Retain, Delete, Recycle이 있다. Retain 정책은 PV를 보존하여 데이터를 수동으로 복구할 수 있게 하며, Delete 정책은 PV와 외부 스토리지 자산을 모두 삭제한다. Recycle 정책은 데이터를 삭제(rm -rf /volume/*)한 후 새로운 PVC에 사용할 수 있도록 하지만, 이 방식은 더 이상 권장되지 않으며 동적 프로비저닝을 사용하는 것이 일반적이다[2].
4.1. 정적 프로비저닝과 동적 프로비저닝
4.1. 정적 프로비저닝과 동적 프로비저닝
퍼시스턴트 볼륨 클레임을 퍼시스턴트 볼륨에 연결하는 방식은 크게 정적 프로비저닝과 동적 프로비저닝 두 가지로 나뉜다. 이 방식들은 클러스터 관리자가 스토리지 리소스를 관리하는 접근법과 사용자(개발자)의 편의성에 차이를 보인다.
정적 프로비저닝에서는 클러스터 관리자가 먼저 하나 이상의 PV를 미리 생성해 둔다. 이 PV들은 실제 물리적 스토리지나 클라우드 디스크와 같은 스토리지 자원을 반영하는 쿠버네티스 API 오브젝트이다. 사용자가 PVC를 생성하면, 쿠버네티스 컨트롤 플레인은 요청된 스토리지 크기, 액세스 모드 등의 조건을 만족하는 미리 생성된 PV를 찾아 PVC와 바인딩한다. 이 방식은 관리자가 스토리지 리소스를 직접 통제하고 할당할 수 있지만, 사용자의 요구가 다양해질수록 미리 모든 경우의 수에 대비한 PV를 준비해야 하는 부담이 있다.
프로비저닝 방식 | 설명 | 관리 주체 | 주요 특징 |
|---|---|---|---|
정적 프로비저닝 | 클러스터 관리자 | 스토리지 리소스를 세밀하게 통제 가능. 사용자 요구 사항이 예측 가능한 환경에 적합. | |
동적 프로비저닝 | 시스템 (스토리지 클래스/프로비저너) | 관리 부담 감소. 요청에 따라 스토리지를 즉시 자동 생성하여 유연성 제공. |
반면 동적 프로비저닝은 사용자가 PVC를 생성할 때, 미리 생성된 PV 풀에서 찾는 대신, PVC 명세에 지정된 스토리지 클래스를 기반으로 새로운 PV를 자동으로 생성한다. 스토리지 클래스는 프로비저너, 파라미터, 리클레임 정책 등을 정의하여 어떤 종류의 스토리지를 어떻게 만들지에 대한 청사진 역할을 한다. 이 방식은 관리자가 미리 많은 PV를 준비할 필요가 없으며, 사용자의 요청에 따라 필요한 스토리지가 실시간으로 프로비저닝되므로 현대적인 클라우드 네이티브 환경에서 선호된다. 동적 프로비저닝이 활성화되면, 정적 프로비저닝으로 생성된 PV는 여전히 사용 가능하지만, 시스템은 일반적으로 동적 프로비저닝을 우선시한다.
4.2. 바인딩 프로세스
4.2. 바인딩 프로세스
PVC의 바인딩 프로세스는 사용자가 생성한 PVC 명세와 클러스터 내 사용 가능한 퍼시스턴트 볼륨 리소스를 연결하는 과정이다. 이 프로세스는 PVC의 요구 사항과 PV의 속성을 기반으로 일대일 매칭을 통해 이루어진다.
바인딩은 주로 PVC 명세의 spec 필드에 정의된 조건에 따라 진행된다. 주요 매칭 조건은 다음과 같다.
매칭 조건 | 설명 |
|---|---|
용량 요청 | PVC가 요청하는 스토리지 용량을 PV가 충족해야 한다. PVC의 요청이 더 작거나 같으면 매칭 대상이 된다. |
액세스 모드 | PVC가 요청한 액세스 모드 (예: ReadWriteOnce)를 PV가 지원해야 한다. |
스토리지 클래스 | PVC에 |
선택기(Selector) | PVC의 |
바인딩 방식은 정적 프로비저닝과 동적 프로비저닝에 따라 다르게 진행된다. 정적 프로비저닝에서는 관리자가 미리 생성해 둔 PV 풀에서 위의 조건을 만족하는 PV를 찾아 바인딩한다. 조건을 만족하는 PV가 없으면 PVC는 Pending 상태로 대기한다. 동적 프로비저닝에서는 조건을 만족하는 기존 PV가 없을 때, PVC에 지정된 스토리지 클래스와 프로비저너가 연동되어 새로운 PV를 자동으로 생성한 후 즉시 해당 PVC에 바인딩한다. 바인딩이 성공적으로 완료되면 PVC와 PV의 상태는 모두 Bound가 된다. 이때 바인딩은 배타적이며, 한 번 바인딩된 PV는 해당 PVC가 삭제되거나 바인딩을 해제하기 전까지 다른 PVC에서 사용할 수 없다.
4.3. PVC 상태 (Pending, Bound, Lost 등)
4.3. PVC 상태 (Pending, Bound, Lost 등)
PVC는 생성 후 사용 가능해지기까지 여러 상태를 거친다. 주요 상태는 다음과 같다.
상태 | 설명 |
|---|---|
Pending | PVC가 생성되었지만, 아직 사용 가능한 퍼시스턴트 볼륨과 바인딩되지 않은 상태이다. 적합한 PV를 찾는 중이거나, 동적 프로비저닝을 통해 스토리지가 생성되는 것을 기다리는 중이다. |
Bound | PVC가 사용 가능한 PV와 성공적으로 연결(바인딩)된 상태이다. 이 상태에서만 파드에 마운트하여 사용할 수 있다. |
Lost | PVC가 이전에 바인딩되었던 PV를 더 이상 찾을 수 없는 상태이다. 이는 일반적으로 PV가 삭제되었거나, 백엔드 스토리지 인프라에 심각한 문제가 발생했을 때 일어난다. |
Released | PVC가 삭제되었지만, 아직 연결된 PV가 다른 PVC에서 재사용될 수 있도록 완전히 정리되지 않은 상태이다. PV의 정책에 따라 데이터가 보존되거나 삭제될 수 있다. |
이러한 상태 변화는 쿠버네티스 컨트롤 플레인의 퍼시스턴트볼륨 컨트롤러에 의해 관리된다. 사용자는 kubectl get pvc 명령을 통해 PVC의 현재 상태를 확인할 수 있다. Lost 상태의 PVC는 일반적으로 관리자의 개입이 필요하며, 바인딩된 PV를 복구할 수 없다면 해당 PVC를 삭제하고 새로 생성해야 한다.
5. PVC 사용 방법
5. PVC 사용 방법
파드는 매니페스트 파일의 spec.volumes 필드에서 영속적 볼륨 클레임을 참조하여 스토리지를 사용한다. volumes 항목 아래에 persistentVolumeClaim을 정의하고, claimName 필드에 생성해 둔 PVC의 이름을 지정한다. 이후 컨테이너의 volumeMounts 필드에서 해당 볼륨을 특정 경로에 마운트한다.
액세스 모드에 따라 사용 방식이 제한된다. ReadWriteOnce 모드로 생성된 PVC는 단일 노드에서 읽기-쓰기로 마운트할 수 있으며, 일반적으로 단일 파드 인스턴스가 전용으로 사용하는 데이터베이스에 적합하다. ReadOnlyMany 모드의 PVC는 여러 노드의 여러 파드에서 동시에 읽기 전용으로 마운트할 수 있어 설정 파일이나 참조 데이터를 배포하는 데 유용하다. ReadWriteMany 모드는 여러 노드의 여러 파드가 동시에 읽고 쓸 수 있는 공유 스토리지를 제공하며, 협업 애플리케이션이나 컨텐츠 관리 시스템과 같은 워크로드에 필요하다.
사용 예시는 다음과 같다.
구성 요소 | 키 | 값 예시 | 설명 |
|---|---|---|---|
PVC 정의 |
|
| 클레임 이름 |
|
| 액세스 모드 | |
|
| 요청 용량 | |
파드 볼륨 |
|
| 파드 내 볼륨 이름 |
|
| 사용할 PVC 이름 | |
컨테이너 마운트 |
|
| 컨테이너 내 마운트 경로 |
|
| 마운트할 볼륨 이름 |
파드가 실행되면 지정된 PVC가 사용 가능한 상태(Bound)여야 하며, 해당 PVC에 정의된 액세스 모드와 스토리지 용량에 따라 스토리지가 프로비저닝되고 마운트된다. 파드가 다른 노드로 재스케줄되더라도 동일한 PVC를 참조하면 데이터는 유지된다.
5.1. 파드에서 PVC 마운트하기
5.1. 파드에서 PVC 마운트하기
파드는 볼륨을 통해 영속적 볼륨 클레임을 마운트하여 스토리지를 사용한다. 파드의 명세 파일(pod.yaml) 내 spec.volumes 항목에서 PVC를 참조하고, spec.containers.volumeMounts 항목에서 컨테이너 내부의 마운트 경로를 지정한다.
아래는 my-pvc라는 이름의 PVC를 파드의 /data 경로에 마운트하는 예시 매니페스트이다.
```yaml
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
volumes:
name: data-storage
persistentVolumeClaim:
claimName: my-pvc
containers:
name: my-container
image: nginx
volumeMounts:
mountPath: "/data"
name: data-storage
```
파드가 생성되면, 쿠버네티스 스케줄러는 PVC가 바인딩된 퍼시스턴트 볼륨이 위치한 노드를 고려하여 파드를 적절한 노드에 배치한다. 이후 해당 노드의 kubelet이 실제 스토리지 장치를 지정된 컨테이너 경로에 마운트한다. 파드 내 여러 컨테이너가 동일한 PVC를 서로 다른 경로에 마운트하여 데이터를 공유할 수도 있다.
PVC의 액세스 모드는 파드의 사용 방식을 결정한다. 예를 들어, ReadWriteOnce 모드의 PVC는 단일 노드의 여러 파드에서 동시에 마운트할 수 없지만, ReadWriteMany 모드의 PVC는 여러 노드에 걸친 여러 파드에서 동시에 읽기 및 쓰기로 마운트할 수 있다. 파드의 마운트 설정은 PVC에 정의된 액세스 모드와 호환되어야 한다.
5.2. ReadWriteOnce, ReadOnlyMany, ReadWriteMany 활용
5.2. ReadWriteOnce, ReadOnlyMany, ReadWriteMany 활용
이 세 가지 액세스 모드는 퍼시스턴트 볼륨이 하나 이상의 파드에 의해 어떻게 마운트될 수 있는지를 정의합니다. 각 모드는 특정 스토리지 솔루션의 기능과 애플리케이션의 요구 사항에 따라 선택됩니다.
액세스 모드 | 설명 | 일반적인 사용 사례 | 지원 스토리지 예시 |
|---|---|---|---|
ReadWriteOnce (RWO) | 볼륨이 단일 노드에서 하나 이상의 파드에 읽기-쓰기 모드로 마운트될 수 있습니다. | 단일 파드 또는 단일 노드에서 실행되는 복제본 세트가 전용 스토리지를 필요로 할 때 사용됩니다. MySQL, PostgreSQL과 같은 단일 인스턴스 데이터베이스에 적합합니다. | 대부분의 블록 스토리지 (예: AWS EBS, GCP Persistent Disk, Azure Disk) |
ReadOnlyMany (ROX) | 볼륨이 여러 노드에 걸쳐 여러 파드에 읽기 전용 모드로 마운트될 수 있습니다. | 설정 파일, 정적 콘텐츠, 코드 라이브러리 등 여러 파드가 동일한 데이터를 읽기만 해야 하는 경우에 사용됩니다. | 일부 파일/객체 스토리지 (예: NFS, CephFS, 클라우드 스토리지) |
ReadWriteMany (RWX) | 볼륨이 여러 노드에 걸쳐 여러 파드에 읽기-쓰기 모드로 마운트될 수 있습니다. | 여러 파드가 동일한 스토리지 공간에 동시에 읽고 써야 하는 공유 스토리지가 필요한 경우에 사용됩니다. | 파일 기반 스토리지 (예: NFS, CephFS, GlusterFS) |
애플리케이션을 설계할 때는 필요한 액세스 패턴을 먼저 평가해야 합니다. 예를 들어, 스테이트풀셋을 사용하는 분산 데이터베이스는 일반적으로 각 파드 복제본마다 전용 스토리지가 필요하므로 ReadWriteOnce 모드를 사용합니다. 반면, 콘텐츠 관리 시스템이나 협업 도구는 여러 워커 파드가 공통 업로드 디렉토리에 접근해야 할 수 있어 ReadWriteMany 모드가 필요합니다. 선택한 액세스 모드는 PVC 매니페스트의 spec.accessModes 필드에 배열로 지정하며, 이는 프로비저닝될 실제 스토리지의 기능과 일치해야 바인딩이 성공합니다[3].
6. PVC 관리 및 운영
6. PVC 관리 및 운영
PVC의 확장은 스토리지 클래스가 확장을 지원하고, 해당 퍼시스턴트 볼륨이 확장을 허용하는 경우에 가능하다. 사용자는 PVC 매니페스트의 spec.resources.requests.storage 필드 값을 증가시켜 확장을 요청한다. 확장 작업은 일반적으로 온라인 상태에서 이루어지며, 파드 재시작 없이 파일 시스템 크기를 조정할 수 있다. 그러나 모든 스토리지 백엔드가 이 기능을 지원하는 것은 아니다[4].
PVC를 삭제할 때의 데이터 보존 정책은 PV의 persistentVolumeReclaimPolicy에 의해 결정된다. 이 정책에는 주로 세 가지 유형이 있다.
정책 | 설명 |
|---|---|
| PVC 삭제 후에도 PV와 데이터가 보존된다. 관리자가 수동으로 정리해야 한다. |
| PVC 삭제 시 연관된 PV와 외부 스토리지의 데이터도 함께 삭제된다. |
| 데이터 삭제 후 PV를 재사용 가능한 상태로 만든다. 더 이상 권장되지 않는다. |
데이터 보존이 중요한 환경에서는 Retain 정책을 사용하는 것이 안전하다.
스냅샷 기능을 통해 PVC의 특정 시점 데이터 복사본을 생성할 수 있다. 이는 VolumeSnapshot API 리소스를 통해 관리된다. 스냅샷 생성 후, 이를 기반으로 새로운 PVC를 프로비저닝하여 데이터를 복원할 수 있다. 스냅샷 생성 및 복원 작업 역시 스토리지 백엔드와 스토리지 클래스의 지원 여부에 따라 달라진다. 이 기능은 데이터 백업, 애플리케이션 테스트, 롤백 시나리오에 유용하다.
6.1. PVC 확장 (Resizing)
6.1. PVC 확장 (Resizing)
PVC 확장은 생성된 영속적 볼륨 클레임의 스토리지 용량 요구 사항을 증가시키는 작업이다. 쿠버네티스 1.11 버전부터 베타 기능으로 도입되었으며, 1.16 버전부터는 많은 스토리지 플러그인에서 안정적으로 지원한다[5]. 이 기능은 애플리케이션의 데이터 증가에 따라 스토리지 용량을 유연하게 늘릴 수 있게 해주며, 서비스 중단 없이 온라인 상태에서 수행되는 경우가 많다.
확장을 위해서는 몇 가지 전제 조건이 충족되어야 한다. 먼저, 사용 중인 스토리지 클래스가 allowVolumeExpansion: true 필드를 설정하여 확장을 허용해야 한다. 또한, 백엔드 스토리지 프로비저너(예: CSI 드라이버)가 볼륨 확장을 지원해야 하며, 해당 퍼시스턴트 볼륨이 동적 프로비저닝으로 생성된 것이어야 한다. 정적 프로비저닝으로 생성된 PV는 일반적으로 확장이 지원되지 않는다.
확장 작업은 PVC 매니페스트 파일에서 spec.resources.requests.storage 필드의 값을 원하는 더 큰 용량으로 수정하여 시작한다. 이는 kubectl edit pvc <pvc-name> 명령이나 매니페스트 파일을 적용(kubectl apply)하는 방식으로 수행할 수 있다. 변경 사항이 적용되면 쿠버네티스 컨트롤 플레인은 다음 단계를 순차적으로 실행한다.
1. PVC의 상태가 Bound에서 FileSystemResizePending으로 변경된다.
2. 컨트롤 플레인이 백엔드 스토리지 공급자에게 실제 볼륨 확장을 요청한다.
3. 확장이 완료되면, PVC가 마운트된 파드를 재시작하지 않고도 파일 시스템의 온라인 확장을 지원하는 스토리지 시스템의 경우 자동으로 파일 시스템 크기가 조정된다[6].
4. 파일 시스템 확장이 완료되면 PVC 상태는 다시 Bound로 돌아가고, 새로운 용량이 반영된다.
확장 작업은 일반적으로 데이터 손실 없이 이루어지지만, 축소(용량 감소)는 보안상의 이유와 데이터 손실 위험으로 인해 대부분의 스토리지 시스템과 쿠버네티스에서 지원하지 않는다. 또한, 확장 후에도 PVC의 다른 스펙(예: 액세스 모드나 스토리지 클래스)은 변경할 수 없다. 운영 시에는 확장 작업 전에 충분한 용량 계획을 수립하고, 지원되는 스토리지 백엔드를 확인하며, 중요한 데이터에 대해서는 확장 전 스냅샷 백업을 고려하는 것이 모범 사례에 해당한다.
6.2. PVC 삭제와 데이터 보존 정책
6.2. PVC 삭제와 데이터 보존 정책
PVC를 삭제할 때, 연결된 퍼시스턴트 볼륨의 데이터가 어떻게 처리될지는 PV의 reclaimPolicy에 따라 결정된다. 기본 정책은 PVC가 삭제되면 연결된 PV의 상태가 Released로 변경되고, 이후 스토리지 공간을 회수(Reclaim)하는 과정이 수행된다.
주요 데이터 보존 정책은 다음과 같다.
정책(Reclaim Policy) | 설명 | 데이터 보존 여부 | 일반적 사용 시나리오 |
|---|---|---|---|
| PVC 삭제 후 PV를 삭제하지 않고 보관한다. 볼륨은 | 보존됨 | 데이터의 안전한 보관이 최우선인 경우(예: 데이터베이스 백업 볼륨) |
| PVC 삭제 시 연결된 PV와 물리적 스토리지 자원을 모두 자동으로 삭제한다. | 삭제됨 | 테스트 환경이나 임시 데이터 처리 시 |
| 데이터를 삭제( | 삭제됨 | 더 이상 권장되지 않음 |
Retain 정책이 적용된 PV는 PVC 삭제 후에도 데이터가 물리적 스토리지에 그대로 남아 있다. 관리자는 이 PV를 수동으로 삭제하거나, 데이터를 백업한 후 새로운 PVC에 수동으로 바인딩하여 재사용할 수 있다. 이는 실수로 PVC를 삭제하는 경우 데이터를 보호하는 중요한 안전장치 역할을 한다.
반면, Delete 정책은 주로 동적 프로비저닝 환경에서 사용되며, PVC 삭제 시 외부 스토리지 시스템(예: AWS EBS, 구글 클라우드 Persistent Disk)의 볼륨까지 함께 삭제하여 불필요한 비용 발생을 방지한다. 운영 환경에서는 데이터의 중요성과 스토리지 비용을 고려하여 신중하게 정책을 선택해야 한다.
6.3. 스냅샷과 복원
6.3. 스냅샷과 복원
PVC 스냅샷은 특정 시점의 퍼시스턴트 볼륨 데이터의 상태를 보존하는 기능이다. 이는 주로 데이터 백업, 애플리케이션 롤백, 새로운 환경에 데이터 복제 등의 목적으로 사용된다. 스냅샷 생성은 일반적으로 스토리지 공급자가 제공하는 CSI 드라이버를 통해 이루어지며, 스냅샷 생성 중에도 원본 볼륨은 정상적으로 읽기 및 쓰기 작업이 가능하다[7]. 생성된 스냅샷은 별도의 스토리지 공간에 저장되며, 원본 PVC와 독립적인 생명주기를 가진다.
스냅샷을 기반으로 한 PVC 복원은 크게 두 가지 방식으로 이루어진다. 첫째는 기존 PVC의 데이터를 스냅샷 시점으로 되돌리는 것이다. 둘째는 스냅샷을 원본으로 하는 완전히 새로운 PVC를 프로비저닝하는 것이다. 후자의 방식은 테스트 환경 구성이나 데이터 분석을 위한 샌드박스 생성에 유용하게 활용된다. 복원 작업은 VolumeSnapshot 및 VolumeSnapshotContent라는 쿠버네티스 리소스를 사용하여 선언적으로 관리된다.
리소스 종류 | 역할 | 생명주기 관리 |
|---|---|---|
| 사용자가 생성하는 스냅샷 요청 명세. PVC를 참조함. | 네임스페이스 레벨의 리소스. 사용자에 의해 관리됨. |
| 클러스터 관리자가 프로비저닝하거나 CSI 드라이버에 의해 동적으로 생성되는 실제 스냅샷. | 클러스터 레벨의 리소스. |
| 동적 스냅샷 생성 시 사용할 CSI 드라이버 및 파라미터를 정의함. | 스토리지 클래스( |
모든 스토리지 솔루션이 스냅샷 기능을 지원하는 것은 아니며, 기능의 세부 사항(예: 증분 스냅샷 지원 여부)도 공급자마다 다르다. 따라서 스냅샷 및 복원 전략을 수립할 때는 사용 중인 스토리지 백엔드의 문서를 참고하여 호환성과 제한 사항을 반드시 확인해야 한다. 또한 스냅샷은 데이터 보호 전략의 일부일 뿐, 재해 복구를 위해서는 스냅샷을 외부 시스템으로 이관하는 추가적인 백업 절차가 필요할 수 있다.
7. 주요 사용 사례
7. 주요 사용 사례
주요 사용 사례는 영속적 볼륨 클레임이 실제 환경에서 어떻게 활용되는지를 보여준다. 가장 대표적인 사례는 상태 저장 애플리케이션의 데이터를 안정적으로 관리하는 것이다. 데이터베이스 시스템(예: MySQL, PostgreSQL, MongoDB)은 파드가 재시작되거나 다른 노드로 이동하더라도 데이터가 유지되어야 한다. PVC를 사용하면 데이터베이스 파드가 특정 퍼시스턴트 볼륨에 연결되고, 해당 스토리지는 파드의 생명주기와 독립적으로 유지된다. 이는 스테이트풀셋과 함께 사용될 때 특히 효과적이며, 애플리케이션의 상태를 쿠버네티스 클러스터 외부의 안정적인 스토리지에 보관할 수 있게 한다.
또 다른 중요한 사용 사례는 여러 파드가 동일한 데이터셋에 접근해야 하는 공유 스토리지 시나리오다. 예를 들어, 콘텐츠 관리 시스템이나 미디어 처리 파이프라인은 업로드된 파일을 여러 인스턴스가 읽고 써야 할 수 있다. 이 경우 PVC의 액세스 모드를 ReadWriteMany(RWX)로 설정하고, NFS 또는 클라우드 제공자의 공유 파일 시스템 서비스와 같은 지원 스토리지 백엔드를 사용한다. 이를 통해 단일 PVC가 여러 노드에 걸쳐 실행되는 여러 파드에 마운트될 수 있다.
다음 표는 주요 사용 사례와 권장되는 PVC 설정을 요약한다.
사용 사례 | 예시 애플리케이션 | 권장 액세스 모드 | 스토리지 클래스 특성 |
|---|---|---|---|
단일 인스턴스 데이터베이스 | MySQL, PostgreSQL | ReadWriteOnce (RWO) | 높은 IOPS, 낮은 지연시간 |
분산/공유 파일 저장소 | 웹 서버 로그, 미디어 파일 | ReadWriteMany (RWX) | 네트워크 기반 공유 스토리지 |
읽기 전용 구성 배포 | 설정 파일, 정적 자산 | ReadOnlyMany (ROX) | 저비용, 스냅샷에서 생성 가능 |
또한, 머신 러닝 워크플로우나 배치 처리 작업에서 대용량의 학습 데이터나 중간 결과를 저장하는 데에도 PVC가 널리 사용된다. 이러한 작업은 종종 일시적인 파드에 의해 실행되지만, 생성된 데이터는 영구적으로 보관되어 후속 분석이나 다른 작업에 재사용되어야 한다. PVC는 이러한 데이터의 수명 주기를 파드와 분리하여 관리할 수 있는 유연성을 제공한다.
7.1. 상태 저장 애플리케이션 (데이터베이스 등)
7.1. 상태 저장 애플리케이션 (데이터베이스 등)
데이터베이스, 키-값 저장소, 메시지 큐와 같은 상태 저장 애플리케이션은 PVC의 가장 대표적인 사용 사례이다. 이러한 애플리케이션은 실행 중 생성된 데이터를 영구적으로 보존해야 하며, 파드가 재시작되거나 다른 노드로 이동하더라도 동일한 데이터에 접근할 수 있어야 한다. PVC는 파드의 라이프사이클과 분리된 독립적인 스토리지 리소스를 제공함으로써 이 요구사항을 충족시킨다.
일반적인 데이터베이스 배포 시, 데이터 파일을 저장할 PVC를 생성하고 이를 데이터베이스 파드에 마운트한다. 이때 액세스 모드는 주로 단일 노드에서 읽기-쓰기가 가능한 ReadWriteOnce를 사용한다. 아래는 주요 데이터베이스와 PVC 사용의 연관성을 보여주는 예시이다.
애플리케이션 유형 | 일반적인 PVC 사용 방식 | 주로 사용하는 액세스 모드 |
|---|---|---|
데이터 디렉토리( | ReadWriteOnce | |
지속성 스냅샷 파일이 저장되는 디렉토리를 PVC에 저장 | ReadWriteOnce | |
데이터 파일을 저장할 디렉토리를 PVC에 저장 | ReadWriteOnce |
PVC를 사용하면 데이터베이스 파드를 스케일링하거나 업그레이드할 때 데이터의 영속성을 보장할 수 있다. 예를 들어, 데이터베이스 파드를 삭제하고 새 버전의 파드를 생성하더라도 동일한 PVC를 참조하면 모든 데이터가 그대로 유지된다. 또한, 스테이트풀셋과 함께 PVC를 사용하면 각 파드 복제본마다 전용의 영구 스토리지를 안정적으로 프로비저닝할 수 있어, 복제본 간 데이터 일관성을 유지하는 데 필수적이다[8].
7.2. 공유 스토리지 활용
7.2. 공유 스토리지 활용
PVC는 단일 파드 전용으로 사용되는 ReadWriteOnce 액세스 모드 외에도, 여러 파드가 동시에 데이터를 읽고 쓸 수 있는 공유 스토리지를 구성하는 데 핵심적인 역할을 한다. 이는 ReadWriteMany 또는 ReadOnlyMany 액세스 모드를 지원하는 스토리지 백엔드와 스토리지클래스를 통해 구현된다. 공유 스토리지는 웹 서버의 정적 콘텐츠, 공동 편집 문서, 중앙 집중식 로그 저장소, 또는 MLOps 파이프라인의 모델 아티팩트 저장과 같이 다수의 인스턴스가 동일한 데이터셋에 접근해야 하는 애플리케이션에 필수적이다.
공유 스토리지를 활용하는 일반적인 패턴은 다음과 같다. 먼저, 관리자는 NFS, CephFS, GlusterFS 또는 클라우드 공유 파일 서비스(예: AWS EFS, Azure Files, Google Cloud Filestore)와 같은 공유 스토리지 시스템을 기반으로 하는 스토리지클래스를 생성한다. 이후 애플리케이션 개발자는 이 스토리지 클래스를 참조하고 액세스 모드를 ReadWriteMany로 지정한 PVC 매니페스트를 작성하여 배포한다. 쿠버네티스 컨트롤 플레인은 이 PVC 사양에 맞는 공유 스토리지 볼륨을 동적으로 프로비저닝하거나, 미리 생성된 퍼시스턴트볼륨에 바인딩한다. 최종적으로, 이 PVC는 디플로이먼트나 스테이트풀셋과 같은 워크로드의 여러 파드 템플릿에 동일하게 참조되어 마운트된다.
사용 사례 | 설명 | 일반적인 액세스 모드 |
|---|---|---|
콘텐츠 관리 시스템(CMS) | 여러 웹 서버 파드가 동일한 업로드된 미디어 파일과 템플릿에 접근 | ReadWriteMany |
CI/CD 파이프라인 | 여러 빌드/테스트 파드가 소스 코드, 의존성, 빌드 아티팩트를 공유 | ReadWriteMany |
데이터 분석 플랫폼 | 여러 워커 파드가 대규모 데이터셋이나 학습된 모델을 읽기 전용으로 접근 | ReadOnlyMany |
중앙 집중식 로깅 | 여러 애플리케이션 파드가 동일한 로그 디렉토리에 로그 파일을 기록 | ReadWriteMany |
이러한 구성을 통해 애플리케이션은 확장성과 데이터 일관성을 유지할 수 있다. 예를 들어, 디플로이먼트의 레플리카 수를 늘려도 모든 새로운 파드는 동일한 PVC를 통해 마운트된 공유 스토리지의 데이터를 즉시 인식한다. 그러나 성능과 데이터 무결성에 주의해야 한다. 특히 ReadWriteMany 모드에서 여러 파드가 동일한 파일에 동시에 쓰기를 수행할 경우, 파일 잠금 메커니즘이나 애플리케이션 수준의 동시성 제어가 필요할 수 있다. 또한, 선택한 공유 스토리지 솔루션의 실제 성능(IOPS, 지연 시간, 대역폭)과 가용성은 전체 애플리케이션 성능에 직접적인 영향을 미친다.
8. 모범 사례와 주의사항
8. 모범 사례와 주의사항
적절한 스토리지 클래스 선택은 애플리케이션의 성능, 비용, 가용성 요구사항에 기반해야 합니다. 고성능 SSD 기반 스토리지는 데이터베이스와 같은 I/O 집약적 워크로드에 적합하지만, 저비용 HDD 스토리지는 로그나 백업 데이터 저장에 효율적입니다. 또한, 클라우드 환경에서는 지역별 가용성과 내구성 보장 수준(예: 단일 존, 다중 존)을 고려하여 클래스를 선택해야 합니다.
용량 및 액세스 모드 계획은 초기 설계 단계에서 신중하게 수립해야 합니다. PVC 생성 후 용량 확장이 가능한 스토리지 클래스도 있지만, 모든 백엔드 스토리지가 이를 지원하는 것은 아닙니다. 따라서 예상 데이터 증가량을 고려하여 여유분을 포함한 용량을 요청하는 것이 좋습니다. 액세스 모드(예: ReadWriteOnce, ReadWriteMany)는 애플리케이션의 실제 사용 패턴을 반영해야 하며, 필요 이상으로 넓은 권한을 부여하면 보안상 취약점이 될 수 있습니다.
효과적인 백업 전략은 데이터 손실을 방지하는 핵심입니다. 스토리지 백엔드의 내장 스냅샷 기능을 활용하거나, Velero와 같은 쿠버네티스 네이티브 백업 도구를 사용하여 PVC와 애플리케이션 상태를 함께 백업할 수 있습니다. 백업 정책에는 백업 빈도, 보존 기간, 재해 복구 절차가 명확히 정의되어야 합니다. 특히, Retain 삭제 정책을 설정하지 않은 PVC를 삭제하면 연결된 퍼시스턴트 볼륨과 데이터가 모두 삭제될 수 있으므로 주의가 필요합니다.
8.1. 적절한 스토리지 클래스 선택
8.1. 적절한 스토리지 클래스 선택
애플리케이션의 성능, 비용, 가용성 요구사항에 맞는 스토리지 클래스를 선택하는 것은 PVC 설계의 핵심 단계이다. 각 스토리지 클래스는 백엔드 스토리지 시스템의 유형(예: SSD, 표준 HDD), 프로비저닝 방식, 리플리케이션 정책, 가격 모델 등을 정의한다. 잘못된 선택은 성능 병목 현상을 초래하거나 불필요한 비용을 발생시킬 수 있다.
성능이 중요한 데이터베이스나 트랜잭션 처리 시스템의 경우, 낮은 지연 시간과 높은 IOPS를 제공하는 SSD 기반의 프리미엄 스토리지 클래스를 선택하는 것이 일반적이다. 반면, 로그 저장, 백업 데이터, 개발/테스트 환경과 같이 대용량이지만 빈번한 액세스가 필요하지 않은 워크로드에는 표준 HDD 스토리지 클래스를 사용하여 비용을 절감할 수 있다. 또한, 클라우드 공급자가 제공하는 지역별 또는 존별 스토리지 옵션을 고려하여 데이터 위치와 내구성 요구사항을 충족시켜야 한다.
다음 표는 주요 선택 기준과 고려 사항을 정리한 것이다.
선택 기준 | 고려 사항 | 예시 |
|---|---|---|
성능 | 지연 시간, IOPS, 처리량 | 고성능 SSD vs 표준 HDD |
가용성 | 리플리케이션 수준, 존/지역 장애 복구 | 단일 존 스토리지 vs 지역 스토리지 |
비용 | 프로비저닝된 용량당 가격, 트랜잭션 비용 | 프리미엄 티어 vs 표준 티어 |
기능 | 스냅샷 지원, 볼륨 확장 가능성, 암호화 | 동적 확장이 가능한 클래스 |
공급자 | 온프레미스, 클라우드 공급자, CSI 드라이버 | AWS gp3, Azure Premium SSD, vSphere CSI |
마지막으로, 애플리케이션의 라이프사이클과 운영 요구사항을 고려해야 한다. 예를 들어, 동적으로 생성되고 삭제되는 임시 데이터에는 Delete 리클레임 정책이 설정된 스토리지 클래스를, 장기 보존이 필요한 데이터에는 Retain 정책이 설정된 클래스를 사용한다. 또한, 향후 용량 확장이 예상된다면 allowVolumeExpansion: true 속성을 지원하는 스토리지 클래스를 미리 선택하는 것이 좋다.
8.2. 용량 및 액세스 모드 계획
8.2. 용량 및 액세스 모드 계획
애플리케이션의 요구사항과 예상되는 데이터 성장을 기반으로 적절한 용량을 사전에 계획하는 것이 중요합니다. PVC 생성 시 spec.resources.requests.storage 필드에 명시된 용량은 프로비저닝의 기준이 되며, 많은 스토리지 클래스는 이후 PVC 확장을 지원합니다. 그러나 확장 작업이 항상 가능한 것은 아니며, 파일 시스템 유형이나 백엔드 스토리지 시스템에 제약이 있을 수 있습니다. 따라서 초기 용량을 너무 작게 설정하면 애플리케이션 가용성에 영향을 미칠 수 있고, 너무 크게 설정하면 불필요한 비용이 발생할 수 있습니다. 데이터 증가율과 애플리케이션의 중요도를 고려하여 안전 마진을 포함한 용량을 산정하고, 확장 가능성을 사전에 확인하는 것이 좋습니다.
액세스 모드 선택은 애플리케이션의 데이터 접근 패턴을 정확히 이해하는 데서 시작합니다. ReadWriteOnce는 단일 노드에서 읽기-쓰기 마운트를 허용하므로, 대부분의 데이터베이스나 단일 파드 애플리케이션에 적합합니다. ReadOnlyMany는 여러 노드에서 동시에 읽기 전용으로 마운트할 수 있어, 설정 파일이나 정적 콘텐츠를 제공하는 시나리오에 유용합니다. ReadWriteMany는 여러 노드에서 동시에 읽기-쓰기를 지원해야 하는 공유 워크스페이스나 협업 애플리케이션에 필요합니다. 각 액세스 모드는 지원하는 스토리지 클래스와 백엔드 스토리지 시스템이 다르므로, 애플리케이션 설계 단계에서 요구되는 동시 접근 방식을 정의하고, 이를 충족하는 스토리지 솔루션을 선택해야 합니다.
용량과 액세스 모드 계획은 종합적으로 고려되어야 합니다. 예를 들어, ReadWriteMany 모드를 요구하는 애플리케이션은 특정 네트워크 연결 스토리지(NAS, 객체 스토리지 등)에 의존하게 되며, 이는 용량 확장 정책이나 성능 특성에 영향을 줄 수 있습니다. 아래 표는 계획 시 주요 고려 사항을 비교한 것입니다.
고려 요소 | 설명 및 계획 시 참고사항 |
|---|---|
초기 용량 | 애플리케이션 설치 및 초기 운영에 필요한 최소 용량 + 단기 성장분을 설정합니다. |
확장 가능성 | 사용할 스토리지 클래스의 |
액세스 모드 | 애플리케이션 아키텍처(단일/다중 파드, 읽기/쓰기 패턴)에 따라 필수 모드를 결정합니다. |
스토리지 클래스 | 결정된 액세스 모드와 용량 확장 요구사항을 지원하는 클래스를 선택합니다. |
성능 요구사항 | IOPS, 처리량, 지연 시간 요구사항이 스토리지 클래스의 프로비저닝 매개변수와 맞는지 확인합니다. |
잘못된 액세스 모드 선택은 애플리케이션 배포 실패나 데이터 불일치로 이어질 수 있으며, 용량 부족은 운영 중단을 초래할 수 있습니다. 따라서 개발 단계에서부터 스토리지 요구사항을 명확히 정의하고, 테스트 환경에서 검증하는 것이 바람직합니다.
8.3. 백업 전략
8.3. 백업 전략
영속적 볼륨 클레임을 사용하는 상태 저장 애플리케이션의 데이터는 비즈니스 연속성을 위해 체계적인 백업 전략이 필수적이다. PVC의 백업은 단순히 파드나 노드를 복제하는 것과 달리, 실제 데이터가 저장된 퍼시스턴트 볼륨의 내용을 안전한 위치로 복사하고 필요시 복원할 수 있는 체계를 구축하는 것을 의미한다.
주요 백업 방법으로는 스토리지 공급자 수준의 스냅샷, 애플리케이션 수준의 내보내기, 그리고 파일 시스템 수준의 복사가 있다. 많은 클라우드 공급자의 스토리지 클래스는 볼륨 스냅샷 기능을 지원하며, 쿠버네티스의 VolumeSnapshot API를 사용해 관리할 수 있다. 이 방법은 빠르지만, 특정 스토리지 인프라에 종속될 수 있다. 애플리케이션 내부 도구(예: mysqldump, pg_dump)를 사용한 논리적 백업은 더 이식성이 높지만, 대용량 데이터베이스의 경우 시간이 오래 걸리고 애플리케이션에 부하를 줄 수 있다. 또 다른 방법은 실행 중인 파드에 백업 도구가 포함된 사이드카 컨테이너를 추가하거나, 백업 전용 잡을 생성하여 PVC를 마운트하고 데이터를 외부 오브젝트 스토리지로 복사하는 것이다.
효과적인 백업 전략을 수립할 때는 다음 사항을 고려해야 한다.
RPO(복구 시점 목표)와 RTO(복구 시간 목표): 데이터 손실 허용 시간과 복구 소요 시간에 따라 백업 빈도와 방법을 결정한다.
백업 검증: 정기적으로 백업 파일의 무결성을 확인하고 복원 절차를 테스트하여 백업이 실제로 작동하는지 검증한다.
백업 보관 및 라이프사이클: 최신 백업뿐만 아니라 과거 특정 시점으로의 복원이 필요할 수 있으므로, 백업의 보관 주기와 저장소 계층화 정책을 정의한다.
선언적 관리: 백업 작업 자체도 쿠버네티스 매니페스트나 헬름 차트로 정의하여 버전 관리하고 재현 가능하게 만든다.
마지막으로, PVC의 백업은 단일 컴포넌트가 아닌 애플리케이션 전체 컨텍스트에서 고려해야 한다. 중요한 구성 파일이나 시크릿도 함께 백업해야 하며, 복원 시에는 애플리케이션 버전과 데이터 스키마의 호환성 문제가 발생하지 않도록 주의한다.
