Cloud/k8s-CKA

[CKA] 34. volume 과 PV 그리고 PVC

jinkwon.kim 2023. 9. 3. 01:11
728x90
반응형

개요

k8s에서 volume을 어떻게 관리하는지 알아보겠습니다. 

본 글에서 k8s에서 volume의 사용법, 그리고 Persistent Volumes과 Persistent Volume Claims 대하여 알아보겠습니다.

목차

volume 개념

volume 사용법

Persistent Volumes 개념

Persistent Volume Claims 개념

volume

container의 data를 container가 종료돼도 유지할 수 있게 해주는 기능입니다.

Temp 전용 volume

EmptyDir

Pod가 생성될 때마다 새로운 빈 디렉터리를 생성합니다. Pod 내의 모든 container에서 공유될 수 있습니다

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: nginx
    volumeMounts:
    - name: my-emptydir-volume
      mountPath: /data
  volumes:
  - name: my-emptydir-volume
    emptyDir: {}

Host 전용 volume

HostPath

Node의 파일 시스템을 Pod에 마운트합니다.

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: nginx
    volumeMounts:
    - name: my-hostpath-volume
      mountPath: /data
  volumes:
  - name: my-hostpath-volume
    hostPath:
      path: /var/lib/some-data

Network volume의 type 및 사용법

종류

network를 통하여 data를 공유하기 위한 solution으로 아래와 다양한 것이 존재합니다. 

그러나 이 중에서 그나만 간단한 NFS와 PV를 알아보겠습니다.

NFS (Network File System)

네트워크 파일 시스템을 Pod에 마운트 합니다.

apiVersion: v1
kind: Pod
metadata:
  name: nfs-client-pod
spec:
  containers:
    - name: nfs-client-container
      image: nginx
      volumeMounts:
        - name: nfs-volume
          mountPath: /usr/share/nginx/html  # 이 경로에 NFS 서버의 데이터가 마운트됩니다.
  volumes:
    - name: nfs-volume
      nfs:
        server: 192.168.1.100  # NFS 서버의 IP 주소
        path: /var/nfs/general  # NFS 서버에서 공유하는 디렉터리

PV -  PVC - POD 관계 및 소개

PV(Persistent Volume)

PersistentVolume (PV)은 클러스터 내에서 지속적으로 사용할 수 있는 storage volume을 나타냅니다.

저장 공간을  확보하는 용도입니다.

PVC(Persistent Volume Claim)

Kubernetes에서 PersistentVolumeClaim (PVC)은 PersistentVolume (PV)에 대한 요청 또는 "Claim"을 나타냅니다. 

PV로 확보된 저장공간을 요청하는 용도입니다.

POD

Pod에서는 PVC를 사용합니다.

PersistentVolume (PV)

용도

PersistentVolume (PV)은 클러스터 내에서 지속적으로 사용할 수 있는 storage volume을 나타냅니다.

PV는 클러스터가 존재하는 한 지속적으로 존재합니다. 즉, Pod가 생성되거나 삭제되어도 PV는 삭제되지 않습니다.

주요 필드

volumeMode

PV가 어떻게 마운트될 것인지를 지정합니다. 이 필드는 주로 두 가지 모드 중 하나로 설정됩니다: Filesystem과 Block.

  1. Filesystem 모드:
    • 이 모드에서, PV는 파일 시스템으로 포맷되어 Pod에 마운트됩니다.
    • 대부분의 경우, Filesystem 모드가 사용되며, PV는 파일 시스템의 일부로서 Pod에서 접근할 수 있습니다 (예를 들어, ext4, XFS).
    • Filesystem 모드를 사용하면, 컨테이너는 PV에 있는 파일과 디렉토리를 평소처럼 읽고 쓸 수 있습니다.
  2. Block 모드:
    • Block 모드에서, PV는 블록 장치로서 마운트됩니다. 이 경우, 파일 시스템이 없으며, 대신 원시 블록 장치에 직접 접근합니다.
    • 이 모드는 특정 데이터베이스와 같이 낮은 수준의 블록 스토리지 접근이 필요한 애플리케이션에 유용합니다.
    • Block 모드를 사용하면, 컨테이너는 저장소를 파일 시스템으로 처리하는 대신 원시 블록 장치로 취급합니다.

