Deploying OpenStack Icehouse with KVM and Core Services

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.

Tags: openstack KVM Keystone Glance nova

Posted on Mon, 27 Jul 2026 16:50:08 +0000 by Marino