Cloud Native/K8s

k8s 이론: 스토리지

lys4321 2026. 2. 23. 18:56

스토리지 - 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 서버에서 어드미션 컨트롤러를 사용하도록 설정해야함
    • 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
          • 현재 지원 종료
  • PV 의 속성
    • Capacity
      • PV는 capacity 속성을 이용해 스토리지 크기 정의
    • volumemode
      • Filesystem
        • 기본값
        • PV는 파일시스템으로 마운트되어 디렉터리처럼 동작
      • Block
        • raw 블록 디바이스로 사용할 때 설정
        • Pod안에서 파일시스템이 아닌 디바이스로 사용
          • 애플리케이션이 다루는 디바이스 같은거
    • 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(자동정리) 과정에서 실패한 상태
  • 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 서버와 통신할 때 쓰는 인증 토큰
  • 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 드라이버가 지원 시 사용가능
        • 동적 프로비저닝을 지원하는 드라이버를 이용해 임시적이지만 좀 더 유연한 스토리지를 제공
  • 동작 방식
    • Ephemeral 볼륨은 Pod의 volumes 섹션에서 직접 정의
    • CSI, Generic Ephemeral Volume의 경우 필요 자원이 자동으로 프로비저닝 되거나 바인딩 됨

스토리지 - StorageClass

  • 클러스터 관리자가 제공하는 스토리지의 class를 정의하는 방법
  • StorageClass의 구성요소
    • provisioner
      • 요청받은 StorageClass가 사용할 볼륨플러그인을 지정
    • parameters
      • 프로비저너 별로 요구되거나 선택해야하는 값
    • reclaimPolicy
      • 동적으로 생성한 PV가 반환될 시 처리법을 명시
        • Delete : 기본값, 삭제
        • Reclame : 유지
    • (+선택)allowVolumeExpansion
      • StorageClass로 설정된 볼륨이 확장 가능한지 여부
    • (+선택)mountOption
      • 동적으로 생성된 PV가 마안트 될 때 사용하는 옵션
    • (+선택)volumeBindingMode
      • PV 바인딩 및 동적 프로비저닝이 언제 일어날지 지정
  • 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