openstack 설치와 사용하기 – ubuntu 12.04에서

아래 문서를 참고하여 세대의 물리적인 서버에 오픈스택을 설치(Basic Installation)하였으나, 여러가지 문제가 발생했다. 결과적으로 아래  내용은 정리가 되지 않은 내용이므로 설치과정 참고용이다.

결과로 나온 문제 해결(http://blog.boxcorea.com/wp/archives/948)과 최종 설정화일(http://blog.boxcorea.com/wp/archives/972)은 따로 정리했다.

참고문서:

http://docs.openstack.org/grizzly/openstack-compute/install/apt/content/

http://docs.openstack.org/grizzly/basic-install/apt/content/

1. 오픈스택은… 오픈스택은 크고작은 퍼블릭/프라이빗 클라우드를 위한 확장가능하고 유연한 클라우드 컴퓨팅을 제공하기위한 목적으로 만들어졌다.

2. 오픈스택의 구성요소와 코드네임

오브젝트 스토어,Object Store (코드네임: Swift) :  오브젝트 스토리지를 제공. 화일을 검색하거나 저장하는것을 허락한다. 몇몇 회사들은 swift 기반의 상용 스토리지 서비스를 제공한다.

이미지,Iimage (코드네임: Glance) : 가상  디스크 이미지를 위한 저장소와 목록을 제공한다.

컴퓨트,Compute (코드네임: Nova) :  요청시 가상 서버를 제공한다.

대쉬보드,Dashboard (코드네임: Horizon) : 모든 오픈스택 서비스를 위한 웹기반 사용자 인터페이스를 제공한다. 이 웹 GUI로 대부분의 작업이 가능하다.

아이덴티티,Identity (코드네임: Keystone) : 모든 오픈스택 서비스를 위한 인증과 권한부여를 제공한다.

네트워크,Network (코드네임: Quantum, neturon) : 다른 오픈스택 서비스(Nova 같은)에 의해 관리되는 인터페이스 장치들 사이에 “서비스로서의 네트워크 연결”을 제공한다.

블록스토리지, Block Storage (코드네임: Cinder) : 게스트 가상머신에 영구적인 block storage를 제공한다.

3. 설치 아키텍쳐의 예

오픈스택 compute는 메시지 기반 구조인 shared-nothing을 사용한다.

싱글노드(single-node): 하나의서버에 모든 nova 서비스를 구동하고 모든 가상 인스턴스를 운영한다.  이 구성은 개발이나 시험용으로 사용한다.

투노드(two-nodes): 클라우드 컨트롤러 노드는 nova-compute를 제외한 모든 nova 서비스를 실행한다.

멀티노드(multiple-nodes):  더 많은 compute 노드를 추가하기 위해서 추가할 서버에 nova.conf 화일을 복사하여 nova-compute를 설치할 수 있다.  또한, 추가 노드를 볼륨 컨으롤러와 네트워크 컨트롤러로 하므로써 멀티노드를 구성할 수도 있다.

4. 설치 나는 두번째 문서에 의해 3대의 서버를 사용하여 설치하였다.

Cloud Controller Node:  가상머신 호스팅 이나 네트워크 서비스를 제외한 모든 기능을 제공하는 노드 MySQL, RabbitMQ, Nova, Cinder, Glance, Keystone, Quantum 서비스 제공, 2개 이상의 HDD 필요

Network Node: DHCP, L2 또는 L3 스위칭, 메타데이타 연결과 같은 오픈스택의 네트워크 서비스를 제공하는 노드 Quantum-L3 agent, Quantum-DHCP-agent, Quantum Agent with OpenvSwitch 서비스 제공

Comput Node: 오픈스택 compute 서비스 뿐아니라 네트워크 서비스 에이전트를 실행하는 노드. 이 서버가 오픈스택 호환 하이퍼바이저(KVM이나 Xen같은)를 관리한다. 이서버가 가상머신들(instance)의 호스트가된다. nova-compute, KVM, nova-api, Quantum Agent with OpenvSwitch

각 노드 공통사항으로 아래 작업을 수행한다.

# apt-get install ubuntu-keyring
# vi /etc/apt/sources.list.d/cloud-archive.list

deb http://ubuntu-cloud.archive.canonical.com/ubuntu precise-updates/grizzly main

# apt-get update; apt-get upgrade

 

4.1 . Cloud Controller node 설치

ipaddress: 59.29.142.9  , 192.168.100.1

 hostname: cloud

 # apt-get install ubuntu-cloud-keyring

/etc/hosts화일에 호스트네임을 등록해 준다.

192.168.100.3    compute1
192.168.100.2    network
192.168.100.1    cloud

/etc/sysctl.conf 화일에서 아래 커널 파라메터를 0으로 설정하고 적용한다.

# vi /etc/sysctl.conf
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.default.rp_filter=0
# sysctl -e -p /etc/sysctl.conf
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0

NTP 서버를 설치한다. 오픈스택 서버의 시간이 정확하지 않으면 클라우드에서 제거되기 때문에 매우 중요하다.

# apt-get install -y ntp

MySQL 서버를 설치한다. MySQL서버는 기본적으로 localhost에서만 접속되도록 설정되어 있다. 오픈스택 compute 서비스가 MySQL을 이용가능하도록 아래커맨드를 실행한다.

# apt-get install -y python-mysqldb mysql-server

# vi /etc/mysql/my.cnf
#bind-address = 127.0.0.1
bind-address = 0.0.0.0
mysql> create database nova;
mysql> grant all privileges on nova.* to nova@localhost identified by ‘password’;
mysql> create database cinder;
mysql> grant all privileges on cinder.* to cinder@localhost identified by ‘password’;
mysql> create database glance;
mysql> grant all privileges on glance.* to glance@localhost identified by ‘password’;
mysql> create database keystone;
mysql> grant all privileges on keystone.* to keystone@localhost identified by ‘password’;
mysql> create database quantum;
mysql> grant all privileges on quantum.* to quantum@localhost identified by ‘password’;
mysql> grant all privileges on quantum.* to quantum@192.168.100.2  identified by ‘password’;
mysql> grant all privileges on quantum.* to quantum@192.168.100.3  identified by ‘password’;
mysql> flush privileges;

RabbitMQ 메시징 서비스

오픈스택 구성요소들은 큐를 통해 통신한다. 예를들면, 클라우드 컨트롤러는 큐에 인스턴스 시작 요청을 놓는다. 그러면 컴퓨트 노드는 요청을 잡아서 인스턴스를 실행한다. 오픈스택은 몇가지 다른 큐 서비스들을 사용할 수 있다.

# apt-get install rabbitmq-server

기본 비밀번호 변경

# rabbitmqctl change_password guest password

오픈스택 Identity 서비스

오픈스택 identity 서비스는 클라우드 환경에서 인증과 권한부여 시스템을 제공한다.  이 시스템에서 사용자는 하나 이상의 프로젝트 일부분이다. 각 프로젝트에서 사용자는 특별한 역할을 가진다.

# apt-get install keystone python-keystone python-keystoneclient

설정은 /etc/keystone/keystone.conf 에서 아래 내용을 변경한다. password는 자신이 설정한것을 사용하면 된다.

[default] 항목과, [sql]항목.

# admin_token = ADMIN
admin_token = password
# debug = False
debug = True
# Print more
verbose output
# verbose = False
verbose = True
#connection = sqlite:////var/lib/keystone/keystone.db
connection = mysql://keystone:password@localhost/keystone

keystone 서비스를 시작하고, 데이터베이스를 생성한다.

# /etc/init.d/keystone restart
# keystone-manage db_sync

서비스 실행에 문제가 있다면, keystone.log 화일을 확인해 본다.

# cat /var/log/keystone/keystone.log  | grep -i error

openrc 화일을 생성한다. (나는 /root/openrc 로 생성했다) 생성후 source커맨드로 적용한다.

# cat openrc
export OS_TENANT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=password
export OS_AUTH_URL=”http://localhost:5000/v2.0/”
export OS_SERVICE_TOKEN=password

# source openrc

아래의 스크립트로 keystone의 초기값을 만들어 준다.

  • Projects: admin and services
  • Roles: admin, Member
  • Users: admin, demo, nova, glance, quantum, and cinder
  • Services: compute, volume, image, identity, ec2, and network

스크립트(keystone_init.sh 로 이름 붙였음, keystone host의 IP주소와 비밀번호는 자신의 환경에 맞는것으로 변경한다)

# cat keystone_init.sh

#!/bin/bash

# Modify these variables as needed
ADMIN_PASSWORD=${ADMIN_PASSWORD:-password}
SERVICE_PASSWORD=${SERVICE_PASSWORD:-$ADMIN_PASSWORD}
DEMO_PASSWORD=${DEMO_PASSWORD:-$ADMIN_PASSWORD}
export OS_SERVICE_TOKEN="password"
export OS_SERVICE_ENDPOINT="http://localhost:35357/v2.0"
SERVICE_TENANT_NAME=${SERVICE_TENANT_NAME:-service}
#
MYSQL_USER=keystone
MYSQL_DATABASE=keystone
MYSQL_HOST=localhost
MYSQL_PASSWORD=password
#
KEYSTONE_REGION=RegionOne
KEYSTONE_HOST=192.168.100.1

# Shortcut function to get a newly generated ID
function get_field() {
    while read data; do
        if [ "$1" -lt 0 ]; then
            field="(\$(NF$1))"
        else
            field="\$$(($1 + 1))"
        fi
        echo "$data" | awk -F'[ \t]*\\|[ \t]*' "{print $field}"
    done
}

# Tenants
ADMIN_TENANT=$(keystone tenant-create --name=admin | grep " id " | get_field 2)
DEMO_TENANT=$(keystone tenant-create --name=demo | grep " id " | get_field 2)
SERVICE_TENANT=$(keystone tenant-create --name=$SERVICE_TENANT_NAME | grep " id " | get_field 2)

# Users
ADMIN_USER=$(keystone user-create --name=admin --pass="$ADMIN_PASSWORD" --email=admin@domain.com | grep " id " | get_field 2)
DEMO_USER=$(keystone user-create --name=demo --pass="$DEMO_PASSWORD" --email=demo@domain.com --tenant-id=$DEMO_TENANT | grep " id " | get_field 2)
NOVA_USER=$(keystone user-create --name=nova --pass="$SERVICE_PASSWORD" --tenant-id $SERVICE_TENANT --email=nova@domain.com | grep " id " | get_field 2)
GLANCE_USER=$(keystone user-create --name=glance --pass="$SERVICE_PASSWORD" --tenant-id $SERVICE_TENANT --email=glance@domain.com | grep " id " | get_field 2)
QUANTUM_USER=$(keystone user-create --name=quantum --pass="$SERVICE_PASSWORD" --tenant-id $SERVICE_TENANT --email=quantum@domain.com | grep " id " | get_field 2)
CINDER_USER=$(keystone user-create --name=cinder --pass="$SERVICE_PASSWORD" --tenant-id $SERVICE_TENANT --email=cinder@domain.com | grep " id " | get_field 2)

# Roles
ADMIN_ROLE=$(keystone role-create --name=admin | grep " id " | get_field 2)
MEMBER_ROLE=$(keystone role-create --name=Member | grep " id " | get_field 2)

# Add Roles to Users in Tenants
keystone user-role-add --user-id $ADMIN_USER --role-id $ADMIN_ROLE --tenant-id $ADMIN_TENANT
keystone user-role-add --tenant-id $SERVICE_TENANT --user-id $NOVA_USER --role-id $ADMIN_ROLE
keystone user-role-add --tenant-id $SERVICE_TENANT --user-id $GLANCE_USER --role-id $ADMIN_ROLE
keystone user-role-add --tenant-id $SERVICE_TENANT --user-id $QUANTUM_USER --role-id $ADMIN_ROLE
keystone user-role-add --tenant-id $SERVICE_TENANT --user-id $CINDER_USER --role-id $ADMIN_ROLE
keystone user-role-add --tenant-id $DEMO_TENANT --user-id $DEMO_USER --role-id $MEMBER_ROLE

# Create services
COMPUTE_SERVICE=$(keystone service-create --name nova --type compute --description 'OpenStack Compute Service' | grep " id " | get_field 2)
VOLUME_SERVICE=$(keystone service-create --name cinder --type volume --description 'OpenStack Volume Service' | grep " id " | get_field 2)
IMAGE_SERVICE=$(keystone service-create --name glance --type image --description 'OpenStack Image Service' | grep " id " | get_field 2)
IDENTITY_SERVICE=$(keystone service-create --name keystone --type identity --description 'OpenStack Identity' | grep " id " | get_field 2)
EC2_SERVICE=$(keystone service-create --name ec2 --type ec2 --description 'OpenStack EC2 service' | grep " id " | get_field 2)
NETWORK_SERVICE=$(keystone service-create --name quantum --type network --description 'OpenStack Networking service' | grep " id " | get_field 2)

# Create endpoints
keystone endpoint-create --region $KEYSTONE_REGION --service-id $COMPUTE_SERVICE --publicurl 'http://'"$KEYSTONE_HOST"':8774/v2/$(tenant_id)s' --adminurl 'http://'"$KEYSTONE_HOST"':8774/v2/$(tenant_id)s' --internalurl 'http://'"$KEYSTONE_HOST"':8774/v2/$(tenant_id)s'
keystone endpoint-create --region $KEYSTONE_REGION --service-id $VOLUME_SERVICE --publicurl 'http://'"$KEYSTONE_HOST"':8776/v1/$(tenant_id)s' --adminurl 'http://'"$KEYSTONE_HOST"':8776/v1/$(tenant_id)s' --internalurl 'http://'"$KEYSTONE_HOST"':8776/v1/$(tenant_id)s'
keystone endpoint-create --region $KEYSTONE_REGION --service-id $IMAGE_SERVICE --publicurl 'http://'"$KEYSTONE_HOST"':9292' --adminurl 'http://'"$KEYSTONE_HOST"':9292' --internalurl 'http://'"$KEYSTONE_HOST"':9292'
keystone endpoint-create --region $KEYSTONE_REGION --service-id $IDENTITY_SERVICE --publicurl 'http://'"$KEYSTONE_HOST"':5000/v2.0' --adminurl 'http://'"$KEYSTONE_HOST"':35357/v2.0' --internalurl 'http://'"$KEYSTONE_HOST"':5000/v2.0'
keystone endpoint-create --region $KEYSTONE_REGION --service-id $EC2_SERVICE --publicurl 'http://'"$KEYSTONE_HOST"':8773/services/Cloud' --adminurl 'http://'"$KEYSTONE_HOST"':8773/services/Admin' --internalurl 'http://'"$KEYSTONE_HOST"':8773/services/Cloud'
keystone endpoint-create --region $KEYSTONE_REGION --service-id $NETWORK_SERVICE --publicurl 'http://'"$KEYSTONE_HOST"':9696/' --adminurl 'http://'"$KEYSTONE_HOST"':9696/' --internalurl 'http://'"$KEYSTONE_HOST"':9696/'

만약 오류가 발생한다면, keystone 데이터베이스를 삭제한 후 다시 만들어준다.

mysql> drop database keystone;
Query OK, 19 rows affected (0.33 sec)
mysql> create database keystone;
Query OK, 1 row affected (0.00 sec)
mysql> exit Bye root@tech:~

# keystone-manage db_sync

위 스크립트 실행시 아래와 같은 경고문 발생!!!

경고문구

WARNING: Bypassing authentication using a token & endpoint (authentication credentials are being ignored).

 

오픈스택 Image 서비스

이미지 서비스는 인스턴스 시작할 수 있는 가상머신 이미지의 목록을 제공한다.  예를들면, 우분투 12.04 이미지가 있다면, 우분투 12.04 인스턴스를 시작할 수 있다.

설치와 구성

# apt-get install glance

오픈스택 이미지 서비스는 glance-api 와 glance-registry 서비스를 제공한다. 이 서비스(api, registry)를 동일하게 구성할 수 있지만 각 서비스는 별개임을 주의해야 한다. /etc/glance/glance-api.conf를 아래와 같이 고친다. password같은 것은 환경에 맞게 바꾸면 된다.

# vi /etc/glance/glance-api.conf
#sql_connection = sqlite:////var/lib/glance/glance.sqlite
sql_connection = mysql://glance:password@localhost/glance
#admin_tenant_name = %SERVICE_TENANT_NAME%
#admin_user = %SERVICE_USER%
#admin_password = %SERVICE_PASSWORD%
admin_tenant_name = service
admin_user = glance
admin_password = password
#flavor=
flavor=keystone

/etc/glance/glance-registry.conf 도 위와 같이 고치고, glance 를 재 시작한다.

# /etc/init.d/glance-api restart

# /etc/init.d/glance-registry restart

이미지를 다운로드(나는 /home/glance_image 디렉토리를 만들고 아래 작업을 수행했다)하고 Import 한다.

# wget http://uec-images.ubuntu.com/releases/12.04.2/release/ubuntu-12.04.2-server-cloudimg-amd64-disk1.img
# glance image-create –is-public true –disk-format qcow2 –container-format bare –name “Ubuntu” < ubuntu-12.04.2-server-cloudimg-amd64-disk1.img
+——————+————————————–+
| Property | Value |
+——————+————————————–+
| checksum | ec0a41eda5fb5efb8b08cfebe4a61f64 |
| container_format | bare |
| created_at | 2013-08-17T13:34:02 |
| deleted | False | | deleted_at | None |
| disk_format | qcow2 |
| id | b64d67a9-4220-4e25-a828-048bdf8dd9d6 |
| is_public | True |
| min_disk | 0 |
| min_ram | 0 |
| name | Ubuntu |
| owner | 86a6e755358544c0a053a09465fb5088 |
| protected | False |
| size | 252510208 |
| status | active |
| updated_at | 2013-08-17T13:34:04 |
+——————+————————————–+

cirros는 오픈스택 배포 시험을 위한 작은 이미지다.

# wget http://download.cirros-cloud.net/0.3.1/cirros-0.3.1-x86_64-disk.img
# glance image-create –is-public true –disk-format qcow2 –container-format bare –name “CirrOS 0.3.1” < cirros-0.3.1-x86_64-disk.img
+——————+————————————–+
| Property | Value |
+——————+————————————–+
| checksum | d972013792949d0d3ba628fbe8685bce |
| container_format | bare |
| created_at | 2013-08-17T13:40:56 |
| deleted | False |
| deleted_at | None |
| disk_format | qcow2 |
| id | 921caadf-8388-4628-913e-39ea93f4083b |
| is_public | True |
| min_disk | 0 |
| min_ram | 0 |
| name | CirrOS 0.3.1 |
| owner | 86a6e755358544c0a053a09465fb5088 |
| protected | False |
| size | 13147648 |
| status | active |
| updated_at | 2013-08-17T13:40:56 |
+——————+————————————–+

이미지들이 잘 import되었는지 확인해 본다.

# glance image-list
+————————————–+————–+————-+——————+———–+——–+
| ID | Name | Disk Format | Container Format | Size | Status |
+————————————–+————–+————-+——————+———–+——–+
| 921caadf-8388-4628-913e-39ea93f4083b | CirrOS 0.3.1 | qcow2 | bare | 13147648 | active |
| b64d67a9-4220-4e25-a828-048bdf8dd9d6 | Ubuntu | qcow2 | bare | 252510208 | active |
+————————————–+————–+————-+——————+———–+——–+

오픈스택 Compute (Cloud Controller 서비스)

오픈스택 compute 서비스는 가상머신(인스턴스)의 생성, 삭제, 스케쥴링 할 수 있는 클라우드 환경을 제공한다. 설치는 아래 커맨드로 한다.

# apt-get install nova-api nova-cert nova-common nova-conductor nova-scheduler python-nova python-novaclient nova-consoleauth novnc nova-novncproxy

/etc/nova/api-paste.ini의 아래 내용을 변경한다.

#admin_tenant_name = %SERVICE_TENANT_NAME%
#admin_user = %SERVICE_USER%
#admin_password = %SERVICE_PASSWORD%
admin_tenant_name = service
admin_user = nova
admin_password = password

/etc/nova/nova.conf에 아래 내용을 추가한다. nova.conf에 많은 설정을 할 수가 있다. ip주소와 password는 환경에 맞게 고치면 된다.

sql_connection=mysql://nova:nova@localhost/nova
my_ip=192.168.100.1
rabbit_password=password
auth_strategy=keystone
# Networking
network_api_class=nova.network.quantumv2.api.API
quantum_url=http://192.168.100.1:9696
quantum_auth_strategy=keystone
quantum_admin_tenant_name=service
quantum_admin_username=quantum
quantum_admin_password=password
quantum_admin_auth_url=http://192.168.100.1:35357/v2.0
libvirt_vif_driver=nova.virt.libvirt.vif.LibvirtHybridOVSBridgeDriver
linuxnet_interface_driver=nova.network.linux_net.LinuxOVSInterfaceDriver
# Security Groups
firewall_driver=nova.virt.firewall.NoopFirewallDriver
security_group_api=quantum
# Metadata
quantum_metadata_proxy_shared_secret=password
service_quantum_metadata_proxy=true
metadata_listen = 192.168.100.1
metadata_listen_port = 8775
# Cinder volume_api_class=nova.volume.cinder.API
# Glance glance_api_servers=192.168.100.1:9292
image_service=nova.image.glance.GlanceImageService
# novnc novnc_enable=true novncproxy_port=6080
novncproxy_host=59.29.142.9
vncserver_listen=0.0.0.0

nova 데이터베이스를 생성한다.

# nova-manage db sync

nova 서비스를 재시작한다.

# /etc/init.d/nova-api restart
# /etc/init.d/nova-cert restart
# /etc/init.d/nova-consoleauth restart
# /etc/init.d/nova-scheduler restart
# /etc/init.d/nova-novncproxy restart

 오픈스택 block storage 

Cinder가 많은 스토리지 드라이버들을 담고 있음에도, 가장 일반적인 구성은 LVM 과 iSCSI를 사용하는 것이다. 여기서는 하나의 디스크(/dev/sdb)를 ‘cinder-volumes‘ 이라는 이름의 LVM 볼륨으로 만들어 사용할 것이다. 사용자가 블록 스토리지 볼륨을 요청할 때, 볼륨 그룹에서 논리 볼륨을 생성하고 iSCSI로 사용자의 인스턴스에 마운트한다.

Cinder 설치

# apt-get install cinder-api cinder-scheduler cinder-volume iscsitarget open-iscsi iscsitarget-dkms python-cinderclient linux-headers-`uname -r`

iscsi 설정과 서비스 실행

 # sed -i ‘s/false/true/g’ /etc/default/iscsitarget
# /etc/init.d/iscsitarget start
* Starting iSCSI enterprise target service [ OK ] [ OK ]
# /etc/init.d/open-iscsi start
* Starting iSCSI initiator service iscsid [ OK ]
* Setting up iSCSI targets iscsiadm: No records found

Cinder 설정 /etc/cinder/cinder.conf에 아래 내용을 추가한다.

sql_connection = mysql://cinder:password@localhost/cinder
rabbit_password=password

/etc/cinder/api-paste.ini 화일의 내용을 수정한다.

#admin_tenant_name = %SERVICE_TENANT_NAME%
#admin_user = %SERVICE_USER%
#admin_password = %SERVICE_PASSWORD%
admin_tenant_name = service
admin_user = cinder
admin_password = password

남은 하드디스크(/dev/sdb)에 LV를 설정하고, cinder 서비스를 재시작한다.

# pvcreate /dev/sdb
Writing physical volume data to disk “/dev/sdb”
Physical volume “/dev/sdb” successfully created
# vgcreate cinder-volumes /dev/sdb Volume group “cinder-volumes” successfully created
# /etc/init.d/cinder-api restart
# /etc/init.d/cinder-scheduler restart
# /etc/init.d/cinder-volume restart

오픈스택 Network 서비스(cloud controller)

OpenStack 네트워크 서비스는 클라우드에 포괄적이고 확장가능한 네트워 서비스를 제공한다.

quantum 서버 설치

# apt-get install quantum-server

/etc/quantum/quantum.conf 에 아래와 같은 설정을 적용한다(password는 자신의 환경에 맞게 적용)

# verbose = False
verbose = True
# rabbit_password = guest
rabbit_password = password
#admin_tenant_name = %SERVICE_TENANT_NAME%
#admin_user = %SERVICE_USER%
#admin_password = %SERVICE_PASSWORD%
admin_tenant_name = service
admin_user = quantum
admin_password = password

/etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini 에 아래 내용을 적용한다.

#sql_connection = sqlite:////var/lib/quantum/ovs.sqlite
sql_connection = mysql://quantum:quantum@localhost/quantum
[OVS]
tenant_network_type = gre
tunnel_id_ranges = 1:1000
enable_tunneling = True
local_ip = 192.168.100.1
[SECURITYGROUP]
firewall_driver = quantum.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver

OVS 플러그인을 활성화 하고 quantum 서비스를 재실행 한다.

# ln -s /etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini /etc/quantum/plugin.ini
# /etc/init.d/quantum-server restart

 

오픈스택 dashboard 서비스

오픈스택 dashboard 서비스는 command-line tool을 사용하는 대신 웹 기반 GUI와 클라우드 환경을 사용자에게 제공한다. 이것을 사용하기 위해서는 horizon 패키지를 설치해야 한다.

# apt-get install openstack-dashboard memcached python-memcache

선택사항으로 openstack-dashboard-ubuntu-theme 를 제거해 준다.

# apt-get remove –purge openstack-dashboard-ubuntu-theme

 

4.2. Network Node

네트워크 노드는  터널링으로 Virtual Bridging (Open-vSwitch + Quantum Agent)와 DHCP Server (Quantum DHCP Agent), Virtual Routing (Quantum L3 Agent)을 제공한다.

인터페이스 설정: eth0는 59.29.142.88, eth1은 192.168.100.2 로 설정

hostname 은 network로 설정(/etc/hosts 를 controller, compute, network 모두 같은내용으로 설정)

/etc/sysctl.conf에 아래 내용을 추가(또는 변경)하여 커널파라메터를 수정하고 적용한다.

net.ipv4.ip_forward = 1
net.ipv4.conf.all.forwarding = 1
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0
# sysctl -e -p /etc/sysctl.conf

ntp 서버 설치

# apt-get install ntp

 

openstack networking(network controller)
openvswitch

# apt-get install quantum-plugin-openvswitch-agent quantum-dhcp-agent quantum-13-agent

외부 인터페이스를 bridge로 만든다.

# ovs-vsctl add-br br-ex
# ovs-vsctl add-port br-ex eth0

내부 인터페이스도 같은 방법으로 브릿지로 만든다.

/etc/network/interfaces 내용을 아래와 같이 수정한다.

auto br-ex
iface br-ex inet static
address 59.29.142.88
netmask 255.255.255.0
gateway 59.29.142.254

auto eth0
iface eth0 inet manual
up ip address add 0/0 dev $IFACE
up ip link set $IFACE up
down ip link set $IFACE down

auto br-int
iface br-int inet static
address 192.168.100.2
netmask 255.255.255.0
network 192.168.100.0
broadcast 192.168.100.255

auto eth1
iface eth1 inet manual
up ip address add 0/0 dev $IFACE
up ip link set $IFACE up
down ip link set $IFACE down

# /etc/init.d/networking restart

eth0에 아이피주소가 제거되지 않았다면, 아래 커맨드로 제거해준다.(eth1 도 마찬가지)

# ip addr del 59.29.142.88/24 dev eth0

 

참고: openvswitch의 브릿지는 리눅스 브릿지와 함께 사용할 수 없으므로, 리눅스 브릿지를 사용한다면 먼저, 리눅스 브릿지를 해제하고 openvswitch 브릿지를 만들어야 한다. (lsmod 로 확인하고 모듈이 사용중이라면 rmmod 로 제거한다)

 

quantum 서비스

/etc/quantum/quantum.conf에 아래 내용을 수정 또는 추가한다.(IP 주소와 password는 자신에 맞게 수정한다)

[DEFAULT]
verbose = True
rabbit_password = password
rabbit_host = 192.168.100.1
[keystone_authtoken]
#auth_host = 127.0.0.1
auth_host = 192.168.100.1
auth_port = 35357
auth_protocol = http
#admin_tenant_name = %SERVICE_TENANT_NAME%
#admin_user = %SERVICE_USER%
#admin_password = %SERVICE_PASSWORD%
admin_tenant_name = service
admin_user = quantum
admin_password = password

/etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini 에 아래 내용을 추가 또는 수정

[DATABASE]
#sql_connection = sqlite:////var/lib/quantum/ovs.sqlite
sql_connection = mysql://quantum:quantum@192.168.100.1
[OVS]
tenant_network_type = gre
tunnel_id_ranges = 1:1000
enable_tunneling = True
local_ip = 192.168.100.2
[SECURITYGROUP]
firewall_driver = quantum.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver

서비스를 실행한다.

# /etc/init.d/quantum-plugin-openvswitch-agent start
# /etc/init.d/quantum-dhcp-agent restart
# /etc/init.d/quantum-metadata-agent restart
# /etc/init.d/quantum-l3-agent restart

 

Virtual Networking

openrc 화일에 아래 내용을 추가하고 적용한다.

# vi ~/openrc
export OS_TENANT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=password
export OS_AUTH_URL=”http://192.168.100.1:5000/v2.0/”
export SERVICE_ENDPOINT=”http://192.168.100.1:35357/v2.0″
export SERVICE_TOKEN=password
# echo “source ~/openrc” >> ~/.bashrc

demo 프로젝트 생성(demo 프로젝트를 사용하지 않을것이라면 아래 부분은 필요없음)

demo.sh 를 아래와 같이 작성한다.

#!/bin/bash
TENANT_NAME=”demo”
TENANT_NETWORK_NAME=”demo-net”
TENANT_SUBNET_NAME=”${TENANT_NETWORK_NAME}-subnet”
TENANT_ROUTER_NAME=”demo-router”
FIXED_RANGE=”192.168.200.0/24″
NETWORK_GATEWAY=”192.168.200.1″
TENANT_ID=$(keystone tenant-list | grep ” $TENANT_NAME ” | awk ‘{print $2}’)

TENANT_NET_ID=$(quantum net-create –tenant_id $TENANT_ID $TENANT_NETWORK_NAME –provider:network_type gre –provider:segmentation_id 1 | grep ” id ” | awk ‘{print $4}’)
TENANT_SUBNET_ID=$(quantum subnet-create –tenant_id $TENANT_ID –ip_version 4 –name $TENANT_SUBNET_NAME $TENANT_NET_ID $FIXED_RANGE –gateway $NETWORK_GATEWAY –dns_nameservers list=true 8.8.8.8 | grep ” id ” | awk ‘{print $4}’)
ROUTER_ID=$(quantum router-create –tenant_id $TENANT_ID $TENANT_ROUTER_NAME | grep ” id ” | awk ‘{print $4}’)
quantum router-interface-add $ROUTER_ID $TENANT_SUBNET_ID

작성한 스크립트를 실행한다.

# bash demo.sh
Added interface to router 12c464f0-b183-4bd3-9413-514ef46d4ae6

 

L3 설정

quantum L3 서비스는 인스턴스가 외부네트워크에 접속할 수 있게 한다. 이 서비스가 구성되지 않으면, 인스턴스들은 서로 다른 인스턴스와만 통신이 가능하다. 이 구성은 사용자 환경과 밀접하므로, 구성에 주의해야 한다. 가령, 아래와 같은 설정을 할때 외부 서브넷(59.29.142.0/24)뿐 아니라  할당 풀(alloacation pool) 에 관한 설정도 확인해야 한다.

외부네트워크 생성

# quantum net-create public –router:external=True
Created a new network:
+—————————+————————————–+
| Field | Value |
+—————————+————————————–+
| admin_state_up | True |
| id | 05683239-c8fd-433b-abb3-95128b8bea81 |
| name | public |
| provider:network_type | gre |
| provider:physical_network | |
| provider:segmentation_id | 2 |
| router:external | True |
| shared | False |
| status | ACTIVE |
| subnets | |
| tenant_id | 1ac47050923f46a7ad3045c87305c414 |
+—————————+————————————–+

외부네트워크의 서브넷 생성

# quantum subnet-create –ip_version 4 –gateway 59.29.142.254 public 59.29.142.0/24 –allocation-pool start=59.29.142.90,end=59.29.142.99 –disable-dhcp –name public-subnet
Created a new subnet:
+——————+————————————————–+
| Field | Value |
+——————+————————————————–+
| allocation_pools | {“start”: “59.29.142.90”, “end”: “59.29.142.99”} |
| cidr | 59.29.142.0/24 |
| dns_nameservers | |
| enable_dhcp | False |
| gateway_ip | 59.29.142.254 |
| host_routes | |
| id | cb3aa585-b0a1-44b2-a409-df1a8623e751 |
| ip_version | 4 |
| name | public-subnet |
| network_id | 05683239-c8fd-433b-abb3-95128b8bea81 |
| tenant_id | 1ac47050923f46a7ad3045c87305c414 |
+——————+————————————————–+

public 네트워크를 위한 demo-router 의 게이트웨이 설정

# quantum router-gateway-set demo-router public
Set gateway for router demo-router

 

4.3. Compute Node

컴퓨트 노드는 hypervisor, nova-compute, quantum-ovs-agent를 제공한다.

IP: 59.29.142.86, 192.168.100.3
hostname: compute01 로 설정

openstack compute
cloud controller 처럼 cloud compute 서비스는 compute 노드에 설치된다. 여기에서 nova-compute 서비스를 설치한다.  컴퓨트 서비스는 가상머신 host 기능을 제공한다. 패키지 설치

# apt-get install nova-compute-kvm

/etc/nova/api-paste.ini 에 필요한 부분을 수정한다.

#auth_host = 127.0.0.1
auth_host = 192.168.100.1
auth_port = 35357
auth_protocol = http
#admin_tenant_name = %SERVICE_TENANT_NAME%
#admin_user = %SERVICE_USER%
#admin_password = %SERVICE_PASSWORD%
admin_tenant_name = service
admin_user = nova
admin_password = password

/etc/nova/nova.conf 화일에 아래 내용을 추가한다.

[DEFAULT]
dhcpbridge_flagfile=/etc/nova/nova.conf
dhcpbridge=/usr/bin/nova-dhcpbridge
logdir=/var/log/nova
state_path=/var/lib/nova
lock_path=/var/lock/nova
force_dhcp_release=True
iscsi_helper=tgtadm
libvirt_use_virtio_for_bridges=True
connection_type=libvirt
root_helper=sudo nova-rootwrap /etc/nova/rootwrap.conf
verbose=True
ec2_private_dns_show_ip=True
api_paste_config=/etc/nova/api-paste.ini
volumes_path=/var/lib/nova/volumes
enabled_apis=ec2,osapi_ompute,metadata

# General
verbose=True
my_ip=192.168.100.3
rabbit_host=192.168.100.1
rabbit_password=password

auth_strategy=keystone
ec2_host=192.168.100.1
ec2_url=http://192.168.100.1:8773/services/Cloud

# Networking
libvirt_use_virtio_for_bridges=True
network_api_class=nova.network.quantumv2.api.API
quantum_url=http://192.168.100.1:9696
quantum_auth_strategy=keystone
quantum_admin_tenant_name=service
quantum_admin_username=quantum
quantum_admin_password=password
quantum_admin_auth_url=http://192.168.100.1:35357/v2.0

# Security Groups
firewall_driver=nova.virt.firewall.NoopFirewallDriver
security_group_api=quantum

# Compute
compute_driver=libvirt.LibvirtDriver
connection_type=libvirt

# Cinder
volume_api_class=nova.volume.cinder.API

# Glance
glance_api_servers=192.168.100.1:9292
image_service=nova.image.glance.GlanceImageService

# novnc
vnc_enabled=true
vncserver_proxyclient_address=192.168.100.3
novncproxy_base_url=http://192.168.100.1:6080/vnc_auto.html
vncserver_listen=0.0.0.0

compute 서비스 재실행

/etc/init.d/nova-compute restart

openstack networking (compute node)

openvSwitch

설치

# apt-get install -y openvswitch-switch

내부 브릿지(internal bridge)를 설정한다. 여기에서는 compute node가 외부 브릿지를 제공하지 않는다. 이것은 모든 인스턴스들의 트래픽이 네트워크 컨트롤러를 통과하는 것을 의미한다.  이것은 ‘single-node’ 네트워크 구성으로 알려져 있다.

# ovs-vsctl add-br br-int

quantum

설치

# apt-get install -y quantum-plugin-openvswitch-agent

/etc/quantum/quantum.conf 에 아래 내용을 추가한다.

rabbit_host = 192.168.100.1
rabbit_password = password
verbose = True

/etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini 에 아래 내용을 추가 또는 수정한다.

[DATABASE]
#sql_connection = sqlite:////var/lib/quantum/ovs.sqlite
sql_connection = mysql://quantum:quantum@192.168.100.1/quantum
[OVS]
tenant_network_type = gre
tunnel_id_ranges = 1:1000
local_ip = 192.168.100.3
enable_tunneling = True
[SECURITYGROUP]
firewall_driver = quantum.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver

 

5.   VM 생성하기

http://192.168.100.1/horizon 에 접속한다.

네트워크를 생성한다. horizon에서 생성할 경우 vm에서 외부 네트워크로 통신이 안되는 문제가 발생하여, 커맨드라인(네트워크 노드)에서 생성했다.

# quantum net-create pub-net –router:external True
Created a new network:
+—————————+————————————–+
| Field | Value |
+—————————+————————————–+
| admin_state_up | True |
| id | 3c637bf2-b521-4be6-86a7-2e6abbd221d7 |
| name | pub-net |
| provider:network_type | gre |
| provider:physical_network | |
| provider:segmentation_id | 1 |
| router:external | True |
| shared | False |
| status | ACTIVE |
| subnets | |
| tenant_id | 1ac47050923f46a7ad3045c87305c414 |
+—————————+————————————–+
# quantum subnet-create –gateway 59.29.142.254 –allocation-pool start=59.29.142.91,end=59.29.142.100 –disable-dhcp pub-net 59.29.142.0/24
Created a new subnet:
+——————+—————————————————+
| Field | Value |
+——————+—————————————————+
| allocation_pools | {“start”: “59.29.142.91”, “end”: “59.29.142.100”} |
| cidr | 59.29.142.0/24 |
| dns_nameservers | |
| enable_dhcp | False |
| gateway_ip | 59.29.142.254 |
| host_routes | |
| id | dc380771-a913-48d5-8b79-5a885eaf2a3d |
| ip_version | 4 |
| name | |
| network_id | 3c637bf2-b521-4be6-86a7-2e6abbd221d7 |
| tenant_id | 1ac47050923f46a7ad3045c87305c414 |
+——————+—————————————————+

# quantum net-create priv-net
Created a new network:
+—————————+————————————–+
| Field | Value |
+—————————+————————————–+
| admin_state_up | True |
| id | 39a4ded5-9332-42ca-89f0-22f6476a5fb5 |
| name | priv-net |
| provider:network_type | gre |
| provider:physical_network | |
| provider:segmentation_id | 2 |
| router:external | False |
| shared | False |
| status | ACTIVE |
| subnets | |
| tenant_id | 1ac47050923f46a7ad3045c87305c414 |
+—————————+————————————–+

# quantum subnet-create priv-net 192.168.10.0/24 –dns_nameservers list=true 8.8.8.8 –name priv-subnet
Created a new subnet:
+——————+—————————————————-+
| Field | Value |
+——————+—————————————————-+
| allocation_pools | {“start”: “192.168.10.2”, “end”: “192.168.10.254”} |
| cidr | 192.168.10.0/24 |
| dns_nameservers | 8.8.8.8 |
| enable_dhcp | True |
| gateway_ip | 192.168.10.1 |
| host_routes | |
| id | 3f07e9ae-8ebc-4a78-b900-81c0f8d60d86 |
| ip_version | 4 |
| name | priv-subnet |
| network_id | 39a4ded5-9332-42ca-89f0-22f6476a5fb5 |
| tenant_id | 1ac47050923f46a7ad3045c87305c414 |
+——————+—————————————————-+
# quantum router-create routerB
Created a new router:
+———————–+————————————–+
| Field | Value |
+———————–+————————————–+
| admin_state_up | True |
| external_gateway_info | |
| id | 97f47fbe-248d-4e31-bc43-84f02d17cb20 |
| name | routerB |
| status | ACTIVE |
| tenant_id | 1ac47050923f46a7ad3045c87305c414 |
+———————–+————————————–+

네트워크 topology(project–>network topology)

openstack-network

 

볼륨생성(project->볼륨->create volume)

openstack-volume

인스턴스 생성(project->인스턴스들->Launch instance

openstack-instances

 

인스턴스(VM) 생성후 console 접속 된 모습 (project->인스턴스들->생성된 인스턴스 ->console)

openstack-instances2

7 comments

Skip to comment form

    • jw on 2013년 11월 6일 at 4:30 오후
    • Reply

    위대로 하셔서 성공 하셧나요??
    controller node 1개
    compute node 2개로 구성하려고 하는데…
    각각 어떻걸 설치해야 할까요???

    glance로 image-create 하실때 정상으로 되셧나요??? 옵션 에러로 계속 실패 하더라구요..
    # glance image-create –is-public true –disk-format qcow2 –container-format bare –name “Ubuntu” < ubuntu-12.04.2-server-cloudimg-amd64-disk1.img

    1. 당연히(?) 성공했습니다.!
      controller node 1개 compute node 2개로 구성하신다면,
      cloud controller와 network controller node를 같이 사용하시면 될 것 같네요.
      저는 glance쪽에서는 오류 없었습니다.

    • jw on 2013년 11월 8일 at 9:57 오전
    • Reply

    넹… 감사합니다.. 다시 해봐야 겠네요 ^^

  1. 저도 처음 설치하고 엄청난 에러를 만났었습니다. 하나하나 찾아보며 해결하시면 잘 될거라 생각합니다. ;^^

    • namu on 2013년 11월 14일 at 11:53 오전
    • Reply

    openstack grizzly 설치할 때
    ubuntu 12.04.03을 사용하셨나요?
    아니면 12.04.02를 사용하였나요?
    정확한 버전을 알려주시면 감사하겠습니다.

    1. 답변 늦었습니다.
      lsb_release -a 했을때는 12.04로만 나오네요..
      상세 버전은 어떻게 확인하죠?

    • daehoon on 2013년 11월 16일 at 12:58 오전
    • Reply

    이미지 생성 안되는 부분은
    glance-manage db_sync
    커맨드가 빠져있어서 생성 안되신듯 하네요.

답글 남기기

Your email address will not be published.