Devstack을 활용한 오픈스택 설치하기
오픈스택은 초기 개발자나 사용자가 활용하기에는 상당히 진입장벽이 높은 시스템입니다. 그건 아마도 리눅스 시스템, 가상화, 스토리지, 네트워크 등을 모두 어느 정도 이해해야 하기 때문이라고 생각이 듭니다. 이런 복잡한 시스템을 그나마 쉽게 접근하기 위해서는 먼저 자동으로 설치하여 어떻게 동작하는지를 이해하는 것이 좋습니다. 오픈스택에서는 devstack 이라는 프로젝트를 통해서 오픈스택의 프로젝트들을 all in one (하나의 시스템에 모든 소프트웨어를 설치하는 방법)으로 쉽게 설치할 수 있게 제공합니다. 그럼 devstack을 활용하여 오픈스택을 설치해 보도록 하겠습니다.
Prerequisite
- VMware Fusion / VMware Workstation (VirtualBox도 괜찮습니다. 여기서는 Fusion 기준으로 설명)
- Fusion Network 생성
- Name : vmnet2, type : Custom, Subnet IP : 192.168.75.0/24, NAT
- Name : vmnet3, type : Custom, Subnet IP : 192.168.230.0./24, Host Only
* NAT 는 VM이 laptop 밖으로 통신이 가능하다는 의미이며 하나밖에 지정할 수 없습니다.
gateway ip 는 192.168.75.2 처럼 해당 subnet 의 끝자리가 2 입니다.
Host Only 는 laptop 과 VM 간, 혹은 VM과 VM 간의 통신만 가능하며 여러개를 지정할 수 있습니다.
- VM 생성
- VM (Host) 1 : op-dev01 192.168.75.181 192.168.230.181 ubuntu 16.04 LTS
userid : stack all in one 노드
- VM (Host) 2 : op-dev02 192.168.75.182 192.168.230.182 ubuntu 16.04 LTS
userid : stack compute 노드
* Laptop 에 VM 을 생성하여 이를 Host 머신으로 생각하고, 여기에 OpenStack 을 설치하여 Guest VM 을 생성하는 구조입니다. Laptop 안에 VM 안에 VM 이 생성되는 구조로 생각하면 됩니다.
VM 1 의 네트워크 설정은 다음과 같습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14
$ cat /etc/network/interfaces auto lo iface lo inet loopback # The primary network interface auto ens33 iface ens33 inet static address 192.168.75.181 netmask 255.255.255.0 gateway 192.168.75.2 dns-nameservers 8.8.8.8 8.8.4.4 auto ens34 iface ens34 inet static address 192.168.230.181 netmask 255.255.255.0
Devstack 설치
op-dev01 192.168.230.181 vm 에 stack 계정으로 로그인하여 devstack 소스를 다운 받습니다.
1 2 3
$ sudo apt-get install -y git $ git clone https://git.openstack.org/openstack-dev/devstack $ cd devstack
devstack 을 설치하기 위한 기본 설정파일인 local.conf 파일을 생성합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
$ vi local.conf [[local|localrc]] HOST_IP=192.168.75.181 SERVICE_HOST=192.168.75.181 MYSQL_HOST=192.168.75.181 RABBIT_HOST=192.168.75.181 GLANCE_HOSTPORT=192.168.75.181:9292 ADMIN_PASSWORD=secret DATABASE_PASSWORD=secret RABBIT_PASSWORD=secret SERVICE_PASSWORD=secret LOGDIR=$DEST/logs LOGFILE=$LOGDIR/stack.sh.log LOGDAYS=7 # Do not use Nova-Network disable_service n-net # Neutron service enable_service q-svc enable_service q-agt enable_service q-dhcp enable_service q-l3 enable_service q-meta # Neutron options Q_USE_SECGROUP=True FLOATING_RANGE="192.168.75.0/24" FIXED_RANGE="10.0.0.0/24" Q_FLOATING_ALLOCATION_POOL=start=192.168.75.193,end=192.168.75.254 PUBLIC_NETWORK_GATEWAY="192.168.75.2" PUBLIC_INTERFACE=ens33 Q_USE_PROVIDERNET_FOR_PUBLIC=True # Open vSwitch provider networking configuration OVS_PHYSICAL_BRIDGE=br-ex PUBLIC_BRIDGE=br-ex OVS_BRIDGE_MAPPINGS=public:br-ex # Linuxbridge Settings #Q_AGENT=linuxbridge #LB_PHYSICAL_INTERFACE=ens33 #PUBLIC_PHYSICAL_NETWORK=default #LB_INTERFACE_MAPPINGS=default:ens33 # Nova service enable_service n-api enable_service n-cpu enable_service n-cond enable_service n-sch enable_service n-novnc enable_service n-cauth # Cinder service enable_service c-api enable_service c-vol enable_service c-sch enable_service c-bak # Swift service enable_service s-proxy enable_service s-object enable_service s-container enable_service s-account # Cinder configuration VOLUME_GROUP="cinder-volumes" VOLUME_NAME_PREFIX="volume-" # Images DOWNLOAD_DEFAULT_IMAGES=False IMAGE_URLS="http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-disk.img" KEYSTONE_CATALOG_BACKEND=sql API_RATE_LIMIT=False SWIFT_HASH=testing SWIFT_REPLICAS=1 VOLUME_BACKING_FILE_SIZE=70000M # A clean install every time RECLONE=yes
위의 설정파일 중에서 자신의 설정에 맞게 변경해야 할 것은 IP, PUBLIC_INTERFACE 부분입니다. 위의 내용대로 설치하면 Nova, Neutron, Cinder, Swift, Keyston, Glance 프로젝트가 설치되므로 기본적인 오픈스택의 기능 테스트가 가능합니다. 특히 중요한 부분은 Neutron 인데 OpenVSwitch 와 Linux Bridge 둘 중에 하나의 방식 선택이 가능합니다. FLOATING_RANGE 는 Public IP 대역을 말하며, VM 이 생성될 때 처음 할당받는 Private IP 는 Fixed IP라 하고 동적으로 할당하여 외부 인터넷과 통신할 수 있는 IP 는 Floating IP 라 합니다. 전제조건으로 Host 역할을 하는 VM 이 NAT로 연결한 Public IP 대역을 보면 192.168.75.0/24 입니다. 이는 외부 인터넷과 통신할 IP 대역으로 1 ~ 128 번까지는 Host 역할을 하는 VM 이 사용하고 193 ~ 254 번까지는 OpenStack 이 생성하는 VM에 할당할 Floating IP 대역입니다.
devstack 이 설치하는 기본 디렉토리는 /opt/stack 입니다. 그러므로 $DEST 라는 환경변수 값은 특별히 지정하지 않으면 /opt/stack 이 됩니다. 다운로드 하는 cirros 이미지는 오픈스택이 VM을 잘 생성하는지 테스트 할 수 있는 아주 작은 테스트 이미지입니다. 아이디는 cirros 패스워드는 cubswin:) 입니다.
설정이 끝났으면 이제 설치하도록 하겠습니다. 설치는 stack.sh 쉘스크립트를 실행합니다.
1
$ ./stack.sh
특정 git branch 를 지정하지 않으면 최신 master 소스를 받아서 설치합니다. 그러므로 어느 시점에 설치하느냐에 따라 간혹 에러가 발생하기도 하는데 이 때는 로그를 보고 해당 에러를 해결해야 합니다. 설치가 완료되면 아래와 같은 내용이 출력됩니다.
오픈스택 활용하기
이제 설치가 완료되었으니 테스트로 VM 생성을 해보겠습니다. 이를 위해서 먼저 demo 테넌트의 admin 계정으로 세팅합니다. 테넌트라는 단어가 생소할 수 있는데 이는 프로젝트로 생각할 수 있습니다.
1
$ . openrc admin demo
VM 을 생성하기위해서는 이미지, 생성할 VM 사양, VM 에 접속하기 위한 키, 접속 포트 오픈, 네트워크가 필요합니다. 먼저 이미지와 생성할 VM 사양을 조회합니다. Flavor 는 오픈스택에서 VM 사양을 미리 정해 놓은 것으로 cpu, memory, disk 를 어느 정도 크기로 할 건지 선택할 수 있습니다. 물론 자신이 원하는 사양을 저장할 수 도 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
$ openstack image list +--------------------------------------+--------------------------+--------+ | ID | Name | Status | +--------------------------------------+--------------------------+--------+ | 0dbd2fe2-3844-48a2-b873-a9b0c5bc6ebd | cirros-0.3.4-x86_64-disk | active | +--------------------------------------+--------------------------+--------+ $ openstack flavor list +----+-----------+-------+------+-----------+-------+-----------+ | ID | Name | RAM | Disk | Ephemeral | VCPUs | Is Public | +----+-----------+-------+------+-----------+-------+-----------+ | 1 | m1.tiny | 512 | 1 | 0 | 1 | True | | 2 | m1.small | 2048 | 20 | 0 | 1 | True | | 3 | m1.medium | 4096 | 40 | 0 | 2 | True | | 4 | m1.large | 8192 | 80 | 0 | 4 | True | | 42 | m1.nano | 64 | 0 | 0 | 1 | True | | 5 | m1.xlarge | 16384 | 160 | 0 | 8 | True | | 84 | m1.micro | 128 | 0 | 0 | 1 | True | | c1 | cirros256 | 256 | 0 | 0 | 1 | True | | d1 | ds512M | 512 | 5 | 0 | 1 | True | | d2 | ds1G | 1024 | 10 | 0 | 1 | True | | d3 | ds2G | 2048 | 10 | 0 | 2 | True | | d4 | ds4G | 4096 | 20 | 0 | 4 | True | +----+-----------+-------+------+-----------+-------+-----------+
다음은 ssh 를 위한 rsa 키를 생성하고 공용키를 등록합니다. 그리고 접속하기 위해서 포트를 오픈해야 하는데 오픈스택은 Security Group 으로 포트를 관리합니다. default 는 Security Group 에 기본적으로 포함된 이름이며 여기에 security group rule 을 포트마다 등록해야 합니다. 물론 자신만의 Security Group 명을 생성해서 rule 을 등록할 수 도 있지만 편의상 default 를 사용하도록 하겠습니다. VM에 할당할 네트워크는 private ip 를 지정합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
$ ssh-keygen $ openstack keypair create --public-key ~/.ssh/id_rsa.pub admin-key +-------------+-------------------------------------------------+ | Field | Value | +-------------+-------------------------------------------------+ | fingerprint | eb:d6:cb:f4:50:28:f6:82:46:88:17:51:43:83:c8:ab | | name | admin-key | | user_id | 4f70402ee36d409a856e2acc11f30549 | +-------------+-------------------------------------------------+ $ openstack project list +----------------------------------+--------------------+ | ID | Name | +----------------------------------+--------------------+ | 7cdd1cea883b49309cb86bf7ed548051 | service | | 83dd7a56e6df4307bdcc45bfa4ba54ba | admin | | 9e9282c534c44475be4373ee7b653afa | alt_demo | | bd3e51da4ad145d78a3743a7860d0441 | swiftprojecttest1 | | c9a875ec1b274c11a7cc1a4b021f64f9 | invisible_to_admin | | e2b7c8d1c07f404281c03506543abb2c | demo | | e99ea8a6019940d9bc6c00e14ea30492 | swiftprojecttest2 | +----------------------------------+--------------------+ $ openstack security group list +--------------------------------------+---------+------------------------+----------------------------------+ | ID | Name | Description | Project | +--------------------------------------+---------+------------------------+----------------------------------+ | 8770107f-af29-4703-9e57-343474305a4e | default | Default security group | 83dd7a56e6df4307bdcc45bfa4ba54ba | | c7c5282d-fd92-4518-9506-8c9c49cabed3 | default | Default security group | e2b7c8d1c07f404281c03506543abb2c | +--------------------------------------+---------+------------------------+----------------------------------+ $ openstack security group rule create --proto icmp --src-ip 0.0.0.0/0 \ --dst-port -1 --ingress c7c5282d-fd92-4518-9506-8c9c49cabed3 $ openstack security group rule create --proto tcp --src-ip 0.0.0.0/0 \ --dst-port 1:65535 --ingress c7c5282d-fd92-4518-9506-8c9c49cabed3 $ openstack network list +--------------------------------------+---------+----------------------------------------------------------------------------+ | ID | Name | Subnets | +--------------------------------------+---------+----------------------------------------------------------------------------+ | 43c663d6-b8be-4fc2-b96a-c0d4a7248ff2 | public | bbbaf920-fd3e-47a4-8deb-ab7cddf6a0a2, be396174-8c09-49df-a62c-734a8f076ed0 | | d115d85e-8fff-4280-9e96-08515ef86e95 | private | 61047b0d-e620-4e1b-b0e6-2dc36626a526, bb35291d-2b82-46d8-b0a4-c184ca467c2a | +--------------------------------------+---------+----------------------------------------------------------------------------+
순서적으로 보면 키를 생성해서 등록하고 default security group 에 ping 프로토콜인 icmp 와 tcp 프로토콜을 오픈하는 rule 을 등록했으면 VM 에 할당할 ip 를 정하기 위해 등록된 Private Network 를 조회하였습니다. 위의 정보를 모두 포함하여 VM 생성은 아래와 같이 요청합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
$ openstack server create --image 0dbd2fe2-3844-48a2-b873-a9b0c5bc6ebd \ > --flavor m1.tiny --nic net-id=d115d85e-8fff-4280-9e96-08515ef86e95 \ > --key-name admin-key --security-group default test-01 +--------------------------------------+-----------------------------------------------------------------+ | Field | Value | +--------------------------------------+-----------------------------------------------------------------+ | OS-DCF:diskConfig | MANUAL | | OS-EXT-AZ:availability_zone | | | OS-EXT-SRV-ATTR:host | None | | OS-EXT-SRV-ATTR:hypervisor_hostname | None | | OS-EXT-SRV-ATTR:instance_name | | | OS-EXT-STS:power_state | NOSTATE | | OS-EXT-STS:task_state | scheduling | | OS-EXT-STS:vm_state | building | | OS-SRV-USG:launched_at | None | | OS-SRV-USG:terminated_at | None | | accessIPv4 | | | accessIPv6 | | | addresses | | | adminPass | jRxuwyu9Fi2f | | config_drive | | | created | 2016-09-04T11:07:05Z | | flavor | m1.tiny (1) | | hostId | | | id | 5776b63a-2ffe-45d4-ba67-84303139d0ca | | image | cirros-0.3.4-x86_64-disk (0dbd2fe2-3844-48a2-b873-a9b0c5bc6ebd) | | key_name | admin-key | | name | test-01 | | os-extended-volumes:volumes_attached | [] | | progress | 0 | | project_id | e2b7c8d1c07f404281c03506543abb2c | | properties | | | security_groups | [{u'name': u'default'}] | | status | BUILD | | updated | 2016-09-04T11:07:05Z | | user_id | 4f70402ee36d409a856e2acc11f30549 | +--------------------------------------+-----------------------------------------------------------------+
1~2 분 정도 지나면 VM 이 생성되어 있는 것을 알 수 있습니다. VM 이 제대로 생성되었는지는 Status 값이 ACTIVE 로 되어 있는지 확인하면 됩니다.
1 2 3 4 5 6
$ openstack server list +--------------------------------------+---------+--------+---------------------------------------------------------+--------------------------+ | ID | Name | Status | Networks | Image Name | +--------------------------------------+---------+--------+---------------------------------------------------------+--------------------------+ | 5776b63a-2ffe-45d4-ba67-84303139d0ca | test-01 | ACTIVE | private=fd2b:1d3f:33f4:0:f816:3eff:fe52:2971, 10.0.0.11 | cirros-0.3.4-x86_64-disk | +--------------------------------------+---------+--------+---------------------------------------------------------+--------------------------+
마지막으로 해당 서버에 접속하도록 하겠습니다. Neutron 은 멀티 라우터를 지원하기 위해서 Linux 의 Namespace 를 활용합니다. 그러므로 VM Private IP 에 접속하기 위해서는 Namespace 를 알아야 합니다. 그러나 Floating IP 를 할당한다면 Namespace 활용없이 바로 접속이 가능합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
$ sudo ip netns qrouter-89cca6cb-5553-4767-9423-a2fb3f9ecb9e qdhcp-d115d85e-8fff-4280-9e96-08515ef86e95 $ sudo ip netns exec qrouter-89cca6cb-5553-4767-9423-a2fb3f9ecb9e ssh -i ~/.ssh/id_rsa cirros@10.0.0.11 ## cirros vm에 ssh 접속 완료 $ ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc pfifo_fast qlen 1000 link/ether fa:16:3e:52:29:71 brd ff:ff:ff:ff:ff:ff inet 10.0.0.11/24 brd 10.0.0.255 scope global eth0 inet6 fd2b:1d3f:33f4:0:f816:3eff:fe52:2971/64 scope global dynamic valid_lft 86324sec preferred_lft 14324sec inet6 fe80::f816:3eff:fe52:2971/64 scope link valid_lft forever preferred_lft forever $ hostname test-01 $
오픈스택 cli 명령어는 help 를 보고 알 수 있습니다. 가장 쉬운 방법은 openstack --help | grep [명령어] 방식으로 VM 관리와 관련된 명령어를 조회하고 싶다면 openstack --help | grep server 로 조회하고 명령어가 리스팅되면 openstack help server list 와 같이 help 를 넣으면 자세한 사용법을 알 수 있습니다.
마지막으로 웹으로도 오픈스택을 활용할 수 있습니다. 오픈스택 프로젝트 중에 horizon 이 있으며 horizon 역시 디폴트로 설치되는 프로젝트입니다. laptop 브라우저에서 http://192.168.75.181/dashboard 로 접속한 후 사용자이름은 admin 패스워드는 secret 으로 접속하면 됩니다. (local.conf 설정파일에 설정한 패스워드입니다.)
Compute 노드 추가
op-dev02 192.168.230.182 vm 에 stack 계정으로 로그인하여 devstack 소스를 다운 받습니다.
1 2 3
$ sudo apt-get install -y git $ git clone https://git.openstack.org/openstack-dev/devstack $ cd devstack
compute 노드를 추가하기 위한 기본 설정파일인 local.conf 파일을 생성합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
$ vi local.conf [[local|localrc]] HOST_IP=192.168.75.182 SERVICE_HOST=192.168.75.181 MYSQL_HOST=192.168.75.181 RABBIT_HOST=192.168.75.181 GLANCE_HOSTPORT=192.168.75.181:9292 ADMIN_PASSWORD=secret MYSQL_PASSWORD=secret RABBIT_PASSWORD=secret SERVICE_PASSWORD=secret # Neutron options PUBLIC_INTERFACE=ens33 ENABLED_SERVICES=n-cpu,n-novnc,rabbit,q-agt LOGDIR=$DEST/logs LOGFILE=$LOGDIR/stack.sh.log LOGDAYS=7
HOST_IP는 compute 노드 IP 를 말하며 나머지 IP 는 all in one 으로 설치한 devstack controller node IP 를 입력합니다. 이제 stack.sh 를 실행해서 추가 노드를 설치합니다.
1
$ ./stack.sh
compute 노드가 정확히 추가되었는지를 확인할려면 op-dev01 노드에서 아래와 같이 서비스를 조회하면 알 수 있습니다. 아래와 같이 nova-compute op-dev02 노드의 State 가 up 으로 나타납니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
$ openstack compute service list +----+------------------+----------+----------+---------+-------+----------------------------+ | ID | Binary | Host | Zone | Status | State | Updated At | +----+------------------+----------+----------+---------+-------+----------------------------+ | 3 | nova-conductor | op-dev01 | internal | enabled | up | 2016-09-04T13:41:33.000000 | | 4 | nova-scheduler | op-dev01 | internal | enabled | up | 2016-09-04T13:41:33.000000 | | 5 | nova-consoleauth | op-dev01 | internal | enabled | up | 2016-09-04T13:41:36.000000 | | 6 | nova-compute | op-dev01 | nova | enabled | up | 2016-09-04T13:41:35.000000 | | 7 | nova-compute | op-dev02 | nova | enabled | up | 2016-09-04T13:41:34.000000 | +----+------------------+----------+----------+---------+-------+----------------------------+ $ openstack network agent list +--------------------------------------+--------------------+----------+-------------------+-------+-------+---------------------------+ | ID | Agent Type | Host | Availability Zone | Alive | State | Binary | +--------------------------------------+--------------------+----------+-------------------+-------+-------+---------------------------+ | 2348ea08-c4d8-4cb8-8f3c-bc6088dac375 | L3 agent | op-dev01 | nova | True | UP | neutron-l3-agent | | 419d85ff-5731-40d9-939c-5d96d5edf919 | Open vSwitch agent | op-dev01 | None | True | UP | neutron-openvswitch-agent | | 543140a8-dece-415a-8cb4-68a349c78c76 | Open vSwitch agent | op-dev02 | None | True | UP | neutron-openvswitch-agent | | 7638a1da-a981-4dd9-9c90-b927c4e292be | DHCP agent | op-dev01 | nova | True | UP | neutron-dhcp-agent | | ed98d6ec-88e0-4297-b70f-c23247786d59 | Metadata agent | op-dev01 | None | True | UP | neutron-metadata-agent | +--------------------------------------+--------------------+----------+-------------------+-------+-------+---------------------------+
한가지 주의할 것은 오픈스택은 각 서비스를 일정한 인터벌로 체크하여 데이터베이스에 체크 시간을 업데이트 합니다. 업데이트 시간이 허용된 범위를 넘어서면 해당 노드는 다운으로 간주합니다. 이렇듯 시간이 중요하므로 controller 노드와 compute 노드의 시간을 ntp 로 맞춰줘야 합니다.
트러블 슈팅
devstack 을 설치한 VM 이 reboot 되면 오픈스택 서비스를 다시 띄어야 합니다. 이 때는 먼저 swift 에 저장된 image 를 사용하기 위해서 특정 파일을 마운트해야 하며 screen 을 활용하여 오픈스택 서비스를 다시 띄우면 됩니다.
1 2 3 4 5 6 7 8
## swift 스토리지 마운트 $ sudo mount -t xfs -o loop,noatime,nodiratime,nobarrier,logbufs=8 \ /opt/stack/data/swift/drives/images/swift.img /opt/stack/data/swift/drives/sdb1 ## cinder volume device로 인식 $ sudo losetup /dev/loop1 /opt/stack/data/cinder-volumes-default-backing-file $ sudo losetup /dev/loop2 /opt/stack/data/cinder-volumes-lvmdriver-1-backing-file ## screen 으로 서비스 띄우기 $ screen -c stack-screenrc
스크린에 접속되면 빠져나오기 위해서 ctrl + a + d 로 나올 수 있습니다. exit 나 ctrl + c 를 사용하면 서비스를 kill 하는 것이니 조심해야 합니다.