0부터 시작하는 OpenStack 공부 - 외부 Volume 사용하기

Jaehong Lee·2022년 9월 16일
0
post-thumbnail

1. 외부 Volume 사용하기

Local Disk 사용시 문제점

  • 관리탭의 Compute 의 하이퍼바이저에 들어가면, 호스트의 자원 사용량을 확인할 수 있다. 우리는 현재 로컬 저장소를 사용하고 있다

우리가 생성한 인스턴스의 Disk

CentOS1 -> disk: 20GB -> 속해있는 Host 의 로컬 디스크를 사용하고 있다
CentOS2 -> disk: 20GB

  • 현재 우리는 인스턴스의 Disk 를 Host 의 Disk 를 사용하고 있다. 이는 인스턴스를 Migration 하면, 전에 있던 Host 에서 Host 의 Disk 를 사용하였기에 옮겨간 다른 Host 에는 해당 Disk 가 없으므로 인스턴스를 실행할 수 없다. 이는 퍼블릭 클라우드에서 잘 사용하지 않는 방식이다
  • 이러한 문제를 해결하기 위해 외부 Storage 의 Volume 을 Instance 에 Mount 하는 방식을 사용해야 한다. 이는 인스턴스의 부팅 소스를 볼륨으로 하는 방식이다. 이때, 볼륨 소스가 이미지인 볼륨을 이용한다

우리는 local Disk 를 사용하고 있으므로 Instance 생성시 Instance 의 Disk 를 Host 의 Disk 에서 할당해주었다. 따라서 Instance 생성시 사용한 이미지는 실질적으로 Host 의 Disk 에 넣어진다. 이는 부팅 소스가 이미지 내용이 들어간 Local Disk 라는 말이다

  • 이를 외부 스토리지의 볼륨을 사용하면, Instance 의 Disk 는 외부 스토리지의 Volume 과 Mount 하므로 이미지는 실질적으로 외부 스토리지의 Volume 에 넣어진다 ( 인스턴스가 부팅 소스로 볼륨 소스가 이미지인 볼륨을 사용할 시 ) . 이때, Storage 에서 glance 에 등록된 이미지를 다운 받아 볼륨을 생성하며, 이를 Block Device Mapping 을 통해 인스턴스와 연결한다. Compute Node 는 Cpu 와 Ram 과 같은 컴퓨팅 자원만 제공해주며, 부팅 소스는 Storage 의 볼륨이다

local disk 사용의 경우 compute 의 Disk 를 요구한 만큼 Instance 에 할당해주고, 외부 Storage 사용의 경우 Storage 에 요구한 용량의 Volume 을 생성하여 Instance 의 Disk 와 Mount 해준다

인스턴스 생성시 부팅 소스를 이미지로 한다면, 이는 Local Disk 에 이미지 내용을 풀어 넣고, 이 Local Disk 를 사용하는 것이다. 따라서, 이미지 크기보다 Flavor 의 Disk 할당 크기를 같거나 크게 해야 한다

볼륨 생성인 NOVA, 관리 및 연결은 CINDER 서비스에서 해준다. 이때, CINDER 는 Storage Node 에 있지만, Control Node 에서 인스턴스와 볼륨을 연결해준다

  • CINDER API 는 Control Node 에 있다

Volume 생성

  • Cinder 서비스를 사용하여 인스턴스에 DISK 를 제공해주자. 이는 Block Storage 이다
  • 볼륨 생성은 Nova 서비스를 이용한다. ' 생성 ' 이기 때문이다

  • 볼륨을 생성해주자

  • 빈 볼륨은 Data 저장에 사용된다. 이미지 옵션은 볼륨에 이미지 파일을 풀어 넣는 것이다. 이는 KVM 에서 Virt-install 로 iso 파일을 볼륨에 설치하는 것과 유사하다
KVM
-> virt-install -> iso 파일
-> virt-install --disk CentOS...qcow2 --import # CentOS..qcow2 이미지를 볼륨으로 사용
-> virt-builder --size 20G ~ # virt-resize 기능을 이용

  • 허나, OpenStack 의 경우 볼륨에 iso 파일이 아닌 이미지를 풀어 넣어주는 것이다. 이 이미지는 qcow2 로 iso 와 같은 파일이 설치된 볼륨이다. 따라서, OpenStack 의 경우에는 qcow2 파일 내용을 생성한 볼륨에 풀어 넣어준다. 이는 qcow2 의 저장 공간을 확장 시켜주는 것과 같다고 볼 수 있다

  • 위와 같이 설정해주고 볼륨을 생성해주자. 볼륨을 ' 생성 ' 해주기에 가용 구역이 nova 이다. Cinder 는 이러한 생성된 볼륨을 관리해주고, 연결해준다

