블록 스토리지는 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를 통해 스토리지 볼륨을 마운트하는 방식으로 활용할 수 있습니다.
'쿠버네티스' 카테고리의 다른 글
externalTrafficPolicy 활용 하기 (0) | 2025.03.06 |
---|---|
Storage 3대장 이해하기 (3/4) - File Storage (0) | 2025.02.26 |
kubectl 사용자 별 권한 설정하기 (0) | 2025.02.24 |
Storage 3대장 이해하기(1/4) - File System (0) | 2025.02.21 |
Kubernetes Storage 꿀팁 (0) | 2025.02.20 |