volumeMode 필드는 PersistentVolume 및 PersistentVolumeClaim (PVC) 리소스 정의에서 설정할 수 있으며, PVC가 요청하는 스토리지의 타입을 PV가 제공해야 합니다. 예를 들어, PVC가 Block 모드를 요청한다면, 이를 충족하는 Block 모드의 PV와 연결되어야 합니다.

이러한 설정은 특히 고성능이 필요한 애플리케이션에서 중요할 수 있으며, 올바른 volumeMode를 선택함으로써 애플리케이션의 요구사항과 최적의 성능을 맞출 수 있습니다.

capacity

PV는 정해진 용량을 가지며, 이 용량을 넘을 수 없습니다.

accessModes

PV는 다양한 접근 모드를 지원합니다.

ReadWriteOnce :  하나의 노드만 쓰기 가능

ReadOnlyMany : 여러 노드에서 읽기만 가능

ReadWriteMany: 여러 노드에서 쓰기 가능

ReadWriteOncePod : 볼륨이 단일 파드에서 읽기-쓰기로 마운트 될 수 있다. 전체 클러스터에서 단 하나의 파드만 해당 PVC를 읽거나 쓸 수 있어야 하는 경우 ReadWriteOncePod 접근 모드를 사용한다

storageClassName

PV는 스토리지 클래스에 연결될 수 있습니다. 이를 통해 동적 프로비저닝이 가능합니다.

backend storage

다양한 백엔드 스토리지를 지원합니다. 예를 들어, AWS의 EBS, Google Cloud의 Persistent Disk, NFS, iSCSI 등이 있습니다.

PV 생성

yaml로 생성

apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-pv
spec:
  capacity:
    storage: 1Gi  # 볼륨 크기
  accessModes:
    - ReadWriteOnce  # 접근 모드
  persistentVolumeReclaimPolicy: Retain  # 재활용 정책
  hostPath:
    path: "/roo/data"  # 물리적 위치 (예시)

항목 설명

persistentVolumeReclaimPolicy

Retain

PersistentVolumeClaim이 삭제되면 해당 PersistentVolume은 자동으로 삭제되지 않습니다. 대신 "Released" 상태로 이동하고 볼륨의 데이터는 그대로 유지됩니다.

Delete

PersistentVolumeClaim이 삭제되면 해당 PersistentVolume도 자동으로 삭제됩니다. 이는 PersistentVolumeClaim이 삭제되면 데이터를 유지할 필요가 없는 경우에 유용합니다. 이를 지원하는 볼륨의 경우, 기본 스토리지도 삭제됩니다 (예: AWS의 EBS 볼륨).

PV 확인

kubectl get pv

PV 삭제 

kubectl delete pv {pv-name}

 

PersistentVolumeClaim (PVC)

용도

Kubernetes에서 PersistentVolumeClaim (PVC)은 PersistentVolume (PV)에 대한 요청 또는 "Claim"을 나타냅니다. PVC를 사용하면 사용자는 필요한 storage 크기, 접근 모드 등을 쉽게 지정할 수 있으며, 이 정보를 바탕으로 k8s는 적절한 PV를 찾아 연결(bind)합니다.

PVC는 종종 개발자나 애플리케이션 운영자가 사용합니다. 복잡한 백엔드 스토리지 세부 정보를 몰라도 원하는 스토리지를 요청할 수 있습니다

주요 필드

accessModes

PVC에서는 ReadWriteOnce (하나의 노드에서 읽기/쓰기), ReadOnlyMany (다수의 노드에서 읽기 전용), ReadWriteMany (다수의 노드에서 읽기/쓰기) 등의 접근 모드를 지정할 수 있습니다.

capacity

필요한 스토리지 크기를 resources.requests.storage 필드에 지정할 수 있습니다.

storageClassName

PVC는 storageClassName 필드를 통해 특정 StorageClass에 바인딩될 수 있습니다. 이를 통해 동적 프로비저닝이 가능합니다.

사용법

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: myclaim
spec:
  accessModes:
    - ReadWriteOnce
  volumeMode: Filesystem
  resources:
    requests:
      storage: 500Mi

작동 방식

PVC 객체를 생성하여 원하는 스토리지 사양을 지정합니다.

쿠버네티스 스케줄러는 이 요구 사항에 적합한 PV를 찾아 PVC에 바인딩합니다.

바인딩된 PV는 이후에 파드에서 사용될 수 있습니다.

파드가 종료되거나 PVC가 삭제되더라도, PV와 데이터는 유지되며 재사용이 가능하거나 리클레임 정책에 따라 처리됩니다.

