스토리지 - Volume
- k8s에서 지원하는 볼륨은 Ephemeral Volume과 Persistance Volume 등을 지원
- Ephemeral은 Pod 삭제 시, 같이 삭제
- Persistance는 Pod가 삭제되어도 유지
- volume은 디렉터리 취급을 받으며 Pod 내 컨테이너에서 접근
- volume 을 사용하려면
- spec.volumes 필드에서 Pod에 제공할 volume을 지정하고 spce.containers[*].volumeMounts의 컨테이너에 해당 volume을 mount할 위치를 선언
- volume은 다른 volume 안에 mount될 수 없고 다른 volume에 있는 내용물을 가리키는 하드링크를 포함할 수 없다.
스토리지 - Persistance Volume(PV)
- 관리자가 프로비저닝 하거나 스토리지 클래스를 사용하여 동적으로 프로비저닝한 클러스터의 스토리지
- 클러스터 리소스
- Volumes와 같은 볼륨 플러그인이지만, PV를 사용하는 개별 Pod 와는 다른 라이프사이클을 가짐
- Persistance Volume Claim(PVC)는 사용자의 스토리지에 대한 요청
- PVC는 특정 크기나 접근 모드를 요청할 수 있다.
- PV는 클러스터 리소스, PVC는 해당 리소스에 대한 요청 및 검사하는 역할
- PVC와 PV 배타적 매칭 관계(1:1)
- volume과 claim의 라이프사이클
- 프로비저닝(스토리지 준비)
- PV에 대해 프로비저는 할 수 있는 방법을 제공
- Static, Dynamic 프로비저닝 제공
- Static
- 클러스터 관리자는 여러 PV를 만드는데 클러스터 사용자가 사용할 수 있는 실제 스토리지의 세부 사항을 제공
- k8s API에도 있어서 이를 통해 사용가능
- Dynamic
- 관리자가 생성한 정적 PV가 사용자의 PVC와 일치하지 않으면 클러스터는 PVC를 위해 볼륨을 동적으로 프로비저닝하려고 시도
- 이 프로비저닝은 스토리지클래스를 기반으로 하기 때문에 PVC는 스토리지 클래스를 요청하고 요청을 들은 관리자는 해당 클래스를 생성하고 구성
- ""로 요청을 주면 동적 프로비저닝을 비활성
- 스토리지 클래스를 기반으로 동적 스토리지 프로비저닝을 사용하려면 클러스터 관리자가 API 서버에서 어드미션 컨트롤러를 사용하도록 설정해야함
- PV에 대해 프로비저는 할 수 있는 방법을 제공
- Binding
- PVC가 생성되면 Control Plane이 클러스터 내 사용이 가능한 PV 중 조건을 충족하는 것을 찾아 PVC와 PV를 바인딩
- 조건에 맞는 것이 없다면 대기(pending)상태로 남음
- Using(사용)
- 바인딩 후 Pod는 PVC를 통해 그 PV를 사용하는 볼륨을 마운트 가능
- Pod의 필드인 Volumes 부분에 persistentVolueClaim을 지정해 스토리지를 사용
- Reclaiming
- 사용이 종료된 후 PVC를 삭제하게 되어 PV가 realease 상태가 될 수 있는데 이 이후 PV의 reclainPolicy 설정에 따라 동작이 결정
- Retain
- PV는 남기고 실제 자원을 사용하려면 관리자가 수동으로 개입
- Delete
- PV오브젝트와 스토리지 백엔드의 자원 삭제
- Dynamic 으로 생성된 PV의 기본 정책
- Recycle
- 현재 지원 종료
- Retain
- 사용이 종료된 후 PVC를 삭제하게 되어 PV가 realease 상태가 될 수 있는데 이 이후 PV의 reclainPolicy 설정에 따라 동작이 결정
- 프로비저닝(스토리지 준비)
- PV 의 속성
- Capacity
- PV는 capacity 속성을 이용해 스토리지 크기 정의
- volumemode
- Filesystem
- 기본값
- PV는 파일시스템으로 마운트되어 디렉터리처럼 동작
- Block
- raw 블록 디바이스로 사용할 때 설정
- Pod안에서 파일시스템이 아닌 디바이스로 사용
- 애플리케이션이 다루는 디바이스 같은거
- Filesystem
- Access Modes
- 마운트 방식 의미
- ReadWriteOnce(RWO)
- 단일 노드에서 read-write 마운트
- 같은 노드 내 여러 Pod가 공유
- ReadOnlyMany(ROX)
- 여러 노드에서 read-only 마운트
- ReadWriteMany(RWX)
- 여러 노드에서 read-write 마운트
- 모든 볼륨 플러그인이 지원하지는 않음
- ReadWriteIncePod(RWOP)
- 클러스터 전체에서 단 하나의 Pod만 read-write로 마운트하게 하는 모드
- StorageClass
- PV에 storageClassName을 지정
- PVC이 필드를 통해 클래스의 스토리지를 요청
- Volume Plugins
- PV 타입 지원
- (+선택)Node Affinity
- 로컬 PV의 경우 특정 노드에서만 이 PV를 사용하도록 제약을 걸기 위해 사용
- nodeaffinity 속성으로 설정
- Phase status(PV의 상태)
- Available
- 사용 가능한, 아직 바인딩되지 않은 리소스
- Bound
- PVC와 바인딩된 상태
- Released
- PVC가 삭제되었지만 재사용이나 삭제 상태 의미
- Failed
- reclaim(자동정리) 과정에서 실패한 상태
- Available
- Capacity
- PVC 속성
- resources.requests.storage
- Access Modes
- Filesystem of Block
- storageClassName
- (+선택)Selector(label Selector)
- matchLabels, matchExpressions 가능
- (+선택)volumeName
- 이거 사용 시, 대상 PV가 이미 다른 PVC에 바인딩 되어있으면 안됨
스토리지 - Projected Volumes
- 기존 볼륨 소스를 하나의 디렉토리 안으로 병합해서 마운트하게 하는 볼륨 타입
- 여러 개의 서로 다른 리소스를 하나의 볼륨에 포함해 컨테이너 내부에서 하나의 디렉터리로 접근하게 하는 것
- 지원되는 볼륨 소스
- secret
- 비밀 정보
- configMap
- 설정값
- downwardAPI
- Pod의 메타데이터나 리소스 정보
- serviceAccountToken
- ServiceAccount 토큰
- Pod 내 컨테이너가 API 서버와 통신할 때 쓰는 인증 토큰
- ServiceAccount 토큰
- secret
- Projected Volumes 장점
- 여러 형태들을 일일히 마운트할 필요 없이 한 디렉토리로 통합해 마운트
스토리지 - Ephemeral Volumes
- Pod와 같이 라이프사이클을 가지는 볼륨
- 보관할 필요가 없는 데이터를 Pod에 주입 시 사용
- Pod Spec 안에서 인라인으로 정의되며 PV, PVC 리소스는 사용되지 않는다.
- Ephemeral Volumes의 유형
- emptyDir
- Pod 시작 시, 빈 디렉터리로 생성
- 노드 로컬의 kubelet 베이스 디렉터리 또는 RAM 기반 스토리지를 사용
- configMap, secret, downward API 볼륨
- CSI Ephemeral Volume
- CSI 드라이버가 지원 시 사용가능
- 인라인 방식으로 임시 볼륨 제공
- Generic Ephemeral Volume
- CSI 드라이버가 지원 시 사용가능
- 동적 프로비저닝을 지원하는 드라이버를 이용해 임시적이지만 좀 더 유연한 스토리지를 제공
- emptyDir
- 동작 방식
- Ephemeral 볼륨은 Pod의 volumes 섹션에서 직접 정의
- CSI, Generic Ephemeral Volume의 경우 필요 자원이 자동으로 프로비저닝 되거나 바인딩 됨
스토리지 - StorageClass
- 클러스터 관리자가 제공하는 스토리지의 class를 정의하는 방법
- StorageClass의 구성요소
- provisioner
- 요청받은 StorageClass가 사용할 볼륨플러그인을 지정
- parameters
- 프로비저너 별로 요구되거나 선택해야하는 값
- reclaimPolicy
- 동적으로 생성한 PV가 반환될 시 처리법을 명시
- Delete : 기본값, 삭제
- Reclame : 유지
- 동적으로 생성한 PV가 반환될 시 처리법을 명시
- (+선택)allowVolumeExpansion
- StorageClass로 설정된 볼륨이 확장 가능한지 여부
- (+선택)mountOption
- 동적으로 생성된 PV가 마안트 될 때 사용하는 옵션
- (+선택)volumeBindingMode
- PV 바인딩 및 동적 프로비저닝이 언제 일어날지 지정
- provisioner
- StorageClass와 Dynamic 프로비저닝
- StorageClass는 클러스터에서 사용자의 요청이 있을 시, 자동으로 스토리지를 생성하게 끔 하는 기술
- 클러스터 관리자는 StorageClass 오브젝트를 미리 만들어 둘 수 있고 사용자는 PVC에서 원하는 클래스 이름을 지정해 요청할 수 있다
- PVC에 storageClassName을 지정하지 않으면 (만약 존재한다면) 디폴트 StorageClass가 사용된다.
스토리지 - Dynamic Volume Provisioning
- 필요 시 요청되는 Volume을 자동으로 생성해주는 기능
- 이를 사용 시, 사용자가 PVC를 보내면 클러스터가 자동으로 PV를 생성
- 동적 프로비저닝 워크플로우
- 클러스터 관리자가 StorageClass 를 미리 정의
- 사용자가 PVC를 생성
- k8s 시스템이 자동으로 요청받은 StorageClass의 Provisioner 를 호출해 백엔드 스토리지에서 볼륨을 생성하고 PV 오브젝트를 생성해 PVC와 PV를 바인딩
- Pod는 PVC를 참초해 생성된 PV를 마운트 해서 사용
- 디폴트 StorageClass 설정법
- 클러스터 관리자가 하나의 StorageClass에 "storageclass.kubernetes.id/is-default-class" : "true" 어노테이션을 붙여 디폴트로 지정
- 단순한 PVC 요청만으로도 이 클래스를 기반으로 스토리지 제공하게 됨
'Cloud Native > K8s' 카테고리의 다른 글
| k8s 이론: 보안 (0) | 2026.02.23 |
|---|---|
| k8s 이론: 구성 (0) | 2026.02.23 |
| k8s 이론: 서비스, 로드밸런싱, 네트워킹 (0) | 2026.02.23 |
| k8s 이론: 워크로드 (0) | 2026.02.23 |
| k8s 이론: 아키텍처 (0) | 2026.02.23 |