아래 문서를 참고하여 세대의 물리적인 서버에 오픈스택을 설치(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.listdeb 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.254auto eth0
iface eth0 inet manual
up ip address add 0/0 dev $IFACE
up ip link set $IFACE up
down ip link set $IFACE downauto 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.255auto 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=passwordauth_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)
볼륨생성(project->볼륨->create volume)
인스턴스 생성(project->인스턴스들->Launch instance
인스턴스(VM) 생성후 console 접속 된 모습 (project->인스턴스들->생성된 인스턴스 ->console)
7 comments
Skip to comment form
위대로 하셔서 성공 하셧나요??
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
Author
당연히(?) 성공했습니다.!
controller node 1개 compute node 2개로 구성하신다면,
cloud controller와 network controller node를 같이 사용하시면 될 것 같네요.
저는 glance쪽에서는 오류 없었습니다.
넹… 감사합니다.. 다시 해봐야 겠네요 ^^
Author
저도 처음 설치하고 엄청난 에러를 만났었습니다. 하나하나 찾아보며 해결하시면 잘 될거라 생각합니다. ;^^
openstack grizzly 설치할 때
ubuntu 12.04.03을 사용하셨나요?
아니면 12.04.02를 사용하였나요?
정확한 버전을 알려주시면 감사하겠습니다.
Author
답변 늦었습니다.
lsb_release -a 했을때는 12.04로만 나오네요..
상세 버전은 어떻게 확인하죠?
이미지 생성 안되는 부분은
glance-manage db_sync
커맨드가 빠져있어서 생성 안되신듯 하네요.