PVC는 사용자가 쉽게 지속적인 스토리지를 요청하고 사용할 수 있도록 하는 중요한 쿠버네티스 리소스입니다.

PV - PVC

PV와 PVC를 Label과 selector를 사용하여 연결 하기

SC - PV - PVC

연결관계 빨간색 Pod로 표시 

SC (name) <-> PV (storageClassName) 

PV (storageClassName) <-> PVC (storageClassName) 

PVC (name) <-> POD claimName

SC - PVC (NFS)

storageClassName를 사용하여 연결이 됩니다.

SC - PVC (google-storage)

PVC에 storage class 연결하기

storageclass확인

kubectl get storageclass

bind확인 pending시 사항 

storageclass는 WaitForFirstConsumer로 설정된 VolumeBindingMode를 사용하면

PertantVolumeClaim을 사용하는 Pod가 생성될 때까지 PertantVolume의 binding 및 provisioning이 지연됩니다.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: standard
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp2
reclaimPolicy: Retain
allowVolumeExpansion: true
mountOptions:
  - debug
volumeBindingMode: Immediate

VolumeBindingMode옵션

Immediate

  • 설명: Immediate 모드에서는 PVC가 생성될 때 즉시 PV와 바인딩을 시도합니다. 이 모드에서는, 클러스터에 사용 가능한 PV가 있으면 PVC 생성과 동시에 해당 PV에 바인딩됩니다.
  • 사용 시나리오: 일반적인 시나리오에 적합하며, 대부분의 경우에 이 모드가 기본값으로 설정됩니다. PVC가 생성되는 즉시 사용 가능한 PV에 연결됩니다.

WaitForFirstConsumer

  • 설명: WaitForFirstConsumer 모드에서는 PVC가 생성된 후에도 바로 PV에 바인딩되지 않습니다. 대신, PVC를 사용하는 첫 번째 파드(Pod)가 스케줄링되는 시점에 PV와의 바인딩이 발생합니다.
  • 사용 시나리오: 이 모드는 볼륨의 배치를 최적화하려는 경우에 유용합니다. 예를 들어, 파드가 실행되는 노드와 가까운 위치에 있는 스토리지를 선택하는 등의 결정이 필요할 때 사용됩니다. 동적 프로비저닝 환경에서 특히 유용하며, 볼륨의 지연 바인딩을 통해 스토리지 사용 효율을 높일 수 있습니다.
 

Pod에서 PVC 사용법

Pod에서는 volume의 persistentVolumeClaim를 이용하여 PVC를 연결 합니다.

yaml

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
  labels:
    test: MyApp
spec:
  containers:
  - name: my-container
    image: nginx
    ports:
    - containerPort: 80
      name: http-web-svc
    volumeMounts:
    - name: my-volume
      mountPath: /usr/share/nginx/html
  volumes:
  - name: my-volume
    persistentVolumeClaim:
      claimName: myclaim

TroubleShooting

pvc가 pending인 경우 pv와 pvc의 accessModes가 같은지 먼저 확인해보세요

아래 중 하나의 값이 여야 합니다.

  • RWO - ReadWriteOnce
  • ROX - ReadOnlyMany
  • RWX - ReadWriteMany
  • RWOP - ReadWriteOncePod

정리

PV(Persistent Volume)

PersistentVolume (PV)은 클러스터 내에서 지속적으로 사용할 수 있는 storage volume을 나타냅니다.

저장 공간을  확보하는 용도입니다.

 

PVC(Persistent Volume Claim)

Kubernetes에서 PersistentVolumeClaim (PVC)은 PersistentVolume (PV)에 대한 요청 또는 "Claim"을 나타냅니다. 

PV로 확보된 저장공간을 요청하는 용도입니다.

 

POD

Pod에서는 PVC를 사용합니다.

참고

https://velog.io/@idnnbi/kubernetes-pvc-pv

 

kubernetes - pvc, pv

pvc와 pv의 사용은 Pod의 container에서 실제 node의 물리적인 위치를 사용하기 위한것이다.PV : 관리자에 의해서 생성된 볼륨 (실제 물리 디스크 위치)PVC : 사용자가 볼륨을 사용하기 위해 pv에 요청사

velog.io

Next Post

[CKA] 35. Security - TLS통신 이해를 위한 PKI 기본 지식

728x90
반응형