KVM Virtualization Setup
Install required packages:
yum install qemu-kvm qemu-kvm-tools virt-manager libvirt virt-install
systemctl start libvirtd
Create a 5GB raw disk image:
qemu-img create -f raw /opt/centos-6.5-x86_64.raw 5G
qemu-img info /opt/centos-6.5-x86_64.raw
Launch a VM using virt-install:
virt-install --virt-type kvm \
--name centos-6.6-64 \
--ram 512 \
--cdrom=/opt/centos-6.5.iso \
--disk path=/opt/centos-6.5-x86_64.raw \
--network network=default \
--graphics vnc,listen=0.0.0.0 \
--noautoconsole \
--os-type=linux \
--os-variant=rhel6
Access via VNC on port 5900 (or 5901 for second VM). Manage VMs with:
virsh list --all
virsh start centos-6.6-64
virsh console centos-6.6-64
Edit VM configuration safely using:
virsh edit centos-6.6-64
To define a VM from an XML file:
virsh define /opt/centos-6.6-64.xml
Monitor resources with virt-top and inspect bridges via brctl show.
Create a bridge interface:
brctl addbr br0
brctl addif br0 eth0
ip addr del 172.16.1.210/24 dev eth0
ip addr add 172.16.1.210/24 dev br0
ip link set br0 up
Update the VM’s network interface in its XML config to use br0:
<interface type='bridge'>
<mac address='52:54:00:e4:46:c7'/>
<source bridge='br0'/>
<model type='virtio'/>
</interface>
Apply changes by restarting the VM:
virsh destroy centos-6.6-64
virsh start centos-6.6-64
OpenStack Icehouse Core Components
Base Environment
Enable EPEL and install dependencies:
wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm
rpm -ivh epel-release-latest-6.noarch.rpm
yum install -y python-pip gcc gcc-c++ make libtool patch automake python-devel \
libxslt-devel MySQL-python openssl-devel libudev-devel git wget \
libvirt-python libvirt qemu-kvm gedit python-numdisplay python-eventlet \
device-mapper bridge-utils libffi-devel
MySQL Configuration
Add to /etc/my.cnf:
default-storage-engine = innodb
innodb_file_per_table
collation-server = utf8_general_ci
init-connect = 'SET NAMES utf8'
character-set-server = utf8
Create databases and users:
CREATE DATABASE keystone;
GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'172.16.0.0/255.255.0.0' IDENTIFIED BY 'keystone';
-- Repeat similarly for glance, nova, neutron, cinder
RabbitMQ Setup
yum install rabbitmq-server
cd /usr/lib/rabbitmq/bin
./rabbitmq-plugins enable rabbitmq_management
systemctl restart rabbitmq-server
Access web UI at http://172.16.1.210:15672 (guest/guest).
Keystone Identity Service
Add OpenStack Icehouse repo:
[openstack]
name=openstack
baseurl=http://repos.fedorapeople.org/repos/openstack/EOL/openstack-icehouse/epel-6
enabled=1
gpgcheck=0
Install and configure:
yum install openstack-keystone python-keystoneclient
keystone-manage pki_setup --keystone-user keystone --keystone-group keystone
chown -R keystone:keystone /etc/keystone/ssl
chmod -R o-rwx /etc/keystone/ssl
Edit /etc/keystone/keystone.conf:
admin_token = ADMIN
log_file = /var/log/keystone/keystone.log
connection = mysql://keystone:keystone@172.16.1.210/keystone
Initialize DB and start service:
keystone-manage db_sync
rm -f /var/log/keystone/keystone.log
systemctl start openstack-keystone
Set environment variables:
export OS_SERVICE_TOKEN=ADMIN
export OS_SERVICE_ENDPOINT=http://172.16.1.210:35357/v2.0
Create initial entities:
keystone user-create --name=admin --pass=admin --email=admin@example.com
keystone role-create --name=admin
keystone tenant-create --name=admin --description="Admin Tenant"
keystone user-role-add --user=admin --tenant=admin --role=admin
keystone user-role-add --user=admin --role=_member_ --tenant=admin
keystone user-create --name=demo --pass=demo
keystone tenant-create --name=demo --description="Demo Tenant"
keystone user-role-add --user=demo --role=_member_ --tenant=demo
keystone tenant-create --name=service
keystone service-create --name=keystone --type=identity
keystone endpoint-create \
--service-id=$(keystone service-list | awk '/ identity / {print $2}') \
--publicurl=http://172.16.1.210:5000/v2.0 \
--internalurl=http://172.16.1.210:5000/v2.0 \
--adminurl=http://172.16.1.210:35357/v2.0
Create credential files for admin and demo users.
Glance Image Service
Install and configure glance-api.conf and glance-registry.conf with MySQL, RabbitMQ, and Keystone settings.
Sync DB and register service:
glance-manage db_sync
keystone user-create --name=glance --pass=glance
keystone user-role-add --user=glance --tenant=service --role=admin
keystone service-create --name=glance --type=image
keystone endpoint-create \
--service-id=$(keystone service-list | awk '/ image / {print $2}') \
--publicurl=http://172.16.1.210:9292 \
--internalurl=http://172.16.1.210:9292 \
--adminurl=http://172.16.1.210:9292
Start services and upload CirrOS image:
systemctl start openstack-glance-api openstack-glance-registry
wget http://download.cirros-cloud.net/0.3.2/cirros-0.3.2-x86_64-disk.img
glance image-create --name "cirros-0.3.2" --disk-format qcow2 \
--container-format bare --is-public True --file cirros-0.3.2-x86_64-disk.img
Nova Compute Service
Install controller components:
yum install openstack-nova-api openstack-nova-cert openstack-nova-conductor \
openstack-nova-console openstack-nova-novncproxy openstack-nova-scheduler \
python-novaclient
pip install websockify==0.5.1
Configure /etc/nova/nova.conf with RabbitMQ, MySQL, Keystone, Neutron, and VNC settings.
Sync DB and register service:
nova-manage db sync
keystone user-create --name=nova --pass=nova
keystone user-role-add --user=nova --tenant=service --role=admin
keystone service-create --name=nova --type=compute
keystone endpoint-create \
--service-id=$(keystone service-list | awk '/ compute / {print $2}') \
--publicurl=http://172.16.1.210:8774/v2/%\(tenant_id\)s \
--internalurl=http://172.16.1.210:8774/v2/%\(tenant_id\)s \
--adminurl=http://172.16.1.210:8774/v2/%\(tenant_id\)s
Start Nova services:
for svc in api cert conductor consoleauth novncproxy scheduler; do
systemctl start openstack-nova-$svc
done
On compute node, install openstack-nova-compute, copy nova.conf, adjust vncserver_proxyclient_address, and start service.
Neutron Networking
Install on controller:
yum install openstack-neutron openstack-neutron-ml2 \
python-neutronclient openstack-neutron-linuxbridge
Configure neutron.conf, ml2_conf.ini (with flat type), and linuxbridge_conf.ini (mapping physnet1 to eth0).
Create Keystone user and endpoint:
keystone user-create --name=neutron --pass=neutron
keystone user-role-add --user=neutron --tenant=service --role=admin
keystone service-create --name=neutron --type=network
keystone endpoint-create \
--service-id=$(keystone service-list | awk '/ network / {print $2}') \
--publicurl=http://172.16.1.210:9696 \
--internalurl=http://172.16.1.210:9696 \
--adminurl=http://172.16.1.210:9696
Modify init scripts to include plugin configs and start neutron-server and neutron-linuxbridge-agent.
Repeat installation and config sync on compute node, then start agent.
Horizon Dashboard
Install and configure:
yum install httpd mod_wsgi memcached python-memcached openstack-dashboard
In /etc/openstack-dashboard/local_settings:
ALLOWED_HOSTS = ['172.16.1.210', 'localhost']
OPENSTACK_HOST = "172.16.1.210"
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': '127.0.0.1:11211',
}
}
Start services and access http://172.16.1.210/dashboard.
Cinder Block Storage
Controller Setup
Install and configure cinder.conf with RabbitMQ, MySQL, and Keystone.
Sync DB and register both volume and volumev2 endpoints.
LVM Backend (Storage Node)
Prepare LVM volume group cinder-volumes, configure LVM filter, install scsi-target-utils, and set up iSCSI backend in cinder.conf.
NFS Backend
Define NFS share in /etc/cinder/nfs_shares and configure driver.
GlusterFS Backend
Set up GlusterFS replica volume, then configure Cinder to use it via glusterfs_shares and apppropriate driver.
For each backend, create a volume type and associate it with the backend name.
LBaaS with HAProxy
Enable LBaaS in Horizon settings, install haproxy, configure /etc/neutron/lbaas_agent.ini, and start neutron-lbaas-agent.