본문 바로가기
Server-side 개발 & 트러블 슈팅/Openstack (오픈스택)

[Openstack] 오픈스택 Cinder 블록 저장 스토리지 이론과 설치 및 실행 방법 가이드

by 코딩하는 동현 2025. 7. 9.

OpenStack 블록 스토리지 서비스: Cinder

Cinder는 OpenStack에서 가상 머신의 하드 드라이브를 위한 영구 스토리지 관리를 제공하는 서비스입니다.

기존 OpenStack 릴리스에서는 nova-volume 서비스의 일부였지만, 기능이 확장되면서 Cinder라는 독립적인 프로젝트로 진화했습니다.

AWS EBS, Google Persistent Disk와 비슷한 기능을 합니다.

Cinder의 주요 개념 및 기능

Cinder는 가상 머신에 raw 블록 스토리지 볼륨을 제공하며, 이 볼륨은 가상 머신 내에서 추가 하드 드라이브로 나타납니다.

ephemeral 스토리지와 달리, Cinder 볼륨으로 지원되는 가상 머신은 손쉽게 라이브 마이그레이션 및 재배치될 수 있습니다.

Cinder가 제공하는 주요 기능은 다음과 같습니다:

  • 볼륨 관리 (Volume Management): 볼륨 생성 및 삭제를 허용합니다.
  • 스냅샷 관리 (Snapshot Management): 볼륨의 스냅샷 생성 및 삭제를 허용합니다.
  • 인스턴스에 볼륨 연결/분리 (Attaching or Detaching Volumes): 가상 머신에 볼륨을 연결하거나 분리할 수 있습니다.
  • 볼륨 복제 (Cloning Volumes): 기존 볼륨을 복제하여 새로운 볼륨을 생성할 수 있습니다.
  • 이미지를 볼륨으로 복사(Copy of Images to Volumes and Vice Versa): 이미지를 볼륨으로 복사하거나 볼륨에서 이미지를 생성할 수 있습니다.
  • 하이브리드 클라우드 백업 솔루션 (Hybrid Cloud Backup Solution): Kilo 릴리스부터 Cinder 볼륨 암호화를 지원하며, Mitaka 릴리스에서는 Google Cloud Platform을 백업 대상으로 추가하여 하이브리드 클라우드 재해 복구 전략을 가능하게 합니다. 또한, Swift, NFS, Ceph, GlusterFS, POSIX 파일 시스템 등 다양한 백업 대상 스토어를 지원합니다.

Cinder는 iSCSI, NFS, 파이버 채널을 사용하여 블록 장치를 가상 머신에 제공합니다.

또한, 테넌트(사용자)의 스토리지 사용량을 제한하는 쿼터 관리 기능도 제공합니다.

이 쿼터는 사용된 총 스토리지 용량(스냅샷 포함), 사용 가능한 볼륨의 총 개수, 생성된 스냅샷의 총 개수 등으로 설정할 수 있습니다.

기본 쿼터 설정은 /etc/cinder/cinder.conf 파일에서 확인할 수 있습니다.

Cinder 서비스 구성 요소 및 동작 방식

Cinder 구성 요소

  • Cinder API 서버 (Cinder API server): REST 인터페이스를 통해 외부와 상호작용하며 볼륨 관리 요청을 받습니다.
  • Cinder 스케줄러 (Cinder scheduler): 최종 사용자가 요청한 새 볼륨을 호스팅할 최적의 볼륨 서버를 선택하는 역할을 합니다.
  • Cinder 볼륨 서버 (Cinder volume server): 볼륨을 실제로 호스팅하는 노드입니다.

가상 머신에 Cinder 볼륨을 연결하는 과정

  1. Cinder 볼륨 생성: 볼륨 이름과 크기를 지정하여 Cinder 볼륨을 생성합니다. 기본 볼륨 드라이버는 iSCSI를 통한 LVM입니다.
  2. 볼륨 연결: volume-attach 명령어를 사용하여 Cinder 볼륨을 Nova 인스턴스에 연결합니다. 이 과정에서 iSCSI Qualified Name (IQN)이 생성되어 compute 노드에 LV를 제공합니다.
  3. Libvirt를 통한 볼륨 가상 머신 노출: libvirt 라이브러리를 통해 iSCSI 드라이브가 가상 머신에 추가 블록 장치로 나타나도록 합니다.

Cinder 백엔드 드라이버 및 스케줄링

Cinder는 플러그인 가능한 아키텍처를 제공하여 다양한 스토리지 백엔드 드라이버를 지원합니다. 기본 LVM-iSCSI 드라이버 외에도 NFS, GlusterFS, 그리고 NetApp, EMC와 같은 다양한 스토리지 벤더의 드라이버와 같은 여러 백엔드를 동시에 사용할 수 있습니다.

여러 백엔드 드라이버를 활성화하려면 /etc/cinder/cinder.conf 파일의 enabled_backends 플래그를 쉼표로 구분된 백엔드 설정 그룹 이름으로 설정합니다.

