쿠버네티스

Storage 3대장 이해하기 (2/4) - Block Storage

it-gecko 2025. 2. 21. 16:53

블록 스토리지는 OS가 디스크처럼 사용하는 스토리지입니다.

 

 

 

데이터를 고정 크기의 블록(block) 단위로 저장하며, 각 블록은 개별 주소를 갖고 있습니다. 최초에는 단순한 원시 데이터 블록으로 존재하기 때문에 OS가 블록 스토리지에 파일을 저장하려면 반드시 파일 시스템을 생성 후 사용하여야 합니다.

 

쿠버네티스 꿀팁노트, 블록 스토리지

 

 

이번 글에선 Block Storage에 대해 자세히 살펴봅니다.

 

목 차

 

블록 스토리지의 특징

OS의 기본 스토리지로 할당되는 블록 스토리지는 다음과 같은 특징이 있습니다.

 

  • 고성능 : 빠른 데이터 입출력 (IOPS)이 가능하여 DB, VM 등 고속 처리가 필요한 애플리케이션에 적합합니다. 
  • 유연한 관리 : 블록 단위로 디스크를 관리할 수 있어 파일 시스템보다 유연한 데이터 관리가 가능합니다. 
  • 파일 시스템 필요 : 데이터를 사용하려면 OS 종류에 맞는 ext4, xfs 등의 파일 시스템을 사용하여야 합니다. 
  • 독립적인 볼륨 관리 : 블록 스토리지는 네트워크를 통해 여러 서버에 연결할 수 있으며 필요에 따라 분리하여 다른 인스턴스에 연결할 수 있습니다. 

 

블록 스토리지의 파일 시스템 

 

블록 스토리지는 주로 Local File System을 사용하며, 파일 시스템별 주요 특징은 다음과 같습니다.

파일 시스템 특징 사용 환경
ext4 리눅스 기본 파일 시스템 리녹스 서버, 개인 PC
XFS 대용량 파일 처리 시스템 DB, Big Data, 백업 서버
Btrfs 스냅샷, 압축 지원  고급 데이터 관리
NTFS 윈도우 기본 파일 시스템 Windows OS, 외장 디스크
FAT32 외장 USB, SD카드 용도 USB, SD카드

 

 

리눅스에서 블록 스토리지 마운트 하기

리눅스(Ubuntu 22.04) OS에서 Block Storage를 마운트 하는 과정을 코드와 함께 살펴보겠습니다.

 

① 새로운 블록 디바이스(디스크) 확인

lsblk

 

출력 예시:

# lsblk
NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda       8:0    0  100G  0 disk 
└─sda1    8:1    0  100G  0 part /
sdb       8:16   0    4G  0 disk    <-- 새 블록 디바이스

 

② 디스크 파티션 만들기 

fdisk /dev/sdb

--- fdisk 화면
 Command (m for help): n  ## 신규 파티션 생성
 Partition type
    p   primary (0 primary, 0 extended, 4 free)
    e   extended (container for logical partitions)
 Select (default p):     ## enter 
 
 Using default response p.
 
 Partition number (1-4, default 1): 1   ## 1 입력후 enter
 First sector (2048-8388607, default 2048):  ## enter
 Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-8388607, default 8388607):   ## enter - 디스크 전체 마운트
 
 Created a new partition 1 of type 'Linux' and of size 4 GiB.
 
 Command (m for help): w   ## 파티션 정보 저장 후 fdisk 설정 종료
 
 The partition table has been altered.
 Calling ioctl() to re-read partition table.
 Syncing disks.

 

 

파티션 생성 확인 :

# lsblk
NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda       8:0    0  100G  0 disk 
└─sda1    8:1    0  100G  0 part /
sdb       8:16   0    4G  0 disk    <-- 새 블록 디바이스
└─sdb1    8:17   0    4G  0 part    <-- 새 파티션

 

③ 파일 시스템 생성 (스토리지 포맷)

 

마운트하려는 서버의 이미지에 알맞은 명령어를 입력하여 디스크를 포맷합니다.

# CentOS 7.x
mkfs.xfs /dev/sdb1

# Ubuntu
mkfs.ext4 /dev/sdb1

 

출력 예시 : 

# mkfs.ext4 /dev/sdb1

mke2fs 1.46.5 (30-Dec-2021)
Discarding device blocks: done
Creating filesystem with 1048320 4k blocks and 262144 indoes
Filesystem UUID: ...
Superblock Backups stored on blocks: ...
Allocating group tables: done
Writing inode tables: done
Creating journal: done
Writing superblocks and filesystem accounting infromation: done

 

④ 디스크 마운트

 

마운트 포인트를 생성하고 마운트를 수행합니다.

## 마운트 포인트 생성
mkdir /mnt/sdb1

## 마운트 수행
mount /dev/sdb1 /mnt/sdb1

 

마운트 결과 확인 :

# df -k
Filesystem       1k-blocks    Used  Available  Used   Mounted on
/dev/sda2         1992552   248792    1622520   14%   /boot
/dev/sdb1         4045536       24    3819464    1%   /mnt/sdb1        <-- mount 확인

 

⑤ 시스템 재부팅 시 자동 마운트 설정

 

