ccb80d725d
Updated a typo (keystone-mange -> keystone-manage) Updated a few capitalization errors in titles Change-Id: I38ec2a6c53b9e3a1e1bf330b54c26f293a764d94 author: diane fleming
2606 lines
146 KiB
XML
2606 lines
146 KiB
XML
<?xml version="1.0" encoding="UTF-8"?>
|
||
<chapter xmlns="http://docbook.org/ns/docbook"
|
||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||
xmlns:xi="http://www.w3.org/2001/XInclude"
|
||
xmlns:svg="http://www.w3.org/2000/svg"
|
||
xmlns:html="http://www.w3.org/1999/xhtml" version="5.0"
|
||
xml:id="ch_introduction-to-openstack-compute">
|
||
<?dbhtml stop-chunking?>
|
||
<title>Compute</title>
|
||
<para>
|
||
The OpenStack Compute service allows you to control an
|
||
Infrastructure-as-a-Service (IaaS) cloud computing platform. It gives
|
||
you control over instances and networks, and allows you to manage
|
||
access to the cloud through users and projects.
|
||
</para>
|
||
<para>
|
||
Compute does not include any virtualization software. Instead, it
|
||
defines drivers that interact with underlying virtualization mechanisms
|
||
that run on your host operating system, and exposes functionality over
|
||
a web-based API.
|
||
</para>
|
||
<section xml:id="section_hypervisors">
|
||
<title>Hypervisors</title>
|
||
<para>
|
||
Compute controls hypervisors through an API server. Selecting the
|
||
best hypervisor to use can be difficult, and you must take budget,
|
||
resource constraints, supported features, and required technical
|
||
specifications into account. However, the majority of OpenStack
|
||
development is done on systems using KVM and Xen-based hypervisors.
|
||
For a detailed list of features and support across different
|
||
hypervisors, see <link xlink:href="http://wiki.openstack.org/HypervisorSupportMatrix">http://wiki.openstack.org/HypervisorSupportMatrix</link>.
|
||
</para>
|
||
<para>
|
||
You can also orchestrate clouds using multiple hypervisors in
|
||
different availability zones. The types of virtualization standards
|
||
that can be used with Compute include:
|
||
</para>
|
||
<itemizedlist>
|
||
<listitem>
|
||
<para>
|
||
<link xlink:href="https://wiki.openstack.org/wiki/Baremetal">Baremetal</link>
|
||
</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>
|
||
<link xlink:href="http://www.microsoft.com/en-us/server-cloud/hyper-v-server/default.aspx">Hyper-V</link>
|
||
</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>
|
||
<link xlink:href="http://www.linux-kvm.org/page/Main_Page">Kernel-based Virtual Machine (KVM)</link>
|
||
</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>
|
||
<link xlink:href="http://lxc.sourceforge.net/">Linux Containers (LXC)</link>
|
||
</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>
|
||
<link xlink:href="http://wiki.qemu.org/Manual">Quick Emulator (QEMU)</link>
|
||
</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>
|
||
<link xlink:href="http://user-mode-linux.sourceforge.net/">User Mode Linux (UML)</link>
|
||
</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>
|
||
<link xlink:href="http://www.vmware.com/products/vsphere-hypervisor/support.html">VMWare vSphere</link>
|
||
</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>
|
||
<link xlink:href="http://www.xen.org/support/documentation.html">Xen</link>
|
||
</para>
|
||
</listitem>
|
||
</itemizedlist>
|
||
<para>
|
||
For more information about hypervisors, see the <link xlink:href="http://docs.openstack.org/trunk/config-reference/content/section_compute-hypervisors.html">Hypervisors</link>
|
||
section in the <citetitle>OpenStack Configuration Reference</citetitle>.
|
||
</para>
|
||
</section>
|
||
<section xml:id="section_users-and-projects">
|
||
<title>Tenants, users, and roles</title>
|
||
<para>
|
||
The Compute system is designed to be used by different consumers
|
||
in the form of tenants on a shared system, and role-based access
|
||
assignments. Roles control the actions that a user is allowed to
|
||
perform.
|
||
</para>
|
||
<para>
|
||
Tenants are isolated resource containers that form the principal
|
||
organizational structure within the Compute service. They
|
||
consist of an individual VLAN, and volumes, instances, images,
|
||
keys, and users. A user can specify the tenant by appending
|
||
<literal>:project_id</literal> to their access key. If no
|
||
tenant is specified in the API request, Compute attempts to
|
||
use a tenant with the same ID as the user.
|
||
</para>
|
||
<para>
|
||
For tenants, quota controls are available to limit the:
|
||
</para>
|
||
<itemizedlist>
|
||
<listitem>
|
||
<para>number of volumes that may be launched.</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>number of processor cores and the amount of RAM
|
||
that can be allocated.</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>floating IP addresses assigned to any instance
|
||
when it launches. This allows instances to have the
|
||
same publicly accessible IP addresses.</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>fixed IP addresses assigned to the same instance
|
||
when it launches. This allows instances to have the
|
||
same publicly or privately accessible IP addresses.
|
||
</para>
|
||
</listitem>
|
||
</itemizedlist>
|
||
<para>
|
||
Roles control the actions a user is allowed to perform. By
|
||
default, most actions do not require a particular role, but
|
||
you can configure them by editing the
|
||
<filename>policy.json</filename> file for user roles. For
|
||
example, a rule can be defined so that a user must have the
|
||
<parameter>admin</parameter> role in order to be able to
|
||
allocate a public IP address.
|
||
</para>
|
||
<para>
|
||
A tenant limits users' access to particular images. Each
|
||
user is assigned a username and password. Keypairs granting
|
||
access to an instance are enabled for each user, but quotas
|
||
are set, so that each tenant can control resource consumption
|
||
across available hardware resources.
|
||
</para>
|
||
<note>
|
||
<para>
|
||
Earlier versions of OpenStack used the term
|
||
<systemitem class="service">project</systemitem> instead
|
||
of <systemitem class="service">tenant</systemitem>.
|
||
Because of this legacy terminology, some command-line
|
||
tools use <parameter>--project_id</parameter> where you
|
||
would normally expect to enter a tenant ID.
|
||
</para>
|
||
</note>
|
||
</section>
|
||
<section xml:id="section_images-and-instances">
|
||
<title>Images and instances</title>
|
||
<para>Disk images provide templates for virtual machine file systems.
|
||
The Glance service manages storage and management of images.</para>
|
||
<para>Instances are the individual virtual machines that run on
|
||
physical compute nodes. Users can launch any number of instances
|
||
from the same image. Each launched instance runs from a copy of the
|
||
base image so that any changes made to the instance do not affect
|
||
the base image. You can take snapshots of running instances to
|
||
create an image based on the current disk state of a particular
|
||
instance. The Compute services manages instances.</para>
|
||
<para>For more information about creating and troubleshooting images,
|
||
see the <link
|
||
xlink:href="http://docs.openstack.org/user-guide-admin/content/cli_manage_images.html"
|
||
>Manage Images</link> section of the <citetitle>OpenStack Admin
|
||
User Guide</citetitle>.</para>
|
||
<para>For more information about image configuration options, see the
|
||
<link
|
||
xlink:href="http://docs.openstack.org/trunk/config-reference/content/ch_configuring-openstack-image-service.html"
|
||
>Image Services</link> section of the <citetitle>OpenStack
|
||
Configuration Reference</citetitle>.</para>
|
||
<para>When you launch an instance, you must choose a
|
||
<literal>flavor</literal>, which represents a set of virtual
|
||
resources. Flavors define how many virtual CPUs an instance has and
|
||
the amount of RAM and size of its ephemeral disks. OpenStack
|
||
provides a number of predefined flavors that you can edit or add to.
|
||
Users must select from the set of available flavors defined on their
|
||
cloud.</para>
|
||
<para>For more information about flavors, see the <link
|
||
xlink:href="http://docs.openstack.org/trunk/openstack-ops/content/flavors.html"
|
||
>Flavors</link> section in the <citetitle>OpenStack Operations
|
||
Guide</citetitle>.</para>
|
||
<para>You can add and remove additional resources from running
|
||
instances, such as persistent volume storage, or public IP
|
||
addresses. The example used in this chapter is of a typical virtual
|
||
system within an OpenStack cloud. It uses the <systemitem
|
||
class="service">cinder-volume</systemitem> service, which
|
||
provides persistent block storage, instead of the ephemeral storage
|
||
provided by the selected instance flavor.</para>
|
||
<para>This diagram shows the system state prior to launching an
|
||
instance. The image store, fronted by the image service, Glance, has
|
||
a number of predefined images. Inside the cloud, a compute node
|
||
contains the available vCPU, memory, and local disk resources.
|
||
Additionally, the <systemitem class="service"
|
||
>cinder-volume</systemitem> service provides a number of
|
||
predefined volumes.</para>
|
||
<figure xml:id="initial-instance-state-figure">
|
||
<title>Base image state with no running instances</title>
|
||
<mediaobject>
|
||
<imageobject>
|
||
<imagedata fileref="../common/figures/instance-life-1.png"/>
|
||
</imageobject>
|
||
</mediaobject>
|
||
</figure>
|
||
<para>To launch an instance, select an image, a flavor, and other
|
||
optional attributes. The selected flavor provides a root volume,
|
||
labeled <literal>vda</literal> in this diagram, and additional
|
||
ephemeral storage, labeled <literal>vdb</literal>. In this example,
|
||
the <systemitem class="service">cinder-volume</systemitem> store is
|
||
mapped to the third virtual disk on this instance,
|
||
<literal>vdc</literal>.</para>
|
||
<figure xml:id="run-instance-state-figure">
|
||
<title>Instance creation from image and runtime state</title>
|
||
<mediaobject>
|
||
<imageobject>
|
||
<imagedata fileref="../common/figures/instance-life-2.png"/>
|
||
</imageobject>
|
||
</mediaobject>
|
||
</figure>
|
||
<para>The base image is copied from the image store to the local disk.
|
||
The local disk is the first disk that the instance accesses, and is
|
||
labeled <literal>vda</literal>. By using smaller images, your
|
||
instances start up faster as less data needs to be copied across
|
||
the network.</para>
|
||
<para>A new empty disk, labeled <literal>vdb</literal> is also created.
|
||
This is an empty ephemeral disk, which is destroyed when you delete
|
||
the instance.</para>
|
||
<para>The compute node is attached to the <systemitem class="service"
|
||
>cinder-volume</systemitem> using iSCSI, and maps to the
|
||
third disk, <literal>vdc</literal>. The vCPU and memory resources
|
||
are provisioned and the instance is booted from
|
||
<literal>vda</literal>. The instance runs and changes data on
|
||
the disks as indicated in red in the diagram.
|
||
<!--This isn't very accessible, need to consider rewording to explain more fully. LKB -->
|
||
</para>
|
||
<note>
|
||
<para>Some of the details in this example scenario might be
|
||
different in your environment. Specifically, you might use a
|
||
different type of back-end storage or different network
|
||
protocols. One common variant is that the ephemeral storage used
|
||
for volumes <literal>vda</literal> and <literal>vdb</literal>
|
||
could be backed by network storage rather than a local disk.</para>
|
||
</note>
|
||
<para>When the instance is deleted, the state is reclaimed with the
|
||
exception of the persistent volume. The ephemeral storage is purged,
|
||
memory and vCPU resources are released. The image remains unchanged
|
||
throughout.</para>
|
||
<figure xml:id="end-instance-state-figure">
|
||
<title>End state of image and volume after instance exits</title>
|
||
<mediaobject>
|
||
<imageobject>
|
||
<imagedata fileref="../common/figures/instance-life-3.png"/>
|
||
</imageobject>
|
||
</mediaobject>
|
||
</figure>
|
||
</section>
|
||
<section xml:id="section_system-architecture">
|
||
<title>System architecture</title>
|
||
<para>
|
||
OpenStack Compute contains several main components. The
|
||
<firstterm>cloud controller</firstterm> represents the global state
|
||
and interacts with the other components. The
|
||
<literal>API server</literal> acts as the web services
|
||
front end for the cloud controller. The
|
||
<literal>compute controller</literal> provides compute server
|
||
resources and usually also contains the Compute service.
|
||
</para>
|
||
<para>
|
||
The <literal>object store</literal> is an optional component
|
||
that provides storage services. An <literal>auth manager</literal>
|
||
provides authentication and authorization services when used
|
||
with the Compute system, or you can use the <literal>identity
|
||
service</literal> as a separate authentication service instead.
|
||
A <literal>volume controller</literal> provides fast and
|
||
permanent block-level storage for the compute servers. The
|
||
<literal>network controller</literal> provides virtual networks
|
||
to enable compute servers to interact with each other and with
|
||
the public network. The <literal>scheduler</literal> is used to
|
||
select the most suitable compute controller to host an instance.
|
||
</para>
|
||
<para>
|
||
Compute uses a messaging-based, <literal>shared nothing</literal>
|
||
architecture. All major components exist on multiple
|
||
servers, including the compute, volume, and network controllers,
|
||
and the object store or image service. The state of the entire
|
||
system is stored in a database. The cloud controller
|
||
communicates with the internal object store using HTTP, but it
|
||
communicates with the scheduler, network controller, and volume
|
||
controller using AMQP (advanced message queueing protocol). To
|
||
avoid blocking a component while waiting for a response,
|
||
Compute uses asynchronous calls, with a callback that is
|
||
triggered when a response is received.
|
||
</para>
|
||
</section>
|
||
<section xml:id="section_storage-and-openstack-compute">
|
||
<title>Block storage</title>
|
||
<para>
|
||
OpenStack provides two classes of block storage: ephemeral
|
||
storage and persistent volumes. Volumes are persistent virtualized block devices
|
||
independent of any particular instance.
|
||
</para>
|
||
<para>
|
||
Ephemeral storage is associated with a single unique instance,
|
||
and it exists only for the life of that instance. The amount
|
||
of ephemeral storage is defined by the flavor of the instance.
|
||
Generally, the root file system for an instance will be stored
|
||
on ephemeral storage. It persists across reboots of the guest
|
||
operating system, but when the instance is deleted, the
|
||
ephemeral storage is also removed.
|
||
</para>
|
||
<para>
|
||
In addition to the ephemeral root volume, all flavors except
|
||
the smallest, <filename>m1.tiny</filename>, also provide an
|
||
additional ephemeral block device of between 20 and 160GB.
|
||
These sizes can be configured to suit your environment. This is
|
||
presented as a raw block device with no partition table or
|
||
file system. Cloud-aware operating system images can discover,
|
||
format, and mount these storage devices. For example, the
|
||
<systemitem class="service">cloud-init</systemitem> package
|
||
included in Ubuntu's stock cloud images format this space as
|
||
an <filename>ext3</filename> file system and mount it on
|
||
<filename>/mnt</filename>. This is a feature of the guest
|
||
operating system you are using, and is not an OpenStack mechanism.
|
||
OpenStack only provisions the raw storage.
|
||
</para>
|
||
<para>
|
||
Persistent volumes are created by users and their size is
|
||
limited only by the user's quota and availability limits. Upon
|
||
initial creation, volumes are raw block devices without a
|
||
partition table or a file system. To partition or format
|
||
volumes, you must attach them to an instance. Once they are
|
||
attached to an instance, you can use persistent volumes in much
|
||
the same way as you would use external hard disk drive. You
|
||
can attach volumes to only one instance at a time, although you
|
||
can detach and reattach volumes to as many different instances
|
||
as you like.
|
||
</para>
|
||
<para>
|
||
Persistent volumes can be configured as bootable and used to
|
||
provide a persistent virtual instance similar to traditional
|
||
non-cloud-based virtualization systems. Typically, the
|
||
resulting instance can also still have ephemeral storage depending
|
||
on the flavor selected, but the root file system can be on the
|
||
persistent volume and its state maintained even if the instance
|
||
is shut down. For more information about this type of configuration,
|
||
see the <citetitle>OpenStack Configuration Reference</citetitle>.
|
||
</para>
|
||
<note>
|
||
<para>
|
||
Persistent volumes do not provide concurrent access from
|
||
multiple instances. That type of configuration requires a
|
||
traditional network file system like NFS or CIFS, or a cluster
|
||
file system such as GlusterFS. These systems can be built
|
||
within an OpenStack cluster or provisioned outside of it,
|
||
but OpenStack software does not provide these features.
|
||
</para>
|
||
</note>
|
||
</section>
|
||
<section xml:id="section_image-mgmt">
|
||
<title>Image management</title>
|
||
<para>The OpenStack Image service discovers, registers, and retrieves
|
||
virtual machine images. The service also includes a RESTful API
|
||
that allows you to query VM image metadata and retrieve the actual
|
||
image with HTTP requests. For more information about the API, see
|
||
the <link xlink:href="http://api.openstack.org/api-ref.html#os-images-2.0">
|
||
OpenStack API</link> or the
|
||
<link xlink:href="http://docs.openstack.org/developer/python-glanceclient/">
|
||
Python API</link>.
|
||
</para>
|
||
<para>
|
||
The OpenStack Image service can be controlled using a command line
|
||
tool. For more information about the OpenStack Image command line
|
||
tool, see the <link xlink:href="http://docs.openstack.org/user-guide/content/cli_manage_images.html">
|
||
Image Management</link> section in the <citetitle>OpenStack User Guide</citetitle>.
|
||
</para>
|
||
<para>
|
||
Virtual images that have been made available through the Image
|
||
service can be stored in a variety of ways. In order to use these
|
||
services, you must have a working installation of the Image service,
|
||
with a working endpoint, and users that have been created in the
|
||
Identity service. Additionally, you must meet the environment
|
||
variables required by the Compute and Image clients.
|
||
</para>
|
||
<para>
|
||
The Image service supports these back end stores:
|
||
</para>
|
||
<variablelist>
|
||
<varlistentry>
|
||
<term>File system</term>
|
||
<listitem>
|
||
<para>The OpenStack Image service stores virtual machine
|
||
images in the file system back-end by default. This simple
|
||
back end writes image files to the local file system.</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
<varlistentry>
|
||
<term>Object Storage service</term>
|
||
<listitem>
|
||
<para>OpenStack's highly-available object storage.</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
<varlistentry>
|
||
<term>S3</term>
|
||
<listitem>
|
||
<para>Amazon’s S3 service.</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
<varlistentry>
|
||
<term>HTTP</term>
|
||
<listitem>
|
||
<para>OpenStack Image Service can read virtual machine images
|
||
that are available on the internet using HTTP. This store
|
||
is read only.</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
<varlistentry>
|
||
<term>Rados block device (RBD)</term>
|
||
<listitem>
|
||
<para>Stores images inside of a Ceph storage cluster using
|
||
Ceph's RBD interface.</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
<varlistentry>
|
||
<term>GridFS</term>
|
||
<listitem>
|
||
<para>Stores images using MongoDB.</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
</variablelist>
|
||
</section>
|
||
<section xml:id="section_instance-mgmt">
|
||
<title>Instance management tools</title>
|
||
<para>
|
||
OpenStack provides command line, web-based, and API-based
|
||
instance management tools. Additionally, a number of third party
|
||
management tools are available, using either the native API or the
|
||
provided EC2-compatible API.
|
||
</para>
|
||
<para>
|
||
The OpenStack <application>python-novaclient</application>
|
||
package provides a basic command line utility, which uses the
|
||
<command>nova</command> command. This is available as a native
|
||
package for most Linux distributions, or you can install the latest
|
||
version using the <application>pip</application> python package installer:
|
||
<programlisting language="bash">sudo pip install python-novaclient</programlisting>
|
||
</para>
|
||
<para>
|
||
For more information about <application>python-novaclient</application>
|
||
and other available command line tools, see the
|
||
<link xlink:href="http://docs.openstack.org/user-guide/content/index.html">
|
||
<citetitle>OpenStack End User Guide</citetitle></link>.
|
||
</para>
|
||
<!--
|
||
I've commented this section out as it merely repeats what's in the
|
||
End User Guide, and isn't required here. Comments welcome. LKB
|
||
|
||
<para>What follows is
|
||
the minimal introduction required to follow the
|
||
CLI example in this chapter. In case of a conflict
|
||
in <link
|
||
xlink:href="http://docs.openstack.org/user-guide/content/index.html"
|
||
><citetitle>OpenStack End User
|
||
Guide</citetitle></link> should be
|
||
considered authoritative (and a bug filed against
|
||
this section).</para>
|
||
<para>To function, the <application>nova</application>
|
||
CLI needs this information:</para>
|
||
<itemizedlist>
|
||
<listitem>
|
||
<para><literal>Authentication URL</literal>:
|
||
This can be passed as the
|
||
<parameter>––os_auth_url</parameter>
|
||
flag or using the OS_AUTH_URL environment
|
||
variable.</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para><literal>Tenant (sometimes referred to
|
||
as project) name</literal>: This can
|
||
be passed as the
|
||
<parameter>––os_tenant_name</parameter>
|
||
flag or using the OS_TENANT_NAME
|
||
environment variable.</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para><literal>User name</literal>: This can
|
||
be passed as the
|
||
<parameter>––os_username</parameter>
|
||
flag or using the OS_USERNAME environment
|
||
variable.</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para><literal>Password</literal>: This can be
|
||
passed as the
|
||
<parameter>––os_password</parameter>
|
||
flag or using the OS_PASSWORD environment
|
||
variable.</para>
|
||
</listitem>
|
||
</itemizedlist>
|
||
<para>For example if you have your Identity Service
|
||
running on the default port (5000) on host
|
||
keystone.example.com and want to use the
|
||
<application>nova</application> cli as the
|
||
user "demouser" with the password "demopassword"
|
||
in the "demoproject" tenant you can export the
|
||
following values in your shell environment or pass
|
||
the equivalent command line args (presuming these
|
||
identities already exist):</para>
|
||
<screen><prompt>$</prompt> <userinput>export OS_AUTH_URL="http://keystone.example.com:5000/v2.0/"</userinput>
|
||
<prompt>$</prompt> <userinput>export OS_USERNAME=demouser</userinput>
|
||
<prompt>$</prompt> <userinput>export OS_PASSWORD=demopassword</userinput>
|
||
<prompt>$</prompt> <userinput>export OS_TENANT_NAME=demoproject</userinput></screen>
|
||
<para>If you use the <link
|
||
linkend="instance-mgmt-horizon">Horizon</link>
|
||
web dashboard, you can download credential files
|
||
that contain the correct values for your
|
||
particular implementation.</para>
|
||
</simplesect>-->
|
||
<!-- Commented out because it repeats information earlier in this chapter. LKB
|
||
<simplesect xml:id="instance-mgmt-horizon">
|
||
<para>
|
||
Horizon is a highly customizable and extensible OpenStack web
|
||
dashboard. For more information on Horizon, see the
|
||
<link xlink:href="http://docs.openstack.org/developer/horizon">
|
||
Horizon project site</link>.
|
||
</para>
|
||
<para>OpenStack provides a RESTful API for all functionality. Complete
|
||
API documentation is available at <link
|
||
xlink:href="http://api.openstack.org/api-ref.html">OpenStack API
|
||
Reference</link>. The <link
|
||
xlink:href="http://docs.openstack.org/api/openstack-compute/2/content/"
|
||
><citetitle>OpenStack Compute API v2 and Extensions
|
||
Reference</citetitle></link> documentation refers to
|
||
instances as <firstterm>servers</firstterm>.</para>
|
||
<para>The <link linkend="instance-mgmt-novaclient">nova cli</link> can
|
||
be made to show the API calls it is making by passing it the
|
||
<parameter>––debug</parameter> parameter:</para>-->
|
||
<screen><prompt>#</prompt> <userinput>nova --debug list</userinput>
|
||
<?db-font-size 75%?><computeroutput>connect: (10.0.0.15, 5000)
|
||
send: 'POST /v2.0/tokens HTTP/1.1\r\nHost: 10.0.0.15:5000\r\nContent-Length: 116\r\ncontent-type: application/json\r\naccept-encoding: gzip, deflate\r\naccept: application/json\r\nuser-agent: python-novaclient\r\n\r\n{"auth": {"tenantName": "demoproject", "passwordCredentials": {"username": "demouser", "password": "demopassword"}}}'
|
||
reply: 'HTTP/1.1 200 OK\r\n'
|
||
header: Content-Type: application/json
|
||
header: Vary: X-Auth-Token
|
||
header: Date: Thu, 13 Sep 2012 20:27:36 GMT
|
||
header: Transfer-Encoding: chunked
|
||
connect: (128.52.128.15, 8774)
|
||
send: u'GET /v2/fa9dccdeadbeef23ae230969587a14bf/servers/detail HTTP/1.1\r\nHost: 10.0.0.15:8774\r\nx-auth-project-id: demoproject\r\nx-auth-token: deadbeef9998823afecc3d552525c34c\r\naccept-encoding: gzip, deflate\r\naccept: application/json\r\nuser-agent: python-novaclient\r\n\r\n'
|
||
reply: 'HTTP/1.1 200 OK\r\n'
|
||
header: X-Compute-Request-Id: req-bf313e7d-771a-4c0b-ad08-c5da8161b30f
|
||
header: Content-Type: application/json
|
||
header: Content-Length: 15
|
||
header: Date: Thu, 13 Sep 2012 20:27:36 GMT
|
||
!!removed matrix for validation!! </computeroutput></screen>
|
||
</section>
|
||
<section xml:id="instance-mgmt-ec2compat">
|
||
<title>EC2 compatibility API</title>
|
||
<para>In addition to the native compute API, OpenStack provides an
|
||
EC2-compatible API. This API allows EC2 legacy workflows built for
|
||
EC2 to work with OpenStack.</para>
|
||
<para>The <citetitle>OpenStack Configuration Reference</citetitle> lists
|
||
configuration options for customizing this compatibility API on your
|
||
OpenStack cloud.</para>
|
||
<para>Numerous third party tools and language-specific SDKs can be used
|
||
to interact with OpenStack clouds, using both native and
|
||
compatibility APIs. Some of the more popular third-party tools are:</para>
|
||
<variablelist>
|
||
<varlistentry>
|
||
<term>Euca2ools</term>
|
||
<listitem>
|
||
<para>A popular open source command line tool for
|
||
interacting with the EC2 API. This is convenient for
|
||
multi-cloud environments where EC2 is the common API, or
|
||
for transitioning from EC2-based clouds to OpenStack.
|
||
For more information, see the <link
|
||
xlink:href="http://open.eucalyptus.com/wiki/Euca2oolsGuide"
|
||
>euca2ools site</link>.</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
<varlistentry>
|
||
<term>Hybridfox</term>
|
||
<listitem>
|
||
<para>A Firefox browser add-on that provides a graphical
|
||
interface to many popular public and private cloud
|
||
technologies, including OpenStack. For more information,
|
||
see the <link
|
||
xlink:href="http://code.google.com/p/hybridfox/">
|
||
hybridfox site</link>.</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
<varlistentry>
|
||
<term>boto</term>
|
||
<listitem>
|
||
<para>A Python library for interacting with Amazon Web
|
||
Services. It can be used to access OpenStack through the
|
||
EC2 compatibility API. For more information, see the
|
||
<link xlink:href="https://github.com/boto/boto">
|
||
boto project page on GitHub</link>.</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
<varlistentry>
|
||
<term>fog</term>
|
||
<listitem>
|
||
<para>A Ruby cloud services library. It provides methods for
|
||
interacting with a large number of cloud and
|
||
virtualization platforms, including OpenStack. For more
|
||
information, see the <link
|
||
xlink:href="https://rubygems.org/gems/fog"> fog
|
||
site</link>.</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
<varlistentry>
|
||
<term>php-opencloud</term>
|
||
<listitem>
|
||
<para>A PHP SDK designed to work with most OpenStack- based
|
||
cloud deployments, as well as Rackspace public cloud.
|
||
For more information, see the <link
|
||
xlink:href="http://www.php-opencloud.com">
|
||
php-opencloud site</link>.</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
</variablelist>
|
||
</section>
|
||
<section xml:id="section_instance-building-blocks">
|
||
<title>Building blocks</title>
|
||
<!-- <para>There are two fundamental requirements for a
|
||
computing system, software and hardware.
|
||
Virtualization and cloud frameworks tend to blur these
|
||
lines and some of your "hardware" might actually be
|
||
"software" but conceptually you still need an
|
||
operating system and something to run it on.</para>-->
|
||
<para>
|
||
In OpenStack the base operating system is usually copied from
|
||
an image stored in the OpenStack Image service. This is the
|
||
most common case and results in an ephemeral instance that
|
||
starts from a known template state and loses all accumulated
|
||
states on shutdown. It is also possible to put an operating
|
||
system on a persistent volume in the Nova-Volume or Cinder
|
||
volume system. This gives a more traditional persistent
|
||
system that accumulates states, which are preserved across
|
||
restarts. To get a list of available images on your system run:
|
||
<screen><prompt>$</prompt> <userinput>nova image-list</userinput>
|
||
<?db-font-size 50%?><computeroutput>+--------------------------------------+-------------------------------+--------+--------------------------------------+
|
||
| ID | Name | Status | Server |
|
||
+--------------------------------------+-------------------------------+--------+--------------------------------------+
|
||
| aee1d242-730f-431f-88c1-87630c0f07ba | Ubuntu 12.04 cloudimg amd64 | ACTIVE | |
|
||
| 0b27baa1-0ca6-49a7-b3f4-48388e440245 | Ubuntu 12.10 cloudimg amd64 | ACTIVE | |
|
||
| df8d56fc-9cea-4dfd-a8d3-28764de3cb08 | jenkins | ACTIVE | |
|
||
+--------------------------------------+-------------------------------+--------+--------------------------------------+</computeroutput></screen>
|
||
</para>
|
||
<para>
|
||
The displayed image attributes are:
|
||
</para>
|
||
<variablelist>
|
||
<varlistentry>
|
||
<term><literal>ID</literal></term>
|
||
<listitem>
|
||
<para>Automatically generated UUID of the image</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
<varlistentry>
|
||
<term><literal>Name</literal></term>
|
||
<listitem>
|
||
<para>Free form, human-readable name for image</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
<varlistentry>
|
||
<term><literal>Status</literal></term>
|
||
<listitem>
|
||
<para>The status of the image. Images marked
|
||
<literal>ACTIVE</literal> are available for use.</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
<varlistentry>
|
||
<term><literal>Server</literal></term>
|
||
<listitem>
|
||
<para>For images that are created as snapshots of running
|
||
instances, this is the UUID of the instance the snapshot
|
||
derives from. For uploaded images, this field is blank.</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
</variablelist>
|
||
|
||
<para>
|
||
Virtual hardware templates are called <literal>flavors</literal>.
|
||
The default installation provides five flavors. By default,
|
||
these are configurable by admin users, however that behavior
|
||
can be changed by redefining the access controls for
|
||
<parameter>compute_extension:flavormanage</parameter> in
|
||
<filename>/etc/nova/policy.json</filename> on the
|
||
<filename>compute-api</filename> server.
|
||
</para>
|
||
<para>
|
||
For a list of flavors that are available on your system:
|
||
</para>
|
||
<screen><prompt>$</prompt> <userinput>nova flavor-list</userinput>
|
||
<computeroutput>+----+-----------+-----------+------+-----------+------+-------+-------------+
|
||
| ID | Name | Memory_MB | Disk | Ephemeral | Swap | VCPUs | RXTX_Factor |
|
||
+----+-----------+-----------+------+-----------+------+-------+-------------+
|
||
| 1 | m1.tiny | 512 | 1 | N/A | 0 | 1 | |
|
||
| 2 | m1.small | 2048 | 20 | N/A | 0 | 1 | |
|
||
| 3 | m1.medium | 4096 | 40 | N/A | 0 | 2 | |
|
||
| 4 | m1.large | 8192 | 80 | N/A | 0 | 4 | |
|
||
| 5 | m1.xlarge | 16384 | 160 | N/A | 0 | 8 | |
|
||
+----+-----------+-----------+------+-----------+------+-------+-------------+
|
||
</computeroutput></screen>
|
||
</section>
|
||
<xi:include href="../common/section_cli_nova_customize_flavors.xml"/>
|
||
<!-- <section xml:id="section_instance-creation">
|
||
<?dbhtml stop-chunking?>
|
||
<title>Instances</title>
|
||
<para>For information about launching instances through
|
||
the nova command-line client, see the <link
|
||
xlink:href="http://docs.openstack.org/user-guide/content/index.html"
|
||
><citetitle>OpenStack End User
|
||
Guide</citetitle></link>.</para>
|
||
</section>-->
|
||
<section xml:id="section_instance-scheduling-constraints">
|
||
<title>Control where instances run</title>
|
||
<para>
|
||
The <!--<xref linkend="ch_scheduling"/>-->
|
||
<citetitle>OpenStack Configuration Reference</citetitle>
|
||
provides detailed information on controlling where your
|
||
instances run, including ensuring a set of instances run on
|
||
different compute nodes for service resiliency or on the same
|
||
node for high performance inter-instance communications.
|
||
</para>
|
||
<para>
|
||
Admin users can specify an exact compute node to
|
||
run on using the command
|
||
<command>--availability-zone <replaceable>availability-zone</replaceable>:<replaceable>compute-host</replaceable></command>
|
||
</para>
|
||
</section>
|
||
<section xml:id="admin-password-injection">
|
||
<?dbhtml stop-chunking?>
|
||
<title>Admin password injection</title>
|
||
|
||
<para>You can configure Compute to generate a random administrator (root) password and
|
||
inject that password into the instance. If this feature is enabled, a user can ssh
|
||
to an instance without an ssh keypair. The random password appears in the output of
|
||
the <command>nova boot</command> command. You can also view and set the admin
|
||
password from the dashboard.</para>
|
||
|
||
<simplesect>
|
||
<title>Dashboard</title>
|
||
<para>The dashboard is configured by default to display the admin password and allow
|
||
the user to modify it.</para>
|
||
<para>If you do not want to support password injection, we
|
||
recommend disabling the password fields by editing your
|
||
Dashboard <filename>local_settings</filename> file (file
|
||
location will vary by Linux distribution, on Fedora/RHEL/CentOS: <filename>
|
||
/etc/openstack-dashboard/local_settings</filename>, on Ubuntu and Debian:
|
||
<filename>/etc/openstack-dashboard/local_settings.py</filename> and on openSUSE and SUSE Linux Enterprise Server: <filename
|
||
>/usr/share/openstack-dashboard/openstack_dashboard/local/local_settings.py</filename>)
|
||
<programlisting>OPENSTACK_HYPERVISOR_FEATURE = {
|
||
...
|
||
'can_set_password': False,
|
||
}</programlisting></para>
|
||
</simplesect>
|
||
<simplesect>
|
||
<title>Libvirt-based hypervisors (KVM, QEMU, LXC)</title>
|
||
<para>For hypervisors such as KVM that use the libvirt backend, admin password
|
||
injection is disabled by default. To enable it, set the following option in
|
||
<filename>/etc/nova/nova.conf</filename>:</para>
|
||
<para>
|
||
<programlisting>[libvirt]
|
||
inject_password=true</programlisting>
|
||
</para>
|
||
<para>When enabled, Compute will modify the password of the root account by editing
|
||
the <filename>/etc/shadow</filename> file inside of the virtual machine
|
||
instance.</para>
|
||
<note><para>Users will only be able to ssh to the instance using the admin password if:<itemizedlist>
|
||
<listitem>
|
||
<para>The virtual machine image is a Linux distribution</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>The virtual machine has been configured to allow users to ssh
|
||
as the root user. This is not the case for <link
|
||
xlink:href="http://cloud-images.ubuntu.com/">Ubuntu cloud
|
||
images</link>, which disallow ssh to the root account by
|
||
default.</para>
|
||
</listitem>
|
||
</itemizedlist></para></note>
|
||
</simplesect>
|
||
<simplesect>
|
||
<title>XenAPI (XenServer/XCP)</title>
|
||
<para>Compute uses the XenAPI agent to inject passwords into guests when using the
|
||
XenAPI hypervisor backend. The virtual machine image must be configured with the
|
||
agent for password injection to work.</para>
|
||
</simplesect>
|
||
<simplesect>
|
||
<title>Windows images (all hypervisors)</title>
|
||
<para>To support the admin password for Windows virtual machines, you must configure
|
||
the Windows image to retrieve the admin password on boot by installing an agent
|
||
such as <link xlink:href="https://github.com/cloudbase/cloudbase-init"
|
||
>cloudbase-init</link>.</para>
|
||
</simplesect>
|
||
</section>
|
||
<!-- <section xml:id="section_instance-data">
|
||
<?dbhtml stop-chunking?>
|
||
<title>Instance-specific data</title>
|
||
<para>For each instance, you can specify certain data including authorized_keys, key
|
||
injection, user-data, metadata service, and file injection.</para>
|
||
<para>For information, see the <link
|
||
xlink:href="http://docs.openstack.org/user-guide/content/"
|
||
><citetitle>OpenStack End User
|
||
Guide</citetitle></link>.</para>
|
||
</section>
|
||
<section xml:id="section_instance-networking">
|
||
<?dbhtml stop-chunking?>
|
||
<title>Instance networking</title>
|
||
<para>For information, see the <link
|
||
xlink:href="http://docs.openstack.org/user-guide/content/index.html"
|
||
><citetitle>OpenStack End User
|
||
Guide</citetitle></link>.</para>
|
||
</section>-->
|
||
<xi:include href="../common/section_cli_nova_volumes.xml"/>
|
||
<section xml:id="section_networking-nova">
|
||
<title>Networking with nova-network</title>
|
||
<para>Understanding the networking configuration options helps
|
||
you design the best configuration for your Compute
|
||
instances.</para>
|
||
<section xml:id="section_networking-options">
|
||
<title>Networking options</title>
|
||
<para>This section offers a brief overview of each concept in
|
||
networking for Compute. With the Grizzly release, you can choose
|
||
to either install and configure <systemitem class="service"
|
||
>nova-network</systemitem> for networking between VMs or use
|
||
the Networking service (neutron) for networking. To configure
|
||
Compute networking options with Neutron, see the <xref
|
||
linkend="ch_networking"/>.</para>
|
||
<para>For each VM instance, Compute assigns to it a private IP
|
||
address. (Currently, Compute with <systemitem class="service"
|
||
>nova-network</systemitem> only supports Linux bridge
|
||
networking that enables the virtual interfaces to connect to the
|
||
outside network through the physical interface.)</para>
|
||
<para>The network controller with <systemitem class="service"
|
||
>nova-network</systemitem> provides virtual networks to
|
||
enable compute servers to interact with each other and with the
|
||
public network.</para>
|
||
<para>Currently, Compute with <systemitem class="service"
|
||
>nova-network</systemitem> supports these kinds of networks,
|
||
implemented in different “Network Manager” types: <itemizedlist>
|
||
<listitem>
|
||
<para>Flat Network Manager</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>Flat DHCP Network Manager</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>VLAN Network Manager</para>
|
||
</listitem>
|
||
</itemizedlist></para>
|
||
<para>These networks can co-exist in a cloud system. However,
|
||
because you can't yet select the type of network for a given
|
||
project, you cannot configure more than one type of network in a
|
||
given Compute installation.</para>
|
||
<note>
|
||
<para>All networking options require network connectivity to be
|
||
already set up between OpenStack physical nodes. OpenStack
|
||
does not configure any physical network interfaces.
|
||
OpenStack automatically creates all network bridges (for
|
||
example, br100) and VM virtual interfaces.</para>
|
||
<para>All machines must have a <emphasis role="italic"
|
||
>public</emphasis> and <emphasis role="italic"
|
||
>internal</emphasis> network interface (controlled by
|
||
the options: <literal>public_interface</literal> for the
|
||
public interface, and <literal>flat_interface</literal> and
|
||
<literal>vlan_interface</literal> for the internal
|
||
interface with flat / VLAN managers).</para>
|
||
<para>The internal network interface is used for communication
|
||
with VMs, it shouldn't have an IP address attached to it
|
||
before OpenStack installation (it serves merely as a fabric
|
||
where the actual endpoints are VMs and dnsmasq). Also, the
|
||
internal network interface must be put in <emphasis
|
||
role="italic">promiscuous mode</emphasis>, because it
|
||
must receive packets whose target MAC address is of the
|
||
guest VM, not of the host.</para>
|
||
</note>
|
||
<para>All the network managers configure the network using <emphasis
|
||
role="italic">network drivers</emphasis>. For example, the
|
||
Linux L3 driver (<literal>l3.py</literal> and
|
||
<literal>linux_net.py</literal>), which makes use of
|
||
<literal>iptables</literal>, <literal>route</literal> and
|
||
other network management facilities, and libvirt's <link
|
||
xlink:href="http://libvirt.org/formatnwfilter.html">network
|
||
filtering facilities</link>. The driver isn't tied to any
|
||
particular network manager; all network managers use the same
|
||
driver. The driver usually initializes (creates bridges and so
|
||
on) only when the first VM lands on this host node.</para>
|
||
<para>All network managers operate in either <emphasis role="italic"
|
||
>single-host</emphasis> or <emphasis role="italic"
|
||
>multi-host</emphasis> mode. This choice greatly influences
|
||
the network configuration. In single-host mode, a single
|
||
<systemitem class="service">nova-network</systemitem> service
|
||
provides a default gateway for VMs and hosts a single DHCP
|
||
server (dnsmasq). In multi-host mode, each compute node runs its
|
||
own <systemitem class="service">nova-network</systemitem>
|
||
service. In both cases, all traffic between VMs and the outer
|
||
world flows through <systemitem class="service"
|
||
>nova-network</systemitem>. Each mode has its pros and cons.
|
||
Read more in the <link
|
||
xlink:href="http://docs.openstack.org/havana/config-reference/content/"
|
||
><citetitle>OpenStack Configuration
|
||
Reference</citetitle></link>.</para>
|
||
<para>Compute makes a distinction between <emphasis role="italic"
|
||
>fixed IPs</emphasis> and <emphasis role="italic">floating
|
||
IPs</emphasis> for VM instances. Fixed IPs are IP addresses
|
||
that are assigned to an instance on creation and stay the same
|
||
until the instance is explicitly terminated. By contrast,
|
||
floating IPs are addresses that can be dynamically associated
|
||
with an instance. A floating IP address can be disassociated and
|
||
associated with another instance at any time. A user can reserve
|
||
a floating IP for their project.</para>
|
||
<para>In <emphasis role="bold">Flat Mode</emphasis>, a network
|
||
administrator specifies a subnet. The IP addresses for VM
|
||
instances are grabbed from the subnet, and then injected into
|
||
the image on launch. Each instance receives a fixed IP address
|
||
from the pool of available addresses. A system administrator may
|
||
create the Linux networking bridge (typically named
|
||
<literal>br100</literal>, although this configurable) on the
|
||
systems running the <systemitem class="service"
|
||
>nova-network</systemitem> service. All instances of the
|
||
system are attached to the same bridge, configured manually by
|
||
the network administrator.</para>
|
||
<para>
|
||
<note>
|
||
<para>The configuration injection currently only works on
|
||
Linux-style systems that keep networking configuration
|
||
in <filename>/etc/network/interfaces</filename>.</para>
|
||
</note>
|
||
</para>
|
||
<para>In <emphasis role="bold">Flat DHCP Mode</emphasis>, OpenStack
|
||
starts a DHCP server (dnsmasq) to pass out IP addresses to VM
|
||
instances from the specified subnet in addition to manually
|
||
configuring the networking bridge. IP addresses for VM instances
|
||
are grabbed from a subnet specified by the network
|
||
administrator.</para>
|
||
<para>Like Flat Mode, all instances are attached to a single bridge
|
||
on the compute node. In addition a DHCP server is running to
|
||
configure instances (depending on single-/multi-host mode,
|
||
alongside each <systemitem class="service"
|
||
>nova-network</systemitem>). In this mode, Compute does a
|
||
bit more configuration in that it attempts to bridge into an
|
||
ethernet device (<literal>flat_interface</literal>, eth0 by
|
||
default). It also runs and configures dnsmasq as a DHCP server
|
||
listening on this bridge, usually on IP address 10.0.0.1 (see
|
||
<link linkend="section_dnsmasq">DHCP server:
|
||
dnsmasq</link>). For every instance, nova allocates a fixed IP
|
||
address and configure dnsmasq with the MAC/IP pair for the VM.
|
||
For example, dnsmasq doesn't take part in the IP address
|
||
allocation process, it only hands out IPs according to the
|
||
mapping done by nova. Instances receive their fixed IPs by doing
|
||
a dhcpdiscover. These IPs are <emphasis role="italic"
|
||
>not</emphasis> assigned to any of the host's network
|
||
interfaces, only to the VM's guest-side interface.</para>
|
||
<para>In any setup with flat networking, the host(-s) with
|
||
nova-network on it is (are) responsible for forwarding traffic
|
||
from the private network. Compute can determine the NAT entries
|
||
for each network, though sometimes NAT is not used, such as when
|
||
configured with all public IPs or a hardware router is used (one
|
||
of the HA options). Such host(-s) needs to have
|
||
<literal>br100</literal> configured and physically connected
|
||
to any other nodes that are hosting VMs. You must set the
|
||
<literal>flat_network_bridge</literal> option or create
|
||
networks with the bridge parameter in order to avoid raising an
|
||
error. Compute nodes have iptables/ebtables entries created for
|
||
each project and instance to protect against IP/MAC address
|
||
spoofing and ARP poisoning.</para>
|
||
<note>
|
||
<para>In single-host Flat DHCP mode you <emphasis role="italic"
|
||
>will</emphasis> be able to ping VMs through their fixed
|
||
IP from the nova-network node, but you <emphasis
|
||
role="italic">cannot</emphasis> ping them from the
|
||
compute nodes. This is expected behavior.</para>
|
||
</note>
|
||
<para><emphasis role="bold">VLAN Network Mode is the default
|
||
mode</emphasis> for OpenStack Compute. In this mode, Compute
|
||
creates a VLAN and bridge for each project. For multiple machine
|
||
installation, the VLAN Network Mode requires a switch that
|
||
supports VLAN tagging (IEEE 802.1Q). The project gets a range of
|
||
private IPs that are only accessible from inside the VLAN. In
|
||
order for a user to access the instances in their project, a
|
||
special VPN instance (code named cloudpipe) needs to be created.
|
||
Compute generates a certificate and key for the user to access
|
||
the VPN and starts the VPN automatically. It provides a private
|
||
network segment for each project's instances that can be
|
||
accessed through a dedicated VPN connection from the Internet.
|
||
In this mode, each project gets its own VLAN, Linux networking
|
||
bridge, and subnet.</para>
|
||
|
||
<para>The subnets are specified by the network administrator, and
|
||
are assigned dynamically to a project when required. A DHCP
|
||
Server is started for each VLAN to pass out IP addresses to VM
|
||
instances from the subnet assigned to the project. All instances
|
||
belonging to one project are bridged into the same VLAN for that
|
||
project. OpenStack Compute creates the Linux networking bridges
|
||
and VLANs when required.</para>
|
||
</section>
|
||
<section xml:id="section_dnsmasq">
|
||
<title>DHCP server: dnsmasq</title>
|
||
<para>The Compute service uses <link
|
||
xlink:href="http://www.thekelleys.org.uk/dnsmasq/doc.html"
|
||
>dnsmasq</link> as the DHCP server when running
|
||
with either that Flat DHCP Network Manager or the VLAN
|
||
Network Manager. The <systemitem class="service"
|
||
>nova-network</systemitem> service is responsible
|
||
for starting up dnsmasq processes.</para>
|
||
<para>The behavior of dnsmasq can be customized by
|
||
creating a dnsmasq configuration file. Specify the
|
||
config file using the
|
||
<literal>dnsmasq_config_file</literal>
|
||
configuration option. For example:
|
||
<programlisting language="ini">dnsmasq_config_file=/etc/dnsmasq-nova.conf</programlisting>
|
||
See the <link
|
||
xlink:href="http://docs.openstack.org/havana/config-reference/content/"
|
||
><citetitle> OpenStack Configuration
|
||
Reference</citetitle></link> for an example of
|
||
how to change the behavior of dnsmasq using a dnsmasq
|
||
configuration file. The dnsmasq documentation has a
|
||
more comprehensive <link
|
||
xlink:href="http://www.thekelleys.org.uk/dnsmasq/docs/dnsmasq.conf.example"
|
||
>dnsmasq configuration file example</link>.</para>
|
||
<para>Dnsmasq also acts as a caching DNS server for
|
||
instances. You can explicitly specify the DNS server
|
||
that dnsmasq should use by setting the
|
||
<literal>dns_server</literal> configuration option
|
||
in <filename>/etc/nova/nova.conf</filename>. The
|
||
following example would configure dnsmasq to use
|
||
Google's public DNS server:
|
||
<programlisting language="ini">dns_server=8.8.8.8</programlisting></para>
|
||
<para>Dnsmasq logging output goes to the syslog (typically
|
||
<filename>/var/log/syslog</filename> or
|
||
<filename>/var/log/messages</filename>, depending
|
||
on Linux distribution). The dnsmasq logging output can
|
||
be useful for troubleshooting if VM instances boot
|
||
successfully but are not reachable over the
|
||
network.</para>
|
||
<para>A network administrator can run <code>nova-manage
|
||
fixed reserve
|
||
--address=<replaceable>x.x.x.x</replaceable></code>
|
||
to specify the starting point IP address (x.x.x.x) to
|
||
reserve with the DHCP server. This reservation only
|
||
affects which IP address the VMs start at, not the
|
||
fixed IP addresses that the <systemitem
|
||
class="service">nova-network</systemitem> service
|
||
places on the bridges.</para>
|
||
</section>
|
||
<section xml:id="section_metadata-service">
|
||
<title>Metadata service</title>
|
||
<simplesect>
|
||
<title>Introduction</title>
|
||
<para>The Compute service uses a special metadata
|
||
service to enable virtual machine instances to
|
||
retrieve instance-specific data. Instances access
|
||
the metadata service at
|
||
<literal>http://169.254.169.254</literal>. The
|
||
metadata service supports two sets of APIs: an
|
||
OpenStack metadata API and an EC2-compatible API.
|
||
Each of the APIs is versioned by date.</para>
|
||
<para>To retrieve a list of supported versions for the
|
||
OpenStack metadata API, make a GET request to
|
||
<programlisting>http://169.254.169.254/openstack</programlisting>
|
||
For example:</para>
|
||
<para><screen><prompt>$</prompt> <userinput>curl http://169.254.169.254/openstack</userinput>
|
||
<computeroutput>2012-08-10
|
||
latest</computeroutput></screen>
|
||
To retrieve a list of supported versions for the
|
||
EC2-compatible metadata API, make a GET request to
|
||
<programlisting>http://169.254.169.254</programlisting></para>
|
||
<para>For example:</para>
|
||
<screen><prompt>$</prompt> <userinput>curl http://169.254.169.254</userinput>
|
||
<computeroutput>1.0
|
||
2007-01-19
|
||
2007-03-01
|
||
2007-08-29
|
||
2007-10-10
|
||
2007-12-15
|
||
2008-02-01
|
||
2008-09-01
|
||
2009-04-04
|
||
latest</computeroutput></screen>
|
||
<para>If you write a consumer for one of these APIs,
|
||
always attempt to access the most recent API
|
||
version supported by your consumer first, then
|
||
fall back to an earlier version if the most recent
|
||
one is not available.</para>
|
||
</simplesect>
|
||
<simplesect>
|
||
<title>OpenStack metadata API</title>
|
||
<para>Metadata from the OpenStack API is distributed
|
||
in JSON format. To retrieve the metadata, make a
|
||
GET request to:</para>
|
||
<programlisting>http://169.254.169.254/openstack/2012-08-10/meta_data.json</programlisting>
|
||
<para>For example:</para>
|
||
<screen><prompt>$</prompt> <userinput>curl http://169.254.169.254/openstack/2012-08-10/meta_data.json</userinput>
|
||
<computeroutput>{"uuid": "d8e02d56-2648-49a3-bf97-6be8f1204f38", "availability_zone": "nova", "hostname": "test.novalocal", "launch_index": 0, "meta": {"priority": "low", "role": "webserver"}, "public_keys": {"mykey": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDYVEprvtYJXVOBN0XNKVVRNCRX6BlnNbI+USLGais1sUWPwtSg7z9K9vhbYAPUZcq8c/s5S9dg5vTHbsiyPCIDOKyeHba4MUJq8Oh5b2i71/3BISpyxTBH/uZDHdslW2a+SrPDCeuMMoss9NFhBdKtDkdG9zyi0ibmCP6yMdEX8Q== Generated by Nova\n"}, "name": "test"}</computeroutput></screen>
|
||
<para>Here is the same content after having run
|
||
through a JSON pretty-printer:</para>
|
||
<programlisting language="json">{
|
||
"availability_zone": "nova",
|
||
"hostname": "test.novalocal",
|
||
"launch_index": 0,
|
||
"meta": {
|
||
"priority": "low",
|
||
"role": "webserver"
|
||
},
|
||
"name": "test",
|
||
"public_keys": {
|
||
"mykey": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDYVEprvtYJXVOBN0XNKVVRNCRX6BlnNbI+USLGais1sUWPwtSg7z9K9vhbYAPUZcq8c/s5S9dg5vTHbsiyPCIDOKyeHba4MUJq8Oh5b2i71/3BISpyxTBH/uZDHdslW2a+SrPDCeuMMoss9NFhBdKtDkdG9zyi0ibmCP6yMdEX8Q== Generated by Nova\n"
|
||
},
|
||
"uuid": "d8e02d56-2648-49a3-bf97-6be8f1204f38"
|
||
}</programlisting>
|
||
<para>Instances also retrieve user data (passed as the
|
||
<literal>user_data</literal> parameter in the
|
||
API call or by the <literal>--user_data</literal>
|
||
flag in the <command>nova boot</command> command)
|
||
through the metadata service, by making a GET
|
||
request to:
|
||
<programlisting>http://169.254.169.254/openstack/2012-08-10/user_data</programlisting>
|
||
For example:</para>
|
||
<para>
|
||
<screen><prompt>$</prompt> <userinput>curl http://169.254.169.254/openstack/2012-08-10/user_data</userinput><computeroutput>#!/bin/bash
|
||
echo 'Extra user data here'</computeroutput></screen>
|
||
</para>
|
||
</simplesect>
|
||
<simplesect>
|
||
<title>EC2 metadata API</title>
|
||
<para>The metadata service has an API that is
|
||
compatible with version 2009-04-04 of the <link
|
||
xlink:href="http://docs.amazonwebservices.com/AWSEC2/2009-04-04/UserGuide/AESDG-chapter-instancedata.html"
|
||
>Amazon EC2 metadata service</link>; virtual
|
||
machine images that are designed for EC2 work
|
||
properly with OpenStack.</para>
|
||
<para>The EC2 API exposes a separate URL for each
|
||
metadata. You can retrieve a listing of these
|
||
elements by making a GET query to:</para>
|
||
<programlisting>http://169.254.169.254/2009-04-04/meta-data/</programlisting>
|
||
<para>For example:</para>
|
||
<screen><prompt>$</prompt> <userinput>curl http://169.254.169.254/2009-04-04/meta-data/</userinput><computeroutput>ami-id
|
||
ami-launch-index
|
||
ami-manifest-path
|
||
block-device-mapping/
|
||
hostname
|
||
instance-action
|
||
instance-id
|
||
instance-type
|
||
kernel-id
|
||
local-hostname
|
||
local-ipv4
|
||
placement/
|
||
public-hostname
|
||
public-ipv4
|
||
public-keys/
|
||
ramdisk-id
|
||
reservation-id
|
||
security-groups</computeroutput></screen>
|
||
<screen><prompt>$</prompt> <userinput>curl http://169.254.169.254/2009-04-04/meta-data/block-device-mapping/</userinput><computeroutput>ami</computeroutput></screen>
|
||
<screen><prompt>$</prompt> <userinput>curl http://169.254.169.254/2009-04-04/meta-data/placement/</userinput>
|
||
<computeroutput>availability-zone</computeroutput></screen>
|
||
<screen><prompt>$</prompt> <userinput>curl http://169.254.169.254/2009-04-04/meta-data/public-keys/</userinput>
|
||
<computeroutput>0=mykey</computeroutput></screen>
|
||
<para>Instances can retrieve the public SSH key
|
||
(identified by keypair name when a user requests a
|
||
new instance) by making a GET request to:</para>
|
||
<programlisting>http://169.254.169.254/2009-04-04/meta-data/public-keys/0/openssh-key</programlisting>
|
||
<para>For example:</para>
|
||
<screen><prompt>$</prompt> <userinput>curl http://169.254.169.254/2009-04-04/meta-data/public-keys/0/openssh-key</userinput>
|
||
<computeroutput>ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDYVEprvtYJXVOBN0XNKVVRNCRX6BlnNbI+USLGais1sUWPwtSg7z9K9vhbYAPUZcq8c/s5S9dg5vTHbsiyPCIDOKyeHba4MUJq8Oh5b2i71/3BISpyxTBH/uZDHdslW2a+SrPDCeuMMoss9NFhBdKtDkdG9zyi0ibmCP6yMdEX8Q== Generated by Nova</computeroutput></screen>
|
||
<para>Instances can retrieve user data by making a GET
|
||
request to:</para>
|
||
<programlisting>http://169.254.169.254/2009-04-04/user-data</programlisting>
|
||
<para>For example:</para>
|
||
<screen><prompt>$</prompt> <userinput>curl http://169.254.169.254/2009-04-04/user-data</userinput>
|
||
<computeroutput>#!/bin/bash
|
||
echo 'Extra user data here'</computeroutput></screen>
|
||
</simplesect>
|
||
<simplesect>
|
||
<title>Run the metadata service</title>
|
||
<para>The metadata service is implemented by either
|
||
the <systemitem class="service"
|
||
>nova-api</systemitem> service or the
|
||
<systemitem class="service"
|
||
>nova-api-metadata</systemitem> service. (The
|
||
<systemitem class="service"
|
||
>nova-api-metadata</systemitem> service is
|
||
generally only used when running in multi-host
|
||
mode, see the <link
|
||
xlink:href="http://docs.openstack.org/havana/config-reference/content/"
|
||
><citetitle>OpenStack Configuration
|
||
Reference</citetitle></link> for details).
|
||
If you are running the <systemitem class="service"
|
||
>nova-api</systemitem> service, you must have
|
||
<literal>metadata</literal> as one of the
|
||
elements of the list of the
|
||
<literal>enabled_apis</literal> configuration
|
||
option in
|
||
<filename>/etc/nova/nova.conf</filename>. The
|
||
default <literal>enabled_apis</literal>
|
||
configuration setting includes the metadata
|
||
service, so you should not need to modify
|
||
it.</para>
|
||
<para>To enable instances to reach the metadata
|
||
service, the <systemitem class="service"
|
||
>nova-network</systemitem> service configures
|
||
iptables to NAT port <literal>80</literal> of the
|
||
<literal>169.254.169.254</literal> address to
|
||
the IP address specified in
|
||
<option>metadata_host</option> (default
|
||
<literal>$my_ip</literal>, which is the IP
|
||
address of the <systemitem class="service"
|
||
>nova-network</systemitem> service) and port
|
||
specified in <option>metadata_port</option>
|
||
(default <literal>8775</literal>) in
|
||
<filename>/etc/nova/nova.conf</filename>.</para>
|
||
<warning>
|
||
<para>The <literal>metadata_host</literal>
|
||
configuration option must be an IP address,
|
||
not a host name.</para>
|
||
</warning>
|
||
<note>
|
||
<para>The default Compute service settings assume
|
||
that the <systemitem class="service"
|
||
>nova-network</systemitem> service and the
|
||
<systemitem class="service"
|
||
>nova-api</systemitem> service are running
|
||
on the same host. If this is not the case, you
|
||
must make this change in the
|
||
<filename>/etc/nova/nova.conf</filename>
|
||
file on the host running the <systemitem
|
||
class="service">nova-network</systemitem>
|
||
service:</para>
|
||
<para>Set the <literal>metadata_host</literal>
|
||
configuration option to the IP address of the
|
||
host where the <systemitem class="service"
|
||
>nova-api</systemitem> service
|
||
runs.</para>
|
||
</note>
|
||
<xi:include href="../common/tables/nova-metadata.xml"
|
||
/>
|
||
</simplesect>
|
||
</section>
|
||
<section xml:id="section_enable-ping-and-ssh-on-vms">
|
||
<title>Enable ping and SSH on VMs</title>
|
||
<para>Be sure you enable access to your VMs by using the
|
||
<command>euca-authorize</command> or <command>nova
|
||
secgroup-add-rule</command> command. These
|
||
commands enable you to <command>ping</command> and
|
||
<command>ssh</command> to your VMs:</para>
|
||
<note>
|
||
<para>You must run these commands as root only if the
|
||
credentials used to interact with <systemitem
|
||
class="service">nova-api</systemitem> are in
|
||
<filename>/root/.bashrc</filename>. If the EC2
|
||
credentials are the <filename>.bashrc</filename>
|
||
file for another user, you must run these commands
|
||
as the user.</para>
|
||
</note>
|
||
<para>Run <command>nova</command> commands:</para>
|
||
<screen><prompt>$</prompt> <userinput>nova secgroup-add-rule default icmp -1 -1 0.0.0.0/0</userinput>
|
||
<prompt>$</prompt> <userinput>nova secgroup-add-rule default tcp 22 22 0.0.0.0/0</userinput> </screen>
|
||
<para>Using euca2ools:</para>
|
||
<screen><prompt>$</prompt> <userinput>euca-authorize -P icmp -t -1:-1 -s 0.0.0.0/0 default</userinput>
|
||
<prompt>$</prompt> <userinput>euca-authorize -P tcp -p 22 -s 0.0.0.0/0 default</userinput> </screen>
|
||
<para>If you still cannot ping or SSH your instances after
|
||
issuing the <command>nova secgroup-add-rule</command>
|
||
commands, look at the number of
|
||
<literal>dnsmasq</literal> processes that are
|
||
running. If you have a running instance, check to see
|
||
that TWO <literal>dnsmasq</literal> processes are
|
||
running. If not, perform this as root:</para>
|
||
<screen><prompt>#</prompt> <userinput>killall dnsmasq</userinput>
|
||
<prompt>#</prompt> <userinput>service nova-network restart</userinput> </screen>
|
||
</section>
|
||
<section xml:id="section_remove-network-from-project">
|
||
<title>Remove a network from a project</title>
|
||
<para>You cannot remove a network that has already been
|
||
associated to a project by simply deleting it.</para>
|
||
<para>To determine the project ID you must have admin
|
||
rights. You can disassociate the project from the
|
||
network with a scrub command and the project ID as the
|
||
final parameter:</para>
|
||
<screen><prompt>$</prompt> <userinput>nova-manage project scrub --project=<replaceable><id></replaceable></userinput> </screen>
|
||
</section>
|
||
<section xml:id="section_use-multi-nics">
|
||
<title>Multiple interfaces for your instances
|
||
(multinic)</title>
|
||
<?dbhtml stop-chunking?>
|
||
<para>The multi-nic feature allows you to plug more than
|
||
one interface to your instances, making it possible to
|
||
make several use cases available: <itemizedlist>
|
||
<listitem>
|
||
<para>SSL Configurations (VIPs)</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>Services failover/ HA</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>Bandwidth Allocation</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>Administrative/ Public access to your
|
||
instances</para>
|
||
</listitem>
|
||
</itemizedlist> Each VIF is representative of a
|
||
separate network with its own IP block. Every network
|
||
mode introduces it's own set of changes regarding the
|
||
mulitnic usage: <figure>
|
||
<title>multinic flat manager</title>
|
||
<mediaobject>
|
||
<imageobject>
|
||
<imagedata scale="40"
|
||
fileref="../common/figures/SCH_5007_V00_NUAC-multi_nic_OpenStack-Flat-manager.jpg"
|
||
/>
|
||
</imageobject>
|
||
</mediaobject>
|
||
</figure>
|
||
<figure>
|
||
<title>multinic flatdhcp manager</title>
|
||
<mediaobject>
|
||
<imageobject>
|
||
<imagedata scale="40"
|
||
fileref="../common/figures/SCH_5007_V00_NUAC-multi_nic_OpenStack-Flat-DHCP-manager.jpg"
|
||
/>
|
||
</imageobject>
|
||
</mediaobject>
|
||
</figure>
|
||
<figure>
|
||
<title>multinic VLAN manager</title>
|
||
<mediaobject>
|
||
<imageobject>
|
||
<imagedata scale="40"
|
||
fileref="../common/figures/SCH_5007_V00_NUAC-multi_nic_OpenStack-VLAN-manager.jpg"
|
||
/>
|
||
</imageobject>
|
||
</mediaobject>
|
||
</figure>
|
||
</para>
|
||
<section xml:id="using-multiple-nics-usage">
|
||
<title>Use the multinic feature</title>
|
||
<para>In order to use the multinic feature, first
|
||
create two networks, and attach them to your
|
||
project:
|
||
<screen><prompt>$</prompt> <userinput>nova network-create first-net --fixed-range-v4=20.20.0.0/24 --project-id=$your-project</userinput>
|
||
<prompt>$</prompt> <userinput>nova network-create second-net --fixed-range-v4=20.20.10.0/24 --project-id=$your-project</userinput> </screen>
|
||
Now every time you spawn a new instance, it gets
|
||
two IP addresses from the respective DHCP servers: <screen><prompt>$</prompt> <userinput>nova list</userinput>
|
||
<computeroutput>+-----+------------+--------+----------------------------------------+
|
||
| ID | Name | Status | Networks |
|
||
+-----+------------+--------+----------------------------------------+
|
||
| 124 | Server 124 | ACTIVE | network2=20.20.0.3; private=20.20.10.14|
|
||
+-----+------------+--------+----------------------------------------+</computeroutput></screen>
|
||
<note>
|
||
<para>Make sure to power up the second
|
||
interface on the instance, otherwise that
|
||
last won't be reachable through its second
|
||
IP. Here is an example of how to setup the
|
||
interfaces within the instance (this is
|
||
the configuration that needs to be applied
|
||
inside the image):</para>
|
||
<para><filename>/etc/network/interfaces</filename>
|
||
<programlisting># The loopback network interface
|
||
auto lo
|
||
iface lo inet loopback
|
||
|
||
auto eth0
|
||
iface eth0 inet dhcp
|
||
|
||
auto eth1
|
||
iface eth1 inet dhcp</programlisting></para>
|
||
</note></para>
|
||
<note>
|
||
<para>If the Virtual Network Service Neutron is
|
||
installed, it is possible to specify the
|
||
networks to attach to the respective
|
||
interfaces by using the
|
||
<literal>--nic</literal> flag when
|
||
invoking the <literal>nova</literal> command:
|
||
<screen><prompt>$</prompt> <userinput>nova boot --image ed8b2a37-5535-4a5f-a615-443513036d71 --flavor 1 --nic net-id= <id of first network> --nic net-id= <id of first network> test-vm1</userinput></screen>
|
||
</para>
|
||
</note>
|
||
</section>
|
||
</section>
|
||
<section xml:id="section_network-troubleshoot">
|
||
<title>Troubleshoot Networking</title>
|
||
<simplesect>
|
||
<title>Cannot reach floating IPs</title>
|
||
<para>If you cannot reach your instances through the
|
||
floating IP address, make sure the default
|
||
security group allows ICMP (ping) and SSH (port
|
||
22), so that you can reach the instances:</para>
|
||
<screen><prompt>$</prompt> <userinput>nova secgroup-list-rules default</userinput>
|
||
<computeroutput>+-------------+-----------+---------+-----------+--------------+
|
||
| IP Protocol | From Port | To Port | IP Range | Source Group |
|
||
+-------------+-----------+---------+-----------+--------------+
|
||
| icmp | -1 | -1 | 0.0.0.0/0 | |
|
||
| tcp | 22 | 22 | 0.0.0.0/0 | |
|
||
+-------------+-----------+---------+-----------+--------------+</computeroutput> </screen>
|
||
<para>Ensure the NAT rules have been added to iptables
|
||
on the node that nova-network is running on, as
|
||
root:</para>
|
||
<screen><prompt>#</prompt> <userinput>iptables -L -nv</userinput>
|
||
<computeroutput>-A nova-network-OUTPUT -d 68.99.26.170/32 -j DNAT --to-destination 10.0.0.3</computeroutput></screen>
|
||
<screen><prompt>#</prompt> <userinput>iptables -L -nv -t nat</userinput>
|
||
<computeroutput>-A nova-network-PREROUTING -d 68.99.26.170/32 -j DNAT --to-destination10.0.0.3
|
||
-A nova-network-floating-snat -s 10.0.0.3/32 -j SNAT --to-source 68.99.26.170</computeroutput></screen>
|
||
<para>Check that the public address, in this example
|
||
"68.99.26.170", has been added to your public
|
||
interface: You should see the address in the
|
||
listing when you enter "ip addr" at the command
|
||
prompt.</para>
|
||
<screen><prompt>$</prompt> <userinput>ip addr</userinput>
|
||
<computeroutput>2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
|
||
link/ether xx:xx:xx:17:4b:c2 brd ff:ff:ff:ff:ff:ff
|
||
inet 13.22.194.80/24 brd 13.22.194.255 scope global eth0
|
||
inet 68.99.26.170/32 scope global eth0
|
||
inet6 fe80::82b:2bf:fe1:4b2/64 scope link
|
||
valid_lft forever preferred_lft forever</computeroutput></screen>
|
||
<para>Note that you cannot SSH to an instance with a
|
||
public IP from within the same server as the
|
||
routing configuration won't allow it.</para>
|
||
<para>You can use <command>tcpdump</command> to
|
||
identify if packets are being routed to the
|
||
inbound interface on the compute host. If the
|
||
packets are reaching the compute hosts but the
|
||
connection is failing, the issue may be that the
|
||
packet is being dropped by reverse path filtering.
|
||
Try disabling reverse path filtering on the
|
||
inbound interface. For example, if the inbound
|
||
interface is <literal>eth2</literal>, as
|
||
root:</para>
|
||
<screen><prompt>#</prompt> <userinput>sysctl -w net.ipv4.conf.<replaceable>eth2</replaceable>.rp_filter=0</userinput></screen>
|
||
<para>If this solves your issue, add this line to
|
||
<filename>/etc/sysctl.conf</filename> so that
|
||
the reverse path filter is disabled the next time
|
||
the compute host reboots:
|
||
<programlisting language="ini">net.ipv4.conf.rp_filter=0</programlisting></para>
|
||
</simplesect>
|
||
<simplesect>
|
||
<title>Disable firewall</title>
|
||
<para>To help debug networking issues with reaching
|
||
VMs, you can disable the firewall by setting the
|
||
following option in
|
||
<filename>/etc/nova/nova.conf</filename>:</para>
|
||
<programlisting language="ini">firewall_driver=nova.virt.firewall.NoopFirewallDriver</programlisting>
|
||
<para>We strongly recommend you remove this line to
|
||
re-enable the firewall once your networking issues
|
||
have been resolved.</para>
|
||
</simplesect>
|
||
<simplesect>
|
||
<title>Packet loss from instances to nova-network
|
||
server (VLANManager mode)</title>
|
||
<para>If you can SSH to your instances but you find
|
||
that the network interactions to your instance is
|
||
slow, or if you find that running certain
|
||
operations are slower than they should be (for
|
||
example, <command>sudo</command>), then there may
|
||
be packet loss occurring on the connection to the
|
||
instance.</para>
|
||
<para>Packet loss can be caused by Linux networking
|
||
configuration settings related to bridges. Certain
|
||
settings can cause packets to be dropped between
|
||
the VLAN interface (for example,
|
||
<literal>vlan100</literal>) and the associated
|
||
bridge interface (for example,
|
||
<literal>br100</literal>) on the host running
|
||
the <systemitem class="service"
|
||
>nova-network</systemitem> service.</para>
|
||
<para>One way to check if this is the issue in your
|
||
setup is to open up three terminals and run the
|
||
following commands:</para>
|
||
<para>In the first terminal, on the host running
|
||
nova-network, use <command>tcpdump</command> to
|
||
monitor DNS-related traffic (UDP, port 53) on the
|
||
VLAN interface. As root:</para>
|
||
<screen><prompt>#</prompt> <userinput>tcpdump -K -p -i vlan100 -v -vv udp port 53</userinput></screen>
|
||
<para>In the second terminal, also on the host running
|
||
nova-network, use <command>tcpdump</command> to
|
||
monitor DNS-related traffic on the bridge
|
||
interface. As root:</para>
|
||
<screen><prompt>#</prompt> <userinput>tcpdump -K -p -i br100 -v -vv udp port 53</userinput></screen>
|
||
<para>In the third terminal, SSH inside of the
|
||
instance and generate DNS requests by using the
|
||
<command>nslookup</command> command:</para>
|
||
<screen><prompt>$</prompt> <userinput>nslookup www.google.com</userinput></screen>
|
||
<para>The symptoms may be intermittent, so try running
|
||
<command>nslookup</command> multiple times. If
|
||
the network configuration is correct, the command
|
||
should return immediately each time. If it is not
|
||
functioning properly, the command hangs for
|
||
several seconds.</para>
|
||
<para>If the <command>nslookup</command> command
|
||
sometimes hangs, and there are packets that appear
|
||
in the first terminal but not the second, then the
|
||
problem may be due to filtering done on the
|
||
bridges. Try to disable filtering, as root:</para>
|
||
<screen><prompt>#</prompt> <userinput>sysctl -w net.bridge.bridge-nf-call-arptables=0</userinput>
|
||
<prompt>#</prompt> <userinput>sysctl -w net.bridge.bridge-nf-call-iptables=0</userinput>
|
||
<prompt>#</prompt> <userinput>sysctl -w net.bridge.bridge-nf-call-ip6tables=0</userinput></screen>
|
||
<para>If this solves your issue, add this line to
|
||
<filename>/etc/sysctl.conf</filename> so that
|
||
these changes take effect the next time the host
|
||
reboots:</para>
|
||
<programlisting language="ini">net.bridge.bridge-nf-call-arptables=0
|
||
net.bridge.bridge-nf-call-iptables=0
|
||
net.bridge.bridge-nf-call-ip6tables=0</programlisting>
|
||
</simplesect>
|
||
<simplesect>
|
||
<title>KVM: Network connectivity works initially, then
|
||
fails</title>
|
||
<para>Some administrators have observed an issue with
|
||
the KVM hypervisor where instances running Ubuntu
|
||
12.04 sometimes loses network connectivity after
|
||
functioning properly for a period of time. Some
|
||
users have reported success with loading the
|
||
vhost_net kernel module as a workaround for this
|
||
issue (see <link
|
||
xlink:href="https://bugs.launchpad.net/ubuntu/+source/libvirt/+bug/997978/"
|
||
>bug #997978</link>) . This kernel module may
|
||
also <link
|
||
xlink:href="http://www.linux-kvm.org/page/VhostNet"
|
||
>improve network performance on KVM</link>. To
|
||
load the kernel module, as root:</para>
|
||
<screen><prompt>#</prompt> <userinput>modprobe vhost_net</userinput></screen>
|
||
<note>
|
||
<para>Loading the module has no effect on running
|
||
instances.</para>
|
||
</note>
|
||
</simplesect>
|
||
</section>
|
||
</section>
|
||
<section xml:id="section_block-storage-volumes">
|
||
<title>Volumes</title>
|
||
<para>The Block Storage Service provides persistent block
|
||
storage resources that OpenStack Compute instances can
|
||
consume.</para>
|
||
<para>See the <citetitle>OpenStack Configuration
|
||
Reference</citetitle> for information about
|
||
configuring volume drivers and creating and attaching
|
||
volumes to server instances.</para>
|
||
</section>
|
||
<section xml:id="section_compute-system-admin">
|
||
<title>System administration</title>
|
||
<para>By understanding how the different installed nodes
|
||
interact with each other you can administer the Compute
|
||
installation. Compute offers many ways to install using
|
||
multiple servers but the general idea is that you can have
|
||
multiple compute nodes that control the virtual servers
|
||
and a cloud controller node that contains the remaining
|
||
Compute services.</para>
|
||
<para>The Compute cloud works through the interaction of a
|
||
series of daemon processes named nova-* that reside
|
||
persistently on the host machine or machines. These
|
||
binaries can all run on the same machine or be spread out
|
||
on multiple boxes in a large deployment. The
|
||
responsibilities of Services, Managers, and Drivers, can
|
||
be a bit confusing at first. Here is an outline the
|
||
division of responsibilities to make understanding the
|
||
system a little bit easier.</para>
|
||
<para>Currently, Services are <systemitem class="service"
|
||
>nova-api</systemitem>, <systemitem class="service"
|
||
>nova-objectstore</systemitem> (which can be replaced
|
||
with Glance, the OpenStack Image Service), <systemitem
|
||
class="service">nova-compute</systemitem>, and
|
||
<systemitem class="service">nova-network</systemitem>.
|
||
Managers and Drivers are specified by configuration
|
||
options and loaded using utils.load_object(). Managers are
|
||
responsible for a certain aspect of the system. It is a
|
||
logical grouping of code relating to a portion of the
|
||
system. In general other components should be using the
|
||
manager to make changes to the components that it is
|
||
responsible for.</para>
|
||
<itemizedlist>
|
||
<listitem>
|
||
<para><systemitem class="service"
|
||
>nova-api</systemitem>. Receives xml requests
|
||
and sends them to the rest of the system. It is a
|
||
wsgi app that routes and authenticate requests. It
|
||
supports the EC2 and OpenStack APIs. There is a
|
||
<filename>nova-api.conf</filename> file
|
||
created when you install Compute.</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para><systemitem class="service"
|
||
>nova-objectstore</systemitem>: The
|
||
<systemitem class="service"
|
||
>nova-objectstore</systemitem> service is an
|
||
ultra simple file-based storage system for images
|
||
that replicates most of the S3 API. It can be
|
||
replaced with OpenStack Image Service and a simple
|
||
image manager or use OpenStack Object Storage as
|
||
the virtual machine image storage facility. It
|
||
must reside on the same node as <systemitem
|
||
class="service"
|
||
>nova-compute</systemitem>.</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para><systemitem class="service"
|
||
>nova-compute</systemitem>. Responsible for
|
||
managing virtual machines. It loads a Service
|
||
object which exposes the public methods on
|
||
ComputeManager through Remote Procedure Call
|
||
(RPC).</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para><systemitem class="service"
|
||
>nova-network</systemitem>. Responsible for
|
||
managing floating and fixed IPs, DHCP, bridging
|
||
and VLANs. It loads a Service object which exposes
|
||
the public methods on one of the subclasses of
|
||
NetworkManager. Different networking strategies
|
||
are available to the service by changing the
|
||
network_manager configuration option to
|
||
FlatManager, FlatDHCPManager, or VlanManager
|
||
(default is VLAN if no other is specified).</para>
|
||
</listitem>
|
||
</itemizedlist>
|
||
<section xml:id="section_compute-service-arch">
|
||
<title>Compute service architecture</title>
|
||
<para>These basic categories describe the service
|
||
architecture and what's going on within the cloud
|
||
controller.</para>
|
||
<simplesect>
|
||
<title>API server</title>
|
||
<para>At the heart of the cloud framework is an API
|
||
server. This API server makes command and control
|
||
of the hypervisor, storage, and networking
|
||
programmatically available to users in realization
|
||
of the definition of cloud computing.</para>
|
||
<para>The API endpoints are basic HTTP web services
|
||
which handle authentication, authorization, and
|
||
basic command and control functions using various
|
||
API interfaces under the Amazon, Rackspace, and
|
||
related models. This enables API compatibility
|
||
with multiple existing tool sets created for
|
||
interaction with offerings from other vendors.
|
||
This broad compatibility prevents vendor
|
||
lock-in.</para>
|
||
</simplesect>
|
||
<simplesect>
|
||
<title>Message queue</title>
|
||
<para>A messaging queue brokers the interaction
|
||
between compute nodes (processing), the networking
|
||
controllers (software which controls network
|
||
infrastructure), API endpoints, the scheduler
|
||
(determines which physical hardware to allocate to
|
||
a virtual resource), and similar components.
|
||
Communication to and from the cloud controller is
|
||
by HTTP requests through multiple API
|
||
endpoints.</para>
|
||
<para>A typical message passing event begins with the
|
||
API server receiving a request from a user. The
|
||
API server authenticates the user and ensures that
|
||
the user is permitted to issue the subject
|
||
command. Availability of objects implicated in the
|
||
request is evaluated and, if available, the
|
||
request is routed to the queuing engine for the
|
||
relevant workers. Workers continually listen to
|
||
the queue based on their role, and occasionally
|
||
their type host name. When such listening produces
|
||
a work request, the worker takes assignment of the
|
||
task and begins its execution. Upon completion, a
|
||
response is dispatched to the queue which is
|
||
received by the API server and relayed to the
|
||
originating user. Database entries are queried,
|
||
added, or removed as necessary throughout the
|
||
process.</para>
|
||
</simplesect>
|
||
<simplesect>
|
||
<title>Compute worker</title>
|
||
<para>Compute workers manage computing instances on
|
||
host machines. The API dispatches commands to
|
||
compute workers to complete these tasks:</para>
|
||
<itemizedlist>
|
||
<listitem>
|
||
<para>Run instances</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>Terminate instances</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>Reboot instances</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>Attach volumes</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>Detach volumes</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>Get console output</para>
|
||
</listitem>
|
||
</itemizedlist>
|
||
</simplesect>
|
||
<simplesect>
|
||
<title>Network Controller</title>
|
||
<para>The Network Controller manages the networking
|
||
resources on host machines. The API server
|
||
dispatches commands through the message queue,
|
||
which are subsequently processed by Network
|
||
Controllers. Specific operations include:</para>
|
||
<itemizedlist>
|
||
<listitem>
|
||
<para>Allocate fixed IP addresses</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>Configuring VLANs for projects</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>Configuring networks for compute
|
||
nodes</para>
|
||
</listitem>
|
||
</itemizedlist>
|
||
</simplesect>
|
||
</section>
|
||
<section xml:id="section_manage-compute-users">
|
||
<title>Manage Compute users</title>
|
||
<para>Access to the Euca2ools (ec2) API is controlled by
|
||
an access and secret key. The user’s access key needs
|
||
to be included in the request, and the request must be
|
||
signed with the secret key. Upon receipt of API
|
||
requests, Compute verifies the signature and runs
|
||
commands on behalf of the user.</para>
|
||
<para>To begin using Compute, you must create a user with
|
||
the Identity Service.</para>
|
||
</section>
|
||
<section xml:id="section_manage-the-cloud">
|
||
<title>Manage the cloud</title>
|
||
<para>A system administrator can use these tools to manage
|
||
a cloud; the nova client, the
|
||
<command>nova-manage</command> command, and the
|
||
<command>Euca2ools</command> commands.</para>
|
||
<para>The <command>nova-manage</command> command can only
|
||
be run by cloud administrators. Both nova client and
|
||
euca2ools can be used by all users, though specific
|
||
commands might be restricted by Role Based Access
|
||
Control in the Identity Service.</para>
|
||
<procedure>
|
||
<title>To use the nova command-line tool</title>
|
||
<step>
|
||
<para>Installing the python-novaclient gives you a
|
||
<code>nova</code> shell command that
|
||
enables Compute API interactions from the
|
||
command line. You install the client, and then
|
||
provide your user name and password, set as
|
||
environment variables for convenience, and
|
||
then you can have the ability to send commands
|
||
to your cloud on the command-line.</para>
|
||
<para>To install python-novaclient, download the
|
||
tarball from <link
|
||
xlink:href="http://pypi.python.org/pypi/python-novaclient/2.6.3#downloads"
|
||
>http://pypi.python.org/pypi/python-novaclient/2.6.3#downloads</link>
|
||
and then install it in your favorite python
|
||
environment.</para>
|
||
<screen><prompt>$</prompt> <userinput>curl -O http://pypi.python.org/packages/source/p/python-novaclient/python-novaclient-2.6.3.tar.gz</userinput>
|
||
<prompt>$</prompt> <userinput>tar -zxvf python-novaclient-2.6.3.tar.gz</userinput>
|
||
<prompt>$</prompt> <userinput>cd python-novaclient-2.6.3</userinput>
|
||
<prompt>$</prompt> <userinput>sudo python setup.py install</userinput></screen>
|
||
</step>
|
||
<step>
|
||
<para>Now that you have installed the
|
||
python-novaclient, confirm the installation by
|
||
entering:</para>
|
||
<screen><prompt>$</prompt> <userinput>nova help</userinput><computeroutput>usage: nova [--debug] [--os-username OS_USERNAME] [--os-password OS_PASSWORD]
|
||
[--os-tenant-name_name OS_TENANT_NAME] [--os-auth-url OS_AUTH_URL]
|
||
[--os-region-name OS_REGION_NAME] [--service-type SERVICE_TYPE]
|
||
[--service-name SERVICE_NAME] [--endpoint-type ENDPOINT_TYPE]
|
||
[--version VERSION]
|
||
<subcommand> ...</computeroutput></screen>
|
||
</step>
|
||
<step>
|
||
<para>This command returns a list of nova commands
|
||
and parameters. Set the required parameters as
|
||
environment variables to make running commands
|
||
easier. You can add
|
||
<parameter>--os-username</parameter>, for
|
||
example, on the nova command, or set it as
|
||
environment variables:</para>
|
||
<screen><prompt>$</prompt> <userinput>export OS_USERNAME=joecool</userinput>
|
||
<prompt>$</prompt> <userinput>export OS_PASSWORD=coolword</userinput>
|
||
<prompt>$</prompt> <userinput>export OS_TENANT_NAME=coolu</userinput> </screen>
|
||
</step>
|
||
<step>
|
||
<para>Using the Identity Service, you are supplied
|
||
with an authentication endpoint, which nova
|
||
recognizes as the
|
||
<literal>OS_AUTH_URL</literal>.</para>
|
||
<para>
|
||
<screen><prompt>$</prompt> <userinput>export OS_AUTH_URL=http://hostname:5000/v2.0</userinput>
|
||
<prompt>$</prompt> <userinput>export NOVA_VERSION=1.1</userinput></screen>
|
||
</para>
|
||
</step>
|
||
</procedure>
|
||
<procedure>
|
||
<title>To use the nova-manage command</title>
|
||
<para>The nova-manage command may be used to perform
|
||
many essential functions for administration and
|
||
ongoing maintenance of nova, such as network
|
||
creation or user manipulation.</para>
|
||
<step>
|
||
<para>The man page for nova-manage has a good
|
||
explanation for each of its functions, and is
|
||
recommended reading for those starting out.
|
||
Access it by running:</para>
|
||
<screen><prompt>$</prompt> <userinput>man nova-manage</userinput> </screen>
|
||
</step>
|
||
<step>
|
||
<para>For administrators, the standard pattern for
|
||
executing a nova-manage command is:</para>
|
||
<screen><prompt>$</prompt> <userinput>nova-manage category command <replaceable>[args]</replaceable></userinput></screen>
|
||
</step>
|
||
<step>
|
||
<para>For example, to obtain a list of all
|
||
projects:</para>
|
||
<screen><prompt>$</prompt> <userinput>nova-manage project list</userinput></screen>
|
||
</step>
|
||
<step>
|
||
<para>Run without arguments to see a list of
|
||
available command categories:</para>
|
||
<screen><prompt>$</prompt> <userinput>nova-manage</userinput></screen>
|
||
</step>
|
||
<step>
|
||
<para>You can also run with a category argument
|
||
such as user to see a list of all commands in
|
||
that category:</para>
|
||
<screen><prompt>$</prompt> <userinput>nova-manage service</userinput></screen>
|
||
</step>
|
||
</procedure>
|
||
<simplesect>
|
||
<title>Use the euca2ools commands</title>
|
||
<para>For a command-line interface to EC2 API calls,
|
||
use the euca2ools command line tool. See <link
|
||
xlink:href="http://open.eucalyptus.com/wiki/Euca2oolsGuide_v1.3"
|
||
>http://open.eucalyptus.com/wiki/Euca2oolsGuide_v1.3</link></para>
|
||
</simplesect>
|
||
</section>
|
||
<xi:include
|
||
href="../common/section_cli_nova_usage_statistics.xml"/>
|
||
<section xml:id="section_manage-logs">
|
||
<title>Manage logs</title>
|
||
<simplesect>
|
||
<title>Logging module</title>
|
||
<para>Add this line to the
|
||
<filename>/etc/nova/nova.conf</filename> file
|
||
to specify a configuration file to change the
|
||
logging behavior. To change the logging level,
|
||
such as <literal>DEBUG</literal>,
|
||
<literal>INFO</literal>,
|
||
<literal>WARNING</literal>,
|
||
<literal>ERROR</literal>):
|
||
<programlisting language="ini">log-config=/etc/nova/logging.conf</programlisting></para>
|
||
<para>The log config file is an ini-style config file
|
||
which must contain a section called
|
||
<literal>logger_nova</literal>, which controls
|
||
the behavior of the logging facility in the
|
||
<literal>nova-*</literal> services. The file
|
||
must contain a section called
|
||
<literal>logger_nova</literal>, for
|
||
example:<programlisting language="ini">[logger_nova]
|
||
level = INFO
|
||
handlers = stderr
|
||
qualname = nova</programlisting></para>
|
||
<para>This example sets the debugging level to
|
||
<literal>INFO</literal> (which less verbose
|
||
than the default <literal>DEBUG</literal>
|
||
setting). See the <link
|
||
xlink:href="http://docs.python.org/release/2.7/library/logging.html#configuration-file-format"
|
||
>Python documentation on logging configuration
|
||
file format </link>for more details on this
|
||
file, including the meaning of the
|
||
<literal>handlers</literal> and
|
||
<literal>quaname</literal> variables. See
|
||
<link
|
||
xlink:href="http://git.openstack.org/cgit/openstack/nova/plain/etc/nova/logging_sample.conf"
|
||
>etc/nova/logging_sample.conf</link> in the
|
||
openstack/nova repository on GitHub for an example
|
||
<filename>logging.conf</filename> file with
|
||
various handlers defined.</para>
|
||
</simplesect>
|
||
<simplesect>
|
||
<title>Syslog</title>
|
||
<para>You can configure OpenStack Compute services to
|
||
send logging information to syslog. This is useful
|
||
if you want to use rsyslog, which forwards the
|
||
logs to a remote machine. You need to separately
|
||
configure the Compute service (Nova), the Identity
|
||
Service (Keystone), the Image Service (Glance),
|
||
and, if you are using it, the Block Storage
|
||
Service (Cinder) to send log messages to syslog.
|
||
To do so, add these lines to:</para>
|
||
<itemizedlist>
|
||
<listitem>
|
||
<para><filename>/etc/nova/nova.conf</filename></para>
|
||
</listitem>
|
||
<listitem>
|
||
<para><filename>/etc/keystone/keystone.conf</filename></para>
|
||
</listitem>
|
||
<listitem>
|
||
<para><filename>/etc/glance/glance-api.conf</filename></para>
|
||
</listitem>
|
||
<listitem>
|
||
<para><filename>/etc/glance/glance-registry.conf</filename></para>
|
||
</listitem>
|
||
<listitem>
|
||
<para><filename>/etc/cinder/cinder.conf</filename></para>
|
||
</listitem>
|
||
</itemizedlist>
|
||
<programlisting language="ini">verbose = False
|
||
debug = False
|
||
use_syslog = True
|
||
syslog_log_facility = LOG_LOCAL0</programlisting>
|
||
<para>In addition to enabling syslog, these settings
|
||
also turn off more verbose output and debugging
|
||
output from the log.<note>
|
||
<para>While the example above uses the same
|
||
local facility for each service
|
||
(<literal>LOG_LOCAL0</literal>, which
|
||
corresponds to syslog facility
|
||
<literal>LOCAL0</literal>), we
|
||
recommend that you configure a separate
|
||
local facility for each service, as this
|
||
provides better isolation and more
|
||
flexibility. For example, you may want to
|
||
capture logging info at different severity
|
||
levels for different services. Syslog
|
||
allows you to define up to seven local
|
||
facilities, <literal>LOCAL0, LOCAL1, ...,
|
||
LOCAL7</literal>. See the syslog
|
||
documentation for more details.</para>
|
||
</note></para>
|
||
</simplesect>
|
||
<simplesect>
|
||
<title>Rsyslog</title>
|
||
<para>Rsyslog is a useful tool for setting up a
|
||
centralized log server across multiple machines.
|
||
We briefly describe the configuration to set up an
|
||
rsyslog server; a full treatment of rsyslog is
|
||
beyond the scope of this document. We assume
|
||
rsyslog has already been installed on your hosts,
|
||
which is the default on most Linux
|
||
distributions.</para>
|
||
<para>This example shows a minimal configuration for
|
||
<filename>/etc/rsyslog.conf</filename> on the
|
||
log server host, which receives the log
|
||
files:</para>
|
||
<programlisting># provides TCP syslog reception
|
||
$ModLoad imtcp
|
||
$InputTCPServerRun 1024</programlisting>
|
||
<para>Add to <filename>/etc/rsyslog.conf</filename> a
|
||
filter rule on which looks for a host name. The
|
||
example below use
|
||
<replaceable>compute-01</replaceable> as an
|
||
example of a compute host
|
||
name:<programlisting>:hostname, isequal, "<replaceable>compute-01</replaceable>" /mnt/rsyslog/logs/compute-01.log</programlisting></para>
|
||
<para>On the compute hosts, create a file named
|
||
<filename>/etc/rsyslog.d/60-nova.conf</filename>,
|
||
with this
|
||
content.<programlisting># prevent debug from dnsmasq with the daemon.none parameter
|
||
*.*;auth,authpriv.none,daemon.none,local0.none -/var/log/syslog
|
||
# Specify a log level of ERROR
|
||
local0.error @@172.20.1.43:1024</programlisting></para>
|
||
<para>Once you have created this file, restart your
|
||
rsyslog daemon. Error-level log messages on the
|
||
compute hosts should now be sent to your log
|
||
server.</para>
|
||
</simplesect>
|
||
</section>
|
||
<xi:include href="section_rootwrap.xml"/>
|
||
<section xml:id="section_live-migration-usage">
|
||
<title>Migration</title>
|
||
<para>Before starting migrations, review the <link
|
||
xlink:href="http://docs.openstack.org/havana/config-reference/content/configuring-openstack-compute-basics.html#section_configuring-compute-migrations"
|
||
>Configure migrations</link> section in
|
||
<citetitle>OpenStack Configuration
|
||
Reference</citetitle>.</para>
|
||
<para>Migration provides a scheme to migrate running
|
||
instances from one OpenStack Compute server to another
|
||
OpenStack Compute server.</para>
|
||
<procedure>
|
||
<title>To migrate instances</title>
|
||
<step>
|
||
<para>Look at the running instances, to get the ID
|
||
of the instance you wish to migrate.</para>
|
||
<screen><prompt>#</prompt> <userinput>nova list</userinput>
|
||
<computeroutput><![CDATA[+--------------------------------------+------+--------+-----------------+
|
||
| ID | Name | Status |Networks |
|
||
+--------------------------------------+------+--------+-----------------+
|
||
| d1df1b5a-70c4-4fed-98b7-423362f2c47c | vm1 | ACTIVE | private=a.b.c.d |
|
||
| d693db9e-a7cf-45ef-a7c9-b3ecb5f22645 | vm2 | ACTIVE | private=e.f.g.h |
|
||
+--------------------------------------+------+--------+-----------------+]]></computeroutput></screen>
|
||
</step>
|
||
<step>
|
||
<para>Look at information associated with that
|
||
instance - our example is vm1 from
|
||
above.</para>
|
||
<screen><prompt>#</prompt> <userinput>nova show d1df1b5a-70c4-4fed-98b7-423362f2c47c</userinput>
|
||
<computeroutput><![CDATA[+-------------------------------------+----------------------------------------------------------+
|
||
| Property | Value |
|
||
+-------------------------------------+----------------------------------------------------------+
|
||
...
|
||
| OS-EXT-SRV-ATTR:host | HostB |
|
||
...
|
||
| flavor | m1.tiny |
|
||
| id | d1df1b5a-70c4-4fed-98b7-423362f2c47c |
|
||
| name | vm1 |
|
||
| private network | a.b.c.d |
|
||
| status | ACTIVE |
|
||
...
|
||
+-------------------------------------+----------------------------------------------------------+]]></computeroutput></screen>
|
||
<para>In this example, vm1 is running on
|
||
HostB.</para>
|
||
</step>
|
||
<step>
|
||
<para>Select the server to migrate instances
|
||
to.</para>
|
||
<screen><prompt>#</prompt> <userinput>nova-manage service list</userinput>
|
||
<computeroutput><![CDATA[HostA nova-scheduler enabled :-) None
|
||
HostA nova-network enabled :-) None
|
||
HostB nova-compute enabled :-) None
|
||
HostC nova-compute enabled :-) None]]></computeroutput></screen>
|
||
<para>In this example, HostC can be picked up
|
||
because <systemitem class="service"
|
||
>nova-compute</systemitem> is running on
|
||
it.</para>
|
||
</step>
|
||
<step>
|
||
<para>Ensure that HostC has enough resource for
|
||
migration.</para>
|
||
<screen><prompt>#</prompt> <userinput>nova-manage service describe_resource HostC</userinput>
|
||
<computeroutput><![CDATA[HOST PROJECT cpu mem(mb) hdd
|
||
HostC(total) 16 32232 878
|
||
HostC(used_now) 13 21284 442
|
||
HostC(used_max) 13 21284 442
|
||
HostC p1 5 10240 150
|
||
HostC p2 5 10240 150
|
||
.....]]></computeroutput></screen>
|
||
<itemizedlist>
|
||
<listitem>
|
||
<para><emphasis role="bold"
|
||
>cpu:</emphasis>the number of
|
||
cpu</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para><emphasis role="bold"
|
||
>mem(mb):</emphasis>total amount of
|
||
memory (MB)</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para><emphasis role="bold"
|
||
>hdd:</emphasis>total amount of
|
||
space for NOVA-INST-DIR/instances
|
||
(GB)</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para><emphasis role="bold">1st line shows
|
||
</emphasis>total amount of resource
|
||
physical server has.</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para><emphasis role="bold">2nd line shows
|
||
</emphasis>current used
|
||
resource.</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para><emphasis role="bold">3rd line shows
|
||
</emphasis>maximum used
|
||
resource.</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para><emphasis role="bold">4th line and
|
||
under</emphasis> shows the resource
|
||
for each project.</para>
|
||
</listitem>
|
||
</itemizedlist>
|
||
</step>
|
||
<step>
|
||
<para>Use the <command>nova
|
||
live-migration</command> command to
|
||
migrate the instances.</para>
|
||
<screen><prompt>#</prompt> <userinput>nova live-migration d1df1b5a-70c4-4fed-98b7-423362f2c47c HostC</userinput><computeroutput><![CDATA[Migration of d1df1b5a-70c4-4fed-98b7-423362f2c47c initiated.]]></computeroutput></screen>
|
||
<para>Make sure instances are migrated
|
||
successfully with <command>nova
|
||
list</command>. If instances are still running
|
||
on HostB, check log files (src/dest
|
||
<systemitem class="service"
|
||
>nova-compute</systemitem> and <systemitem
|
||
class="service"
|
||
>nova-scheduler</systemitem>) to determine
|
||
why. <note>
|
||
<para>While the nova command is called
|
||
<command>live-migration</command>,
|
||
under the default Compute
|
||
configuration options the instances
|
||
are suspended before migration.</para>
|
||
<para>See <link
|
||
xlink:href="http://docs.openstack.org/havana/config-reference/content/configuring-openstack-compute-basics.html"
|
||
>Configure migrations</link> in
|
||
<citetitle>OpenStack Configuration
|
||
Reference</citetitle> for more
|
||
details.</para>
|
||
</note>
|
||
</para>
|
||
</step>
|
||
</procedure>
|
||
</section>
|
||
<section xml:id="section_nova-compute-node-down">
|
||
<title>Recover from a failed compute node</title>
|
||
<para>If you have deployed Compute with a shared file
|
||
system, you can quickly recover from a failed compute
|
||
node. Of the two methods covered in these sections,
|
||
the evacuate API is the preferred method even in the
|
||
absence of shared storage. The evacuate API provides
|
||
many benefits over manual recovery, such as
|
||
re-attachment of volumes and floating IPs.</para>
|
||
<xi:include href="../common/section_cli_nova_evacuate.xml"/>
|
||
<section xml:id="nova-compute-node-down-manual-recovery">
|
||
<title>Manual recovery</title>
|
||
<para>For KVM/libvirt compute node recovery, see the
|
||
previous section. Use this procedure for other
|
||
hypervisors.</para>
|
||
<procedure>
|
||
<title>To work with host information</title>
|
||
<step>
|
||
<para>Identify the vms on the affected hosts,
|
||
using tools such as a combination of
|
||
<literal>nova list</literal> and
|
||
<literal>nova show</literal> or
|
||
<literal>euca-describe-instances</literal>.
|
||
Here's an example using the EC2 API -
|
||
instance i-000015b9 that is running on
|
||
node np-rcc54:</para>
|
||
<programlisting>i-000015b9 at3-ui02 running nectarkey (376, np-rcc54) 0 m1.xxlarge 2012-06-19T00:48:11.000Z 115.146.93.60</programlisting>
|
||
</step>
|
||
<step>
|
||
<para>You can review the status of the host by
|
||
using the nova database. Some of the
|
||
important information is highlighted
|
||
below. This example converts an EC2 API
|
||
instance ID into an OpenStack ID - if you
|
||
used the <literal>nova</literal> commands,
|
||
you can substitute the ID directly. You
|
||
can find the credentials for your database
|
||
in
|
||
<filename>/etc/nova.conf</filename>.</para>
|
||
<programlisting>SELECT * FROM instances WHERE id = CONV('15b9', 16, 10) \G;
|
||
*************************** 1. row ***************************
|
||
created_at: 2012-06-19 00:48:11
|
||
updated_at: 2012-07-03 00:35:11
|
||
deleted_at: NULL
|
||
...
|
||
id: 5561
|
||
...
|
||
power_state: 5
|
||
vm_state: shutoff
|
||
...
|
||
hostname: at3-ui02
|
||
host: np-rcc54
|
||
...
|
||
uuid: 3f57699a-e773-4650-a443-b4b37eed5a06
|
||
...
|
||
task_state: NULL
|
||
...</programlisting>
|
||
</step>
|
||
</procedure>
|
||
<procedure>
|
||
<title>To recover the VM</title>
|
||
<step>
|
||
<para>Armed with the information of VMs on the
|
||
failed host, determine to which compute
|
||
host the affected VMs should move. Run the
|
||
following database command to move the VM
|
||
to np-rcc46:</para>
|
||
<programlisting>UPDATE instances SET host = 'np-rcc46' WHERE uuid = '3f57699a-e773-4650-a443-b4b37eed5a06'; </programlisting>
|
||
</step>
|
||
<step>
|
||
<para>Next, if using a hypervisor that relies
|
||
on libvirt (such as KVM) it is a good idea
|
||
to update the
|
||
<literal>libvirt.xml</literal> file
|
||
(found in
|
||
<literal>/var/lib/nova/instances/[instance
|
||
ID]</literal>). The important changes
|
||
to make are to change the
|
||
<literal>DHCPSERVER</literal> value to
|
||
the host ip address of the Compute host
|
||
that is the VMs new home, and update the
|
||
VNC IP if it isn't already
|
||
<literal>0.0.0.0</literal>.</para>
|
||
</step>
|
||
<step>
|
||
<para>Next, reboot the VM:</para>
|
||
<screen><prompt>$</prompt> <userinput>nova reboot --hard 3f57699a-e773-4650-a443-b4b37eed5a06</userinput></screen>
|
||
</step>
|
||
<step>
|
||
<para>In theory, the above database update and
|
||
<literal>nova reboot</literal> command
|
||
are all that is required to recover the
|
||
VMs from a failed host. However, if
|
||
further problems occur, consider looking
|
||
at recreating the network filter
|
||
configuration using
|
||
<literal>virsh</literal>, restarting
|
||
the Compute services or updating the
|
||
<literal>vm_state</literal> and
|
||
<literal>power_state</literal> in the
|
||
Compute database.</para>
|
||
</step>
|
||
</procedure>
|
||
</section>
|
||
</section>
|
||
<section xml:id="section_nova-uid-mismatch">
|
||
<title>Recover from a UID/GID mismatch</title>
|
||
<para>When running OpenStack compute, using a shared file
|
||
system or an automated configuration tool, you could
|
||
encounter a situation where some files on your compute
|
||
node are using the wrong UID or GID. This causes a
|
||
raft of errors, such as being unable to live migrate,
|
||
or start virtual machines.</para>
|
||
<para>This basic procedure runs on <systemitem
|
||
class="service">nova-compute</systemitem> hosts,
|
||
based on the KVM hypervisor, that could help to
|
||
restore the situation:</para>
|
||
<procedure>
|
||
<title>To recover from a UID/GID mismatch</title>
|
||
<step>
|
||
<para>Make sure you don't use numbers that are
|
||
already used for some other user/group.</para>
|
||
</step>
|
||
<step>
|
||
<para>Set the nova uid in
|
||
<filename>/etc/passwd</filename> to the
|
||
same number in all hosts (for example,
|
||
112).</para>
|
||
</step>
|
||
<step>
|
||
<para>Set the libvirt-qemu uid in
|
||
<filename>/etc/passwd</filename> to the
|
||
same number in all hosts (for example,
|
||
119).</para>
|
||
</step>
|
||
<step>
|
||
<para>Set the nova group in
|
||
<filename>/etc/group</filename> file to
|
||
the same number in all hosts (for example,
|
||
120).</para>
|
||
</step>
|
||
<step>
|
||
<para>Set the libvirtd group in
|
||
<filename>/etc/group</filename> file to
|
||
the same number in all hosts (for example,
|
||
119).</para>
|
||
</step>
|
||
<step>
|
||
<para>Stop the services on the compute
|
||
node.</para>
|
||
</step>
|
||
<step>
|
||
<para>Change all the files owned by user nova or
|
||
by group nova. For example:</para>
|
||
<programlisting language="bash">find / -uid 108 -exec chown nova {} \; # note the 108 here is the old nova uid before the change
|
||
find / -gid 120 -exec chgrp nova {} \;</programlisting>
|
||
</step>
|
||
<step>
|
||
<para>Repeat the steps for the libvirt-qemu owned
|
||
files if those were needed to change.</para>
|
||
</step>
|
||
<step>
|
||
<para>Restart the services.</para>
|
||
</step>
|
||
<step>
|
||
<para>Now you can run the <command>find</command>
|
||
command to verify that all files using the
|
||
correct identifiers.</para>
|
||
</step>
|
||
</procedure>
|
||
</section>
|
||
<section xml:id="section_nova-disaster-recovery-process">
|
||
<title>Compute disaster recovery process</title>
|
||
<para>In this section describes how to manage your cloud
|
||
after a disaster, and how to easily back up the
|
||
persistent storage volumes. Backups <emphasis
|
||
role="bold">are</emphasis> mandatory, even outside
|
||
of disaster scenarios.</para>
|
||
<para>For reference, you can find a DRP definition at
|
||
<link
|
||
xlink:href="http://en.wikipedia.org/wiki/Disaster_Recovery_Plan"
|
||
>http://en.wikipedia.org/wiki/Disaster_Recovery_Plan</link>.</para>
|
||
<simplesect>
|
||
<title>A- The disaster recovery process
|
||
presentation</title>
|
||
<para>A disaster could happen to several components of
|
||
your architecture: a disk crash, a network loss, a
|
||
power cut, and so on. In this example, assume the
|
||
following set up:</para>
|
||
<orderedlist>
|
||
<listitem>
|
||
<para>A cloud controller (nova-api,
|
||
nova-objecstore, nova-network)</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>A compute node (<systemitem
|
||
class="service"
|
||
>nova-compute</systemitem>)</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>A Storage Area Network used by
|
||
<systemitem class="service"
|
||
>cinder-volumes</systemitem> (aka
|
||
SAN)</para>
|
||
</listitem>
|
||
</orderedlist>
|
||
<para>The disaster example is the worst one: a power
|
||
loss. That power loss applies to the three
|
||
components. <emphasis role="italic">Let's see what
|
||
runs and how it runs before the
|
||
crash</emphasis>:</para>
|
||
<itemizedlist>
|
||
<listitem>
|
||
<para>From the SAN to the cloud controller, we
|
||
have an active iscsi session (used for the
|
||
"cinder-volumes" LVM's VG).</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>From the cloud controller to the compute
|
||
node we also have active iscsi sessions
|
||
(managed by <systemitem class="service"
|
||
>cinder-volume</systemitem>).</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>For every volume an iscsi session is
|
||
made (so 14 ebs volumes equals 14
|
||
sessions).</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>From the cloud controller to the compute
|
||
node, we also have iptables/ ebtables
|
||
rules which allows the access from the
|
||
cloud controller to the running
|
||
instance.</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>And at least, from the cloud controller
|
||
to the compute node ; saved into database,
|
||
the current state of the instances (in
|
||
that case "running" ), and their volumes
|
||
attachment (mount point, volume id, volume
|
||
status, and so on.)</para>
|
||
</listitem>
|
||
</itemizedlist>
|
||
<para>Now, after the power loss occurs and all
|
||
hardware components restart, the situation is as
|
||
follows:</para>
|
||
<itemizedlist>
|
||
<listitem>
|
||
<para>From the SAN to the cloud, the ISCSI
|
||
session no longer exists.</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>From the cloud controller to the compute
|
||
node, the ISCSI sessions no longer exist.
|
||
</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>From the cloud controller to the compute
|
||
node, the iptables and ebtables are
|
||
recreated, since, at boot, nova-network
|
||
reapply the configurations.</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>From the cloud controller, instances
|
||
turn into a shutdown state (because they
|
||
are no longer running)</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>Into the database, data was not updated
|
||
at all, since Compute could not have
|
||
guessed the crash.</para>
|
||
</listitem>
|
||
</itemizedlist>
|
||
<para>Before going further, and to prevent the admin
|
||
to make fatal mistakes,<emphasis role="bold"> the
|
||
instances won't be lost</emphasis>, because no
|
||
"<command role="italic">destroy</command>" or
|
||
"<command role="italic">terminate</command>"
|
||
command was invoked, so the files for the
|
||
instances remain on the compute node.</para>
|
||
<para>Perform these tasks in that exact order.</para>
|
||
<para><emphasis role="underline">Any extra step would
|
||
be dangerous at this stage</emphasis> :</para>
|
||
<para>
|
||
<orderedlist>
|
||
<listitem>
|
||
<para>Get the current relation from a
|
||
volume to its instance, so that you
|
||
can recreate the attachment.</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>Update the database to clean the
|
||
stalled state. (After that, you cannot
|
||
perform the first step).</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>Restart the instances. In other
|
||
words, go from a shutdown to running
|
||
state.</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>After the restart, you can reattach
|
||
the volumes to their respective
|
||
instances.</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>That step, which is not a mandatory
|
||
one, exists in an SSH into the
|
||
instances to reboot them.</para>
|
||
</listitem>
|
||
</orderedlist>
|
||
</para>
|
||
</simplesect>
|
||
<simplesect>
|
||
<title>B - Disaster recovery</title>
|
||
<procedure>
|
||
<title>To perform disaster recovery</title>
|
||
<step>
|
||
<title>Get the instance-to-volume
|
||
relationship</title>
|
||
<para>You must get the current relationship
|
||
from a volume to its instance, because we
|
||
re-create the attachment.</para>
|
||
<para>You can find this relationship by
|
||
running <command>nova
|
||
volume-list</command>. Note that nova
|
||
client includes the ability to get volume
|
||
information from cinder.</para>
|
||
</step>
|
||
<step>
|
||
<title>Update the database</title>
|
||
<para>Update the database to clean the stalled
|
||
state. You must restore for every volume,
|
||
uses these queries to clean up the
|
||
database:</para>
|
||
<screen><prompt>mysql></prompt> <userinput>use cinder;</userinput>
|
||
<prompt>mysql></prompt> <userinput>update volumes set mountpoint=NULL;</userinput>
|
||
<prompt>mysql></prompt> <userinput>update volumes set status="available" where status <>"error_deleting";</userinput>
|
||
<prompt>mysql></prompt> <userinput>update volumes set attach_status="detached";</userinput>
|
||
<prompt>mysql></prompt> <userinput>update volumes set instance_id=0;</userinput></screen>
|
||
<para>Then, when you run <command>nova
|
||
volume-list</command> commands, all
|
||
volumes appear.</para>
|
||
</step>
|
||
<step>
|
||
<title>Restart instances</title>
|
||
<para>You can restart the instances through a
|
||
simple <command>nova reboot
|
||
<replaceable>$instance</replaceable></command>
|
||
</para>
|
||
<para>At that stage, depending on your image,
|
||
some instances completely reboot and
|
||
become reachable, while others stop on the
|
||
"plymouth" stage.</para>
|
||
</step>
|
||
<step>
|
||
<title>DO NOT reboot a second time</title>
|
||
<para>Do not reboot the ones that are stopped
|
||
at that stage (<emphasis role="italic">see
|
||
the fourth step</emphasis>). In fact
|
||
it depends on whether you added an
|
||
<filename>/etc/fstab</filename> entry
|
||
for that volume. Images built with the
|
||
<package>cloud-init</package> package
|
||
remain in a pending state, while others
|
||
skip the missing volume and start. (More
|
||
information is available on <link
|
||
xlink:href="https://help.ubuntu.com/community/CloudInit"
|
||
>help.ubuntu.com</link>.) The idea of
|
||
that stage is only to ask nova to reboot
|
||
every instance, so the stored state is
|
||
preserved.</para>
|
||
</step>
|
||
<step>
|
||
<title>Reattach volumes</title>
|
||
<para>After the restart, you can reattach the
|
||
volumes to their respective instances. Now
|
||
that nova has restored the right status,
|
||
it is time to perform the attachments
|
||
through a <command>nova
|
||
volume-attach</command></para>
|
||
<para>This simple snippet uses the created
|
||
file:</para>
|
||
<programlisting language="bash">#!/bin/bash
|
||
|
||
while read line; do
|
||
volume=`echo $line | $CUT -f 1 -d " "`
|
||
instance=`echo $line | $CUT -f 2 -d " "`
|
||
mount_point=`echo $line | $CUT -f 3 -d " "`
|
||
echo "ATTACHING VOLUME FOR INSTANCE - $instance"
|
||
nova volume-attach $instance $volume $mount_point
|
||
sleep 2
|
||
done < $volumes_tmp_file</programlisting>
|
||
<para>At that stage, instances that were
|
||
pending on the boot sequence (<emphasis
|
||
role="italic">plymouth</emphasis>)
|
||
automatically continue their boot, and
|
||
restart normally, while the ones that
|
||
booted see the volume.</para>
|
||
</step>
|
||
<step>
|
||
<title>SSH into instances</title>
|
||
<para>If some services depend on the volume,
|
||
or if a volume has an entry into fstab, it
|
||
could be good to simply restart the
|
||
instance. This restart needs to be made
|
||
from the instance itself, not through
|
||
nova. So, we SSH into the instance and
|
||
perform a reboot:</para>
|
||
<screen><prompt>#</prompt> <userinput>shutdown -r now</userinput></screen>
|
||
</step>
|
||
</procedure>
|
||
<para>By completing this procedure, you can
|
||
successfully recover your cloud.</para>
|
||
<para>Follow these guidelines:</para>
|
||
<itemizedlist>
|
||
<listitem>
|
||
<para>Use the <parameter>
|
||
errors=remount</parameter> parameter
|
||
in the <filename>fstab</filename> file,
|
||
which prevents data corruption.</para>
|
||
<para>The system would lock any write to the
|
||
disk if it detects an I/O error. This
|
||
configuration option should be added into
|
||
the <systemitem class="service"
|
||
>cinder-volume</systemitem> server
|
||
(the one which performs the ISCSI
|
||
connection to the SAN), but also into the
|
||
instances' <filename>fstab</filename>
|
||
file.</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>Do not add the entry for the SAN's disks
|
||
to the <systemitem class="service"
|
||
>cinder-volume</systemitem>'s
|
||
<filename>fstab</filename>
|
||
file.</para>
|
||
<para>Some systems hang on that step, which
|
||
means you could lose access to your
|
||
cloud-controller. To re-run the session
|
||
manually, you would run the following
|
||
command before performing the mount:
|
||
<screen><prompt>#</prompt> <userinput>iscsiadm -m discovery -t st -p $SAN_IP $ iscsiadm -m node --target-name $IQN -p $SAN_IP -l</userinput></screen></para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>For your instances, if you have the
|
||
whole <filename>/home/</filename>
|
||
directory on the disk, instead of emptying
|
||
the <filename>/home</filename> directory
|
||
and map the disk on it, leave a user's
|
||
directory with the user's bash files and
|
||
the <filename>authorized_keys</filename>
|
||
file.</para>
|
||
<para>This enables you to connect to the
|
||
instance, even without the volume
|
||
attached, if you allow only connections
|
||
through public keys.</para>
|
||
</listitem>
|
||
</itemizedlist>
|
||
</simplesect>
|
||
<simplesect>
|
||
<title>C - Scripted DRP</title>
|
||
<procedure>
|
||
<title>To use scripted DRP</title>
|
||
<para>You can download from <link
|
||
xlink:href="https://github.com/Razique/BashStuff/blob/master/SYSTEMS/OpenStack/SCR_5006_V00_NUAC-OPENSTACK-DRP-OpenStack.sh"
|
||
>here</link> a bash script which performs
|
||
these steps:</para>
|
||
<step>
|
||
<para>The "test mode" allows you to perform
|
||
that whole sequence for only one
|
||
instance.</para>
|
||
</step>
|
||
<step>
|
||
<para>To reproduce the power loss, connect to
|
||
the compute node which runs that same
|
||
instance and close the iscsi session.
|
||
<emphasis role="underline">Do not
|
||
detach the volume through
|
||
<command>nova
|
||
volume-detach</command></emphasis>,
|
||
but instead manually close the iscsi
|
||
session.</para>
|
||
</step>
|
||
<step>
|
||
<para>In this example, the iscsi session is
|
||
number 15 for that instance:</para>
|
||
<screen><prompt>$</prompt> <userinput>iscsiadm -m session -u -r 15</userinput></screen>
|
||
</step>
|
||
<step>
|
||
<para>Do not forget the <literal>-r</literal>
|
||
flag. Otherwise, you close ALL
|
||
sessions.</para>
|
||
</step>
|
||
</procedure>
|
||
</simplesect>
|
||
</section>
|
||
</section>
|
||
<xi:include href="../common/section_support-compute.xml"/>
|
||
</chapter>
|