Cinder 스케줄러는 Capacity, Availability Zone, Capability Filters와 같은 기본 필터 및 가중치(weigher)를 사용하여 볼륨 서버를 선택합니다.

  • 필터 (Filters): 사용자가 요청한 볼륨 크기에 맞는 적절한 물리적 리소스를 제공하는지 확인하여 compute 노드를 걸러냅니다.
  • 가중치 (Weighers): 필터링된 compute 노드들을 리소스 가용성에 따라 순위를 매겨 가장 적합한 노드를 결정합니다.

또한, Cinder 스케줄러는 백엔드 드라이버별 필터 및 가중치 기능을 통해 새로운 요청을 최적의 백엔드 드라이버에 매칭시켜 처리할 수 있습니다. 사용자는 Cinder volume-type 정의를 사용하여 특정 백엔드 드라이버로 볼륨을 요청할 수 있습니다.


Cinder 서비스 배포

OpenStack Ansible은 Cinder 서비스 배포를 위한 플레이북을 제공합니다.

배포 시 openstack_user_config.yml 파일을 조정하여 Cinder API 서비스와 볼륨 서비스를 어디에 배포할지 지정합니다.

  • API 서비스: Cinder API 서비스는 일반적으로 클라우드 컨트롤러 노드에 배포됩니다 (storage-infra_hosts 스탠자).
  • 볼륨 서비스: 볼륨을 호스팅하는 스토리지는 별도의 스토리지 호스트에 배포될 수 있습니다 (storage_hosts 스탠자).

Cinder 플레이북을 실행하여 Cinder 서비스를 배포할 수 있습니다:

# cd /opt/openstack-ansible/playbooks
# openstack-ansible os-cinder-install.yml

이러한 방식으로 Cinder는 OpenStack 환경에서 영구적이고 유연한 블록 스토리지 솔루션을 제공하며, 다양한 백엔드 스토리지 통합을 통해 확장성을 확보합니다.


Ubuntu(24.04) + OpenStack Cinder 기반 볼륨 구성 가이드

OpenStack의 nova-volume 서비스는 현재 공식적으로 Cinder(OpenStack Block Storage)로 완전히 대체되었습니다.

아래는 최신 Ubuntu(24.04) 및 Cinder를 기준으로, VM에 영구적으로 연결 가능한 블록 스토리지(볼륨)를 구성하는 실습 절차입니다.

디스크 준비 새 디스크 추가, LVM 파티션/볼륨 그룹 생성
Cinder 설치 cinder-api/scheduler/volume, lvm2 패키지 설치
설정 파일 /etc/cinder/cinder.conf 및 LVM 필터 설정
서비스 등록 Keystone에 사용자/서비스/엔드포인트 등록
서비스 기동 systemctl로 Cinder/Nova 서비스 재시작 및 활성화
사용 테스트 볼륨 생성, 인스턴스에 볼륨 연결

 


LVM 기반 Cinder 볼륨 백엔드 준비

1. 새 디스크 추가 및 LVM 볼륨 그룹 생성

2. 디스크 목록 조회

먼저 시스템에 인식된 디스크 목록을 확인합니다.

lsblk

또는

sudo fdisk -l
  • NVMe SSD는 일반적으로 /dev/nvme0n1, /dev/nvme1n1 등으로 표시됩니다.

3. NVMe 디스크 파티셔닝 및 LVM 타입 지정

새로 추가한 NVMe 디스크가 /dev/nvme0n2일 때

sudo fdisk /dev/nvme0n2

명령어 입력 순서:

  • n (새 파티션 생성)
  • p (주 파티션)
  • 1 (파티션 번호)
  • (엔터) (시작 섹터 기본값)
  • (엔터) (마지막 섹터 기본값)
  • t (파티션 타입 변경)
  • 8e (Linux LVM)
  • w (저장 및 종료)

 

변경사항 적용:

sudo partprobe

4. LVM PV/VG 생성

파티션이 /dev/nvme0n1p1로 생성되었다고 가정합니다.

sudo pvcreate /dev/nvme0n2p1
sudo vgcreate cinder-volumes /dev/nvme0n2p1

  • 볼륨 그룹 이름은 관례적으로 cinder-volumes로 지정합니다.


Cinder 서비스 설치 및 기본 설정

1. Cinder 패키지 설치

sudo apt update
sudo apt install cinder-api cinder-scheduler cinder-volume lvm2 python3-mysqldb

2. LVM 설정 파일 수정

  • /etc/lvm/lvm.conf에서 Cinder가 사용할 볼륨 그룹만 활성화:
  • devices { filter = [ "a|/dev/nvme0n2p1|", "r|.*|" ] }

3. /etc/cinder/cinder.conf 예시

[DEFAULT]
my_ip = controller
state_path = /var/lib/cinder
auth_strategy = keystone
enabled_backends = lvm
transport_url = rabbit://openstack:RABBIT_PASS@controller:5672/
glance_api_servers = http://controller:9292

[lvm]
volume_driver = cinder.volume.drivers.lvm.LVMVolumeDriver
volume_group = cinder-volumes
iscsi_protocol = iscsi
iscsi_helper = tgtadm

[database]
connection = mysql+pymysql://cinder:CINDER_DBPASS@controller/cinder