시스템이 재부팅될 떄마다 자동으로 마운트 되도록 추가 설정이 필요합니다. /etc/fstab은 부팅 단계에서 마운트되어야 할 볼륨 정보들이 저장되는 경로입니다. 

# vi /etc/fstab

## 다음 라인 추가
/dev/sdb1  /mnt/sdb1  ext4  defaults  0  2

 

쿠버네티스에서 블록 스토리지 사용하기

쿠버네티스에서는 블록 스토리지를 Persistent Volume (PV)와 Persistent Volume Claim (PVC)을 통해 사용할 수 있습니다. 

 

 

 

AWS의 EBS (Elastic Block Storage) 를 사용하여 블록 스토리지를 쿠버네티스 연결하는 방법을 알아보겠습니다. 

 

① StorageClass 생성

StorageClass를 생성하여 EBS 볼륨을 동적으로 프로비저닝할 수 있도록 설정합니다. 

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: gp2-storage
provisioner: ebs.csi.aws.com
parameters:
  type: gp2
  fsType: ext4
reclaimPolicy: Retain
  • provisioner: ebs.csi.aws.com → AWS EBS 컨트롤러 사용
  • type: gp2 → AWS EBS 볼륨 유형 지정
  • fsType: ext4 → 파일 시스템 지정
  • reclaimPolicy: Retain → PVC 삭제 시 PV를 보존

② PVC (Persistent Volume Claim) 생성

애플리케이션이 사용할 볼륨 크기와 StorageClass를 요청하는 PVC를 생성합니다.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: ebs-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: gp2-storage
  resources:
    requests:
      storage: 10Gi
  • storageClassName: gp2-storage → 앞서 만든 StorageClass와 연결
  • requests.storage: 10Gi → 10GiB 크기의 블록 스토리지 요청

③ Pod에서 PVC 사용하기

이제 생성한 PVC를 Pod에 마운트해서 사용할 수 있어.

apiVersion: v1
kind: Pod
metadata:
  name: ebs-pod
spec:
  containers:
    - name: app
      image: nginx
      volumeMounts:
        - mountPath: "/mnt/data"
          name: storage
  volumes:
    - name: storage
      persistentVolumeClaim:
        claimName: ebs-pvc
  • volumeMounts.mountPath: "/mnt/data" → 컨테이너 내에서 사용할 경로
  • volumes.persistentVolumeClaim.claimName: ebs-pvc → PVC를 Pod에 연결

④ Pod 배포 및 확인

kubectl apply -f storageclass.yaml
kubectl apply -f pvc.yaml
kubectl apply -f pod.yaml
kubectl get pvc
kubectl get pods
  • PVC가 Bound 상태가 되면 스토리지가 정상적으로 연결된 것입니다.

 

쿠버네티스에서 블록 스토리지를 사용할 때 고려할 점

 

쿠버네티스에서 블록 스토리지를 사용할 때는 다음과 같은 내용을 고려해야 합니다. 

(1) 스토리지 성능

고성능 애플리케이션에서는 IOPS, Throughput을 고려하여 EBS gp3, io1 같은 고성능 옵션을 사용해야 합니다. 

(2) Reclaim Policy 설정

목적에 맞는 Reclaim Policy 를 설정합니다. Reclaim Policy 의 옵션별 사용 방법은 다음과 같습니다. 

  • Delete: PVC 삭제 시 PV도 함께 삭제됨.
  • Retain: PVC 삭제 후에도 PV는 남아 있으며, 데이터 보호 가능.
  • Recycle: 기본적으로 지원되지 않지만 간단한 데이터 초기화 후 재사용 가능.

(3) 스토리지 접근 모드 

용도에 맞는 스토리지 접근 모드를 설정합니다. 접근 모드 별 사용 방법은 다음과 같습니다. 

  • ReadWriteOnce (RWO): 하나의 노드에서만 읽기/쓰기 가능 (일반적인 블록 스토리지 모드)
  • ReadOnlyMany (ROX): 여러 노드에서 읽기 가능
  • ReadWriteMany (RWX): 여러 노드에서 읽기/쓰기 가능 (보통 블록 스토리지에서는 지원되지 않음, 파일 스토리지용

(4) Multi AZ 미지원

AWS EBS 같은 블록 스토리지는 특정 가용 영역(AZ)에서만 사용 가능 하므로, Multi-AZ 환경에서 스토리지를 사용하려면 AWS EFS, Ceph, NFS같은 파일 스토리지를 사용해야 합니다. 

 

 

요약 정리

  • 블록 스토리지는 데이터를 고성능으로 저장하고 읽을 수 있는 저장 방식이며, Kubernetes에서는 Persistent Volume (PV)와 Persistent Volume Claim (PVC)을 사용하여 블록 스토리지를 관리할 수 있습니다.
  • AWS EBS, Azure Disk, Google Persistent Disk 같은 클라우드 기반 블록 스토리지를 활용하면 동적 프로비저닝을 통해 자동으로 블록 스토리지를 생성하고 마운트할 수 있습니다. 
  • 쿠버네티스 환경에서는 StorageClass를 사용하여 블록 스토리지를 자동 할당하고, Pod가 PVC를 통해 스토리지 볼륨을 마운트하는 방식으로 활용할 수 있습니다.