Volume 을 생성하면 자동으로 Available 상태가 된다. 그 다음 인스턴스에서 볼륨 연결을 하면, 가용 가능한 볼륨 목록이 출력된다. 선택하고 연결하면 해당 인스턴스에서 ls /dev/vd* 을 출력하면 /dev/vdb 가 추가되야 한다


Volume 연결

Cinder 서비스를 사용하여 인스턴스에 볼륨을 연결해주자

  • 볼륨을 연결할 인스턴스의 메뉴에서 볼륨 연결을 눌러주자

  • 연결할 볼륨을 선택하고 볼륨 연결을 눌러주자

만약 볼륨 연결에 오류가 생긴다면

  • 관리 > 볼륨 > 볼륨에 들어가서 볼륨 상태 업데이트를 눌러주자

  • Available 로 변경하고 상태를 업데이트 시키면 볼륨 연결이 된다

이는 인스턴스의 부팅 소스를 이미지가 풀어진 Local Disk 로 했기에, Compute 의 Disk 를 사용하는 방식이다. Storage 의 볼륨은 단순 Data 저장용으로만 사용한다. Disk 를 Local Disk 를 사용하므로 부팅 소스가 이미지 내용이 들어간 Local Disk 이므로 Migration 이 불가능하다


2. Image 를 이용한 Volume

기존 Instance 삭제

  • 기존에 생성한 Instance 를 모두 삭제하자

Image 를 이용한 Volume 생성

  • 위의 설정으로 Volume 을 생성하자. 볼륨 소스는 이미지이고, 사용할 이미지는 CentOS7 이다
  • 이 이미지는 qcow2 로 iso 와 같은 파일이 설치된 볼륨이다. 따라서, qcow2 파일 내용을 생성한 20GB 의 볼륨에 넣어준다. 이는 기존의 qcow2 의 저장 공간을 확장 시켜주는 것과 같다고 볼 수 있다
  • 이렇게 생성된 볼륨을 이용해 볼륨을 부팅 소스로 한 Instance 를 생성할 수 있다

  • 상태를 Available 로 변경해주자

이 Volume 을 이용해 Instance 를 생성할때는 Image 가 아닌 Volume 을 부팅 소스로 이용해 생성하는 것이다. 위 과정은 Storage 에서 glance 에 저장된 Image 를 다운 받아 Volume 을 생성해주는 것이다


3. Volume 을 부팅 소스로 Instance 생성

이미지가 아닌 볼륨을 부팅 소스로 사용하여 Instance 를 생성하자. 이는 부팅 소스가 Block Storage 에 있는 이미지가 넣어진 Volume 이므로 Migration 이 가능하다. 실제 퍼블릭 클라우드에서는 이 방식을 주로 사용한다. 이때, Disk 는 Block Device Mapping 을 통해 Storage 의 Volume 과 연결되며, Compute Node 는 Cpu 와 Ram 과 같은 컴퓨팅 자원만 제공해준다

  • 5.1 커널에서는 이미지 생성이 되지만, 볼륨 생성이 안된다
  • 3.1 커널에서는 이미지 생성이 안되고, 볼륨 생성이 된다
  • 우리는 커널을 왔다갔다 해야 한다

Virt-Install - ISO & qcow2

  • ISO 파일을 이용해 Virt-install 을 하면, 볼륨이 생성되며 해당 볼륨에 Iso 파일을 설치한다. 생성된 가상 머신을 실행하면 설치 마법사가 실행된다
  • qcow2 와 같은 경우 Iso 파일을 이용해 OS 가 이미 설치된 저장 공간을 가지는 볼륨이다. 이 qcow2 를 이용해 virt-install 을 하면, 볼륨이 생성되지 않고, 해당 qcow2 파일을 볼륨으로 사용한다. 실행시 OS 가 바로 실행된다

허나 위 두 방법은 클라우드에 적합하지 않다

  • 저장 공간 용량에 대해 수정할 수 없고, 설치 과정도 복잡하기 때문이다