[keystone_authtoken]
www_authenticate_uri = http://controller:5000
auth_url = http://controller:5000
memcached_servers = controller:11211
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = cinder
password = cinder

[oslo_concurrency]
lock_path = $state_path/tmp
  • /etc/hosts에서 ip주소를 controller에 다가 작성한 상태

데이터베이스에 Cinder용 DB 및 계정 생성 및 keystone 연동

1. MariaDB/MySQL 접속

mysql -u root -p

2. cinder 데이터베이스 생성

CREATE DATABASE cinder;

3. cinder 계정에 권한 부여

  • 아래에서 'CINDER_DBPASS'는 사용할 비밀번호로 임의 지정
GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'localhost' IDENTIFIED BY 'CINDER_DBPASS';
GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'%' IDENTIFIED BY 'CINDER_DBPASS';
FLUSH PRIVILEGES;
exit

sudo cinder-manage db sync
  • 참고: 외부 노드에서도 DB 접속이 필요하면 % 권한도 반드시 부여해야 함[.

4. Keystone에 사용자/서비스/엔드포인트 등록

# Cinder 사용자 생성 및 권한 부여
openstack user create --domain default --project service --password cinder cinder
openstack role add --project service --user cinder admin

# 서비스 등록
openstack service create --name cinderv3 --description "OpenStack Block Storage" volumev3

# 엔드포인트 등록
openstack endpoint create --region RegionOne volumev3 public   <http://controller:8776/v3/%\\(project_id\\)s>
openstack endpoint create --region RegionOne volumev3 internal <http://controller:8776/v3/%\\(project_id\\)s>
openstack endpoint create --region RegionOne volumev3 admin    <http://controller:8776/v3/%\\(project_id\\)s>

  • 최신 OpenStack에서는 volumev3 타입을 사용합니다.


서비스 기동 및 Nova 연동

1. Cinder 서비스 재시작 및 활성화

sudo systemctl restart cinder-volume cinder-scheduler
sudo systemctl enable cinder-volume cinder-scheduler

2. Nova(Compute)에서 Cinder 볼륨 사용 설정

/etc/nova/nova.conf에 아래 추가(컨트롤러 노드 기준):

[cinder]
os_region_name = RegionOne

Nova 서비스 재시작:

sudo systemctl restart nova-compute

3. 볼륨 생성 및 인스턴스 연결 테스트

볼륨 생성: 

openstack volume create --size 10 test-volume

 

인스턴스에 볼륨 연결:

openstack server add volume <서버이름> test-volume

 


인스턴스 내부에서 Cinder 볼륨 사용 (컴퓨트노드가 아닌 인스턴스 내부 명령어)

아래는 실제 디스크/볼륨 상태를 바탕으로, OpenStack 인스턴스에서 Cinder 볼륨을 포맷하고 마운트하는 방법을 안내합니다.

인스턴스 내부에서 Cinder 볼륨 확인 및 사용

1. SSH로 인스턴스 접속

ssh <사용자>@<인스턴스_IP>

2. 볼륨(블록 디바이스) 확인

lsblk
sudo fdisk -l

  • /dev/mapper/cinder--volumes-volume--a9942493--... 형태의 10 GiB 디바이스가 Cinder 볼륨입니다.

3. 볼륨 포맷 (최초 연결 시 1회만)

sudo mkfs.ext4 /dev/mapper/cinder--volumes-volume--a9942493--f853--4301--8c21--9c20f1921e13
  • 실제 디바이스 이름은 복사해서 붙여넣으세요.
  • 이미 포맷된 볼륨을 다시 포맷하면 데이터가 모두 삭제되니, 최초 연결 시에만 포맷하세요.

4. 마운트 디렉터리 생성 및 마운트

sudo mkdir /mnt/myvolume
sudo mount /dev/mapper/cinder--volumes-volume--a9942493--f853--4301--8c21--9c20f1921e13 /mnt/myvolume
df -h
  • /mnt/myvolume에 10 GiB 볼륨이 마운트되어 있으면 정상입니다.

5. (선택) 자동 마운트 설정

  • 인스턴스 재부팅 후에도 자동 마운트하려면 /etc/fstab에 UUID로 등록하는 것이 좋습니다.
sudo blkid /dev/mapper/cinder--volumes-volume--a9942493--f853--4301--8c21--9c20f1921e13
  • 출력된 UUID를 /etc/fstab에 아래와 같이 추가:
  • UUID=08e04909-db4d-41db-90c4-48976fe413cd /mnt/myvolume ext4 defaults 0 2

cinder 볼륨 해제

1. 인스턴스 내부에서 볼륨 마운트 해제

인스턴스에 SSH 접속 후, 볼륨이 마운트된 경로에서 마운트 해제:

  • /mnt/myvolume는 실제 마운트 경로에 맞게 변경
sudo umount /mnt/myvolume

2. openstack cil에서 아래 작업 수행

볼륨 분리:

openstack server remove volume <INSTANCE_ID> <VOLUME_ID>

 

볼륨 삭제:

openstack volume delete <VOLUME_ID>

반응형

댓글