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 볼륨을 연결하는 과정
- Cinder 볼륨 생성: 볼륨 이름과 크기를 지정하여 Cinder 볼륨을 생성합니다. 기본 볼륨 드라이버는 iSCSI를 통한 LVM입니다.
- 볼륨 연결: volume-attach 명령어를 사용하여 Cinder 볼륨을 Nova 인스턴스에 연결합니다. 이 과정에서 iSCSI Qualified Name (IQN)이 생성되어 compute 노드에 LV를 제공합니다.
- 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>
'Server-side 개발 & 트러블 슈팅 > Openstack (오픈스택)' 카테고리의 다른 글
[Openstack] 오픈스택 네트워킹 개념과 Neutron 기능과 이론 (0) | 2025.07.14 |
---|---|
[Openstack] 오픈스택 Swift 설치 및 설정 가이드 및 명령어 (0) | 2025.07.14 |
[Openstack] 오픈스택 swift 분산 Object 스토리지 개념 (2) | 2025.07.09 |
[Openstack] 오픈스택 노바(Nova)와 컴퓨트 노드 개념, nova 기초 명령어 (3) | 2025.06.29 |
[Openstack] 오픈스택 키스톤(Keystone)의 기초 개념과 명령어 (1) | 2025.06.29 |
댓글