원하는 Image 를 이용한 Instance 생성 과정

  1. virt-builder 를 이용하여 기본 이미지 ( 볼륨 ) 를 원하는 이미지 ( 볼륨 ) 로 변경

    or virt-customize 를 이용하여 기본 이미지 ( 볼륨 ) 를 원하는 이미지 ( 볼륨 ) 로 변경

  2. 1GB 볼륨으로 늘어난 CentOS.qcow2 를 glance 에 등록
  3. glance 에 이미지로 등록된 CentOS.qcow2 를 Cinder 와 Nova 를 이용하여 20GB 볼륨에 풀어 놓는다. 결국 20GB 디스크가 생성되고, 해당 디스크에는 OS, httpd 가 설치된 상태가 된다
  4. 인스턴스를 생성할 때 기존에는 image 를 이용해서 설치했지만, " 3 " 과정에서 만들어준 볼륨을 이용하여 새로운 인스턴스를 배포한다

  • 위와 같이 mynet1 에 Block Storage 를 이용한 Instance 를 생성할 것이다

사전 준비 - 패키지 설치 및 설정

커널 5.1 로 오자

 yum -y install libvirt qemu-kvm virt-install
  • 위 패키지를 설치해주자
systemctl enable libvirtd --now
  • libvirtd 를 항상 실행시키게 하자
yum -y install libguestfs-tools
  • virt-resize / customize 등이 포함된 libguestfs-tools 를 설치하자
[root@localhost ~]# export LIBGUESTFS_BACKEND=direct # libguest 의 tool 들과 libvirtd 를 직접 연결시켜주어 virt-customize 와 같은 명령을 내릴 수 있게 해주는 설정
[root@localhost ~]# systemctl start libvirtd
  • 위 내용을 실행해주자

Image 수정 및 생성

wget http://cloud.centos.org/centos/7/images/CentOS-7-x86_64-GenericCloud-2003.qcow2.xz ; xz -d CentOS-7-x86_64-GenericCloud-2003.qcow2.xz
  • CentOS qcow2 이미지를 다운받고, 압축을 풀어주자
#!/bin/bash
# https 를 통해 저장소에 접근할 수 있도록 하기 위하여
apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# 도커의 GPG 키 추가
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# 도커 저장소 설치
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu  $(lsb_release -cs)  stable" 
# 최종업데이트
apt-get update -y
# 도커 설치
apt-get -y install docker-ce
  • docker 설치 명령을 내릴 shell 파일 작성
virt-customize -a "이미지 이름" --update --run install.sh --firstboot-command 'sudo systemctl start docker' --firstboot-command 'sudo systemctl start sshd' --root-password password:test123
  • run 은 로컬에 있는 shell 파일을 이미지에서 실행한다
  • run--command 는 실행할 명령을 이미지로 전달하여 실행한다. 이는 인스턴스에서 실행하는 것이 아닌, 이미지에서 실행하는 것으로 정적인 상태를 지정하는 명령을 내려야 한다
    • enable 같은건 run-command 에 적합하지만, start 같은건 firstboot-command 에 적합하다

Image 등록 및 Volume 생성

커널 3.1 로 오자

openstack image create "CenOS7DOCKER" --file CentOS.qcow2 --disk-format qcow2 --container-format bare --public
  • glance 에 수정한 Image 를 등록하자

  • 잘 등록되었다

Volume 생성 - 두 가지 Volume 을 생성

  • manager / worker

  • 먼저, manager Volume 을 생성하자

  • Worker Volume 을 생성하자

  • 상태가 Available 인지 확인하자

volume 강제 삭제 방법

MariaDB [cinder]> update volumes set deleted=1,status=deleted,deleted_at=now(),updated_at=now() where deleted=0 and id= '볼륨 ID';
  • mysql 에 접속하여 cinder DB 에 들어가서 위 명령어를 입력하면 강제 삭제된다

Instance 생성

  • 이름을 지정하자

  • 부팅 소스를 Volume 으로 선택하고, 생성한 Volume 을 지정해주자

  • Flavor 는 디스크 용량이 20GB 이상인 것을 고르자

  • 네트워크를 지정해주자

  • 보안 그룹을 지정해주자

  • Key-Pair 까지 지정해준 다음 Instance 를 생성해주자

  • Instance 가 잘 생성되었다

Worker Instance 도 동일하게 생성해주자

  • 현재 위와 같은 구조이다

Floating Ip 할당

Floating Ip 할당

  • Floating IP 를 두 개 할당받았다

  • Instance 에 연결해주었다

다음 장에 이후의 과정을 포함한 더 자세한 실습 내용이 있다. 다음 장을 참조하자

profile
멋진 엔지니어가 될 때까지

0개